第 7 章 配置 Data Grid 以处理网络分区
Data Grid 集群可以分成网络分区,其中节点子集相互隔离。这种情况会导致集群缓存的可用性或一致性丢失。Data Grid 会自动检测崩溃的节点,并解决冲突,以将缓存合并回一起。
7.1. 分割集群和网络分区
网络分区是运行环境中错误条件的结果,比如当网络路由器崩溃时。当集群划分为分区时,节点会创建一个 JGroups 集群视图,该视图仅包含该分区中的节点。这意味着一个分区中的节点可以独立于其他分区中的节点运行。
检测分割
为了自动检测网络分区,Data Grid 使用默认 JGroups 堆栈中的 FD_ALL
协议来确定节点是否立即离开集群。
Data Grid 无法检测导致节点立即离开的原因。这不仅当有网络故障,也可能会发生,例如当 Garbage Collection (GC)暂停 JVM 时。
Data Grid 怀疑节点在以下毫秒数后崩溃:
FD_ALL[2|3].timeout + FD_ALL[2|3].interval + VERIFY_SUSPECT[2].timeout + GMS.view_ack_collection_timeout
当它检测到集群被分成网络分区时,Data Grid 使用一个策略来处理缓存操作。根据您的应用程序要求,Data Grid 可以:
- 允许读和/或写操作以实现可用性
- 拒绝为一致性的读写操作
将分区合并在一起
要修复分割集群,Data Grid 会将分区合并回一起。在合并过程中,Data Grid 将 .equals ()
方法用于缓存条目的值,以确定是否存在任何冲突。要解决它在分区上发现的副本之间的任何冲突,Data Grid 使用您可以配置的合并策略。
7.1.1. 分割集群中的数据一致性
无论任何处理策略或合并策略是什么,导致 Data Grid 集群被分成分区的网络中断或错误都可能会导致数据丢失或一致性问题。
在分割和检测之间
如果写入操作发生在分割时位于次要分区的节点上,且在 Data Grid 检测到分割前,当 Data Grid 在合并过程中向这个次要分区传输状态时,该值将会丢失。
如果所有分区都处于 DEGRADED
模式,该值不会丢失,因为没有发生状态传输,但条目可能具有不一致的值。对于在分割发生时正在进行的事务缓存写操作,可以在某些节点上提交并回滚其他节点上,这也会导致值不一致。
在分割和 Data Grid 检测到它的时间里,可以在尚未进入 DEGRADED
模式的次要分区中获取过时的缓存读取。
在合并过程中
当 Data Grid 开始删除分区节点,通过一系列合并事件重新连接到集群。在此合并过程完成前,有可能在某些节点上成功对事务缓存写操作,但不能在更新条目前生成过时的读取。