当写入数据时,在复制过程中,数据传递是在缓存中进行的,这样做的好处是提升了性能,问题是当出现控制器节点异常宕机事件时,就会导致缓存内的数据不能写入存储中,从而造成数据的不一致,这时有没有保障单个存储数据一致性的措施? 此外,两个站点的存储之间的数据一致性,从缓存层、底层数据层又是如何保障的?
目前,主流存储厂商都能实现存储2-4个控制器,且每个控制器都有内置锂电池的的,内置电池能够确保异常电源故障的时候或异常宕机时,缓存数据能够写入后端存储磁盘中。不同数据中心的双活存储,只要保证写I/O能够写入两个存储设备的缓存即可,主机服务器一定是要等到写操作在两端都顺利完成后才会认为写I/O这个动作完成,缓存数据一致了,存储端lun数据也就一致了,所以一致性是完全可以得到保障的。
收起双活容灾场景下,两个站点都能同时进行读写业务,如果应用在同一个时间点对卷同一个位置进行读写,存储层需要保证在该场景下两个站点的数据是一致的。
华为双活方案通过优化后的乐观锁机制,先预判没有锁冲突,直接发起对端阵列的写请求,数据发送到对端阵列后再加锁。而当主机对同一存储地址的数据并发访问时,也可将并发访问请求转为串行排队处理,保证两个站点数据一致性。相比传统锁机制,不需要跨站点的锁服务器,降低架构复杂度,同时在不出现冲突情况下直接进行双写操作,避免向锁服务器(甚至是对端站点的锁服务器)进行交互,提高了性能,保证跨中心的双活存储数据一致性。
当提供双活LUN的两套阵列之间的链路故障时,阵列已经无法实时镜像同步,此时只能由其中一套阵列继续提供服务。为了保证数据一致性,华为HyperMetro通过仲裁机制决定由哪套存储继续提供服务。
HyperMetro支持按双活Pair或双活一致性组为单位进行仲裁。当多个双活Pair提供的业务相互依赖时,用户需要把这些双活Pair配置为一个双活一致性组。仲裁完成后,一个双活一致性组只会在其中一套存储阵列继续提供服务。例如,Oracle数据库的数据文件、日志文件可能分别存放在不同的LUN上,访问Oracle数据库的应用系统存放在另一些LUN上,相互之间存在依赖关系。配置双活时,建议数据LUN、日志LUN和应用LUN分别配置双活pair,并且加入同一个一致性组。
HyperMetro提供了两种仲裁模式:
静态优先级模式
仲裁服务器模式
配置双活Pair前,需要配置双活域,双活域为逻辑概念,包括需要创建双活关系的两套存储阵列和仲裁服务器。每个双活Pair创建时均要选择双活域,每个双活域只能同时应用一种仲裁模式。
仲裁服务器模式比静态优级模式具备更高的可靠性,可保证在各种单点故障场景下,业务连续运行。因此,华为双活方案推荐采用仲裁服务器模式。
收起