双写原理,数据落盘的全过程 是什么样的一个流程??
如何保证cache一致性,【这个一致了,两边存储数据就一致了】?? 欢迎大神指点迷津。
讲起来比较复杂,试着说一下,看看能不能讲清楚。
分布式缓存一致性,是 VPLEX 的核心技术,也是 VPLEX 实现双活的主要技术基础。分布式是指缓存的管理是跨控制器的,一致性是指所有控制的缓存是全局的,互相能感知对方状态。
VPlex 实现分布式缓存一致性的关键组件是缓存一致性目录,该目录记录着 cache 里的所有数据的归属信息,比如数据块 37 属于哪个控制器,该目录状态会实时更新且 share 给所有控制器,对于 VPLEX Metro 方案,缓存一致性目录可以跨 VPLEX 集群扩展,以提供实现跨站点的缓存一致性。
下面用读写 I/O 的流程来简单描述一下如何实现的。
对于读请求来讲:
读 I/O 从某个控制器的前端口进来,先查看该控制器本地 cache 是否命中,如果命中,直接返回,如果没有命中,则去查找缓存一致性目录,看看别的控制器缓存里是否有要访问的数据,如果有,则从对应的控制器 Cache 中将其读取到本地 Cache ,再返回给主机;如也没有命中,则从本地后端的存储中读到本地 Local 中,修改缓存一致性目录的状态,然后返回给主机。
在双活状态下,虽然缓存一致性目录是跨 VPLEX 集群的,但对于读操作来讲,如果在本地集群缓存没命中,就直接去后端存储读数了,不会去远端的 VPLEX 缓存中读数据,因为机制认为链路的延时要大于本地存储的延时。
对于写请求来讲:
写 I/O 从某个控制器的前端口进来,先找本地 cache 中有没有对应的旧数据,有的话先把它废除,同理,根据缓存一致性目录查找别的控制器缓存中是否有旧数据,有的话也要废除,然后新数据写入本地缓存,并且透写到后端存储中,存储返回确认。
与此同时,另外一个 vplex 集群也会执行相应的操作,将旧数据废除,然后写入新数据,同时新数据透写到后端存储,返回确认给 vplex 。
Vplex 在收到两边存储返回的确认后,认为该写操作成功,给主机返回写入确认。
这一系列的步骤说起来比较繁琐,实际情况下几乎都是同时瞬间完成的,所以不用担心对性能的影响。通过这种机制,可以保证不论是本地主机访问本地 vplex ,还是异地主机访问异地 vplex ,看到的数据是完全一致性的,这个也是双活的技术基础。
不过分布式缓存一致性是 vplex 内部机制,可以了解一下原理,实际运维中不用担心数据一致性的问题,这是 VPLEX 内在机制保证的。
VPLEX现在主要就local和Metro两种方案了,Geo方案本身也少,也由其他方案替代了,不知道你是不是想了解的是VPLEX Metro 的分布式缓存的原理。
VPLEX Metro在物理上是两个站点,逻辑上两个集群,而且VPLEX只有读cache,没有写cache,这也是VPLEX保持强一致性的关键。数据落盘的过程中是数据写动作分为两个路线,一个写到本地VPLEX集群的本地存储,一个同步到异地站点的VPLEX集群,并写到异地存储中,只有两个落盘动作都完成后,写到VPLEX的动作才结束。