1.6. 跨站点的客户端连接
客户端可以在 Active/Passive 或 Active/Active 配置中写入 Data Grid 集群。
Active/Passive
下图演示了主动/被动,其中 Data Grid 只处理一个站点的客户端请求:
在前面的镜像中:
- 客户端连接到 LON 上的 Data Grid 集群。
- 客户端将 "k1" 写入缓存。
- LON、"n1" 的站点主设备发送请求,以将"k1"复制到位于 NYC、"nA"的站点 master。
通过主动/被动,NYC 提供数据冗余。如果 LON 的 Data Grid 集群因任何原因而离线,客户端就可以开始向 NYC 发送请求。当您使 LON 恢复在线时,您可以将数据与 NYC 同步,然后将客户端切回到 LON。
Active/Active
下图显示了在两个站点处理客户端请求的 Active/Active :
在前面的镜像中:
- 客户端 A 连接到 LON 上的 Data Grid 集群。
- 客户端 A 将 "k1" 写入缓存。
- 客户端 B 连接到位于 NYC 的 Data Grid 集群。
- 客户端 B 将"k2"写入缓存。
- LON 和 NYC 的站点 master 发送请求,以便"k1"复制到 NYC,"k2"复制到 LON。
通过 Active/Active NYC 和 LON 在处理客户端请求时将数据复制到远程缓存。如果 NYC 或 LON 离线,客户端可以开始向在线站点发送请求。然后,您可以使离线站点重新上线,将状态推送到同步数据,并根据需要切换客户端。
备份策略
使用 Active/Active 配置时,您应该始终使用异步备份策略(strategy=async)。
如果多个客户端尝试同时写入同一条目,并且备份策略是同步的(strategy=sync),则会出现死锁。但是,如果两个站点都访问不同的数据集,您可以使用同步备份策略,在这种情况下,不会出现并发写入的死锁风险。
1.6.1. 并发写和冲突条目 复制链接链接已复制到粘贴板!
如果客户端同时写入同一条目,但在不同的站点上,可能会发生冲突的条目,并带有 Active/Active 站点配置。
例如,当客户端 B 写入 NYC 中的 "k1" 时,客户端 A 写入 LON 中的 "k1"。在这种情况下,"k1" 在 LON 中与 NYC 中的值不同。在进行复制后,不能保证哪个站点存在"k1"的值。
为确保数据一致性,Data Grid 使用向量时钟算法在备份操作过程中检测冲突的条目,如下例所示:
向量时钟是与每个写入条目递增的时间戳元数据。在前面的示例中,0 代表 "k1" 上向量时钟的初始值。
客户端将 "k1=2" 置于 LON 中,向量时钟为 1,0,数据网格复制到 NYC。然后,客户端将 "k1=3" 置于 NYC 中,并将向量时钟更新为 1,1,后者的数据网格复制到 LON。
但是,如果客户端同时将"k1=5"置于 LON 中,则客户端会将 "k1=8" 置于 NYC 中,则数据网格检测到冲突条目,因为 "k1" 的向量值在 LON 和 NYC 之间不严格更大或更少。
当找到冲突的条目时,Data Grid 使用 Java compareTo (String anotherString) 方法来比较站点名称。要确定哪个键具有优先级,Data Grid 选择不适合其他的站点名称。名为 AAA 的站点的键优先于名为 AAB 的站点的密钥,以此类推。
在同一示例后,为了解决"k1"的冲突,Data Grid 使用源自 LON 的 "k1" 的值。这会在 Data Grid 解析冲突并复制值后,在 LON 和 NYC 中都生成 "k1=5"。
在站点名称前加上数字作为代表解析冲突条目的优先级顺序的简单方法;例如,1LON 和 2NYC。
Data Grid 仅对异步备份策略(strategy=async)执行冲突解析。但是,您不应该使用带有 Active/Active 配置的同步备份策略,因为并发写入会导致死锁。
冲突解析算法
除了 XSiteEntryMergePolicy SPI 外,Data Grid 提供了不同的算法来解决冲突,可让您实现自定义冲突解析策略。
除了使用字典比较的默认冲突解析策略外,您还可以使用 Data Grid 冲突解析算法来:
- 始终删除冲突的条目。
- 发生写/删除冲突时保留写操作。
- 当发生写/删除冲突时删除条目。
在 org.infinispan.xsite.spi.XSiteMergePolicy enum 中查找所有可用的算法及其描述。