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