24.3.7. Infinispan 分区处理

Infinispan 集群构建自存储数据的多个节点。为防止在多个节点失败时数据丢失,Infinispan 会在多个节点上复制相同的数据。这种级别的数据冗余使用 owners 属性来配置。只要少于配置的节点数同时崩溃,Infinispan 将具有可用数据的副本。

但是,当集群中太多节点消失时,可能会发生一些灾难性情况:

脑裂

这会将集群分成两个或者多个分区(独立运行)的子集群。在这些情况下,多个客户端从不同分区进行读写时看到同一缓存条目的不同版本,在许多应用程序中存在问题。

注意

有办法减少脑裂发生的可能性,如冗余网络或 IP 绑定 ;但是,这只缩短了问题的发生时间。

多个节点按顺序崩溃
如果多个节点(特别是所有者数量)崩溃,且 Infinispan 没有时间正确地在崩溃间重新平衡其状态,则结果为部分数据丢失。

目标是避免因为脑裂或多个节点快速崩溃而导致数据返回给用户的情况。

24.3.7.1. split Brain

在脑裂情况下,每个网络分区都会安装自己的 JGroups 视图,从其他分区中删除节点。我们无法直接确定集群是否已分割为两个或者多个分区,因为这些分区相互不知道。相反,我们假设群集会在 JGroups 群集中的一个或多个节点消失而未发送显式离开消息时进行拆分。

禁用分区处理后,每个这样的分区将继续作为独立集群运行。每个分区可能只看到数据的某一部分,每个分区可能会在缓存中写入冲突的更新。

启用分区处理时,如果检测到分割,每个分区不会立即启动重新平衡,而是首先检查它是否应该进入降级模式:

  • 如果至少有一个部分丢失了其所有所有者,这意味着自上一次重新平衡结束以来,至少指定的所有者数量已经保留,则分区将进入降级模式。
  • 如果分区没有在最新的稳定拓扑中包含简单大多数节点 (floor(numNodes/2)+ 1),则分区也会进入降级模式。
  • 否则,分区会保持正常运行,并启动重新平衡。

每次重新平衡操作结束时都会更新稳定拓扑,协调者决定不需要再进行重新平衡。这些规则可确保,最多一个分区保持可用模式,其他分区进入降级模式。

当分区处于降级模式时,它只允许访问完全拥有的密钥:

  • 此分区的节点上具有所有副本的条目的请求(读取和写入)将被满足。
  • 对部分或完全归已消失的节点拥有的条目的请求将通过 AvailabilityException 拒绝。

这可保证分区无法为同一密钥写入不同的值(缓存是一致的),并且一个分区无法读取已在其他分区中更新的密钥(无过时数据)。

注意

两个分区可以启动隔离,只要它们不合并,就可以读取和写入不一致的数据。在未来,我们可能允许自定义可用性策略(例如,检查某个节点是否属于群集,或检查是否可以访问外部计算机)来应对这种情况。