1.7. 站点间的客户端连接
客户端可以在 Active/Passive 或 Active/Active 配置中写入 Data Grid 集群。
Active/Passive
下图演示了,Data Grid 只处理来自一个站点的客户端请求:
在前面的镜像中:
- 客户端连接到 LON 的 Data Grid 集群。
- 客户端将 "k1" 写入缓存。
- LON "n1" 的中继节点将"k1""发送到位于 NYC, "nA" 的中继节点。
使用主动/被动时,NYC 提供数据冗余。如果 LON 的 Data Grid 集群因为某种原因离线,客户端就可以开始向 NYC 发送请求。当您重新上线 LON 时,您可以将数据与 NYC 同步,然后将客户端切回到 LON。
Active/Active
下图演示了 Active/Active,其中 Data Grid 在两个站点处理客户端请求:
在前面的镜像中:
- 客户端 A 连接到 LON 的 Data Grid 集群。
- 客户端 A 将 "k1" 写入缓存。
- 客户端 B 连接到位于 NYC 的 Data Grid 集群。
- 客户端 B 将 "k2" 写入缓存。
- LON 和 NYC 转发节点发送请求,使 "k1" 复制到 NYC,"k2" 复制到 LON。
使用 Active/Active 时 NYC 和 LON 将数据复制到远程缓存,同时处理客户端请求。如果 NYC 或 LON 离线,客户端就可以开始向在线站点发送请求。然后,您可以使离线站点重新在线、推送状态以同步数据,并根据需要切换客户端。
备份策略和客户端连接
建议在 Active/Active 配置中使用异步备份策略(policy=async
)。
如果多个客户端尝试同时写入同一条目,并且备份策略是同步的(strategy=sync
),则会出现死锁。但是,如果两个站点都访问不同的数据集,则可以使用带有 Active/Passive 配置的同步备份策略,在这种情况下,并发写入的死锁不会有风险。
1.7.1. 并发写入和冲突条目
如果客户端同时写入同一条目,但在不同站点上写入同一条目,则 Active/Active 站点配置可能会发生冲突条目。
例如,当客户端 B 写入 NYC 中的 "k1" 时,客户端 A 会同时写入 "k1" in LON。在这种情况下,"k1" 在 LON 中具有不同的值,而不是在 NYC 中。发生复制后,不能保证存在 "k1" 的哪个值。
为确保数据一致性,Data Grid 使用向量时钟算法在备份操作过程中检测冲突条目,如下例所示:
LON NYC k1=(n/a) 0,0 0,0 k1=2 1,0 --> 1,0 k1=2 k1=3 1,1 <-- 1,1 k1=3 k1=5 2,1 1,2 k1=8 --> 2,1 (conflict) (conflict) 1,2 <--
向量时钟是每次写入条目时递增的时间戳元数据。在上例中,0 代表 "k1" 上向量时钟的初始值。
客户端将"k1=2"放在 LON 中,向量时钟为 1,0
,其数据仓库将其复制到 NYC。然后,客户端会将"k1=3"放在 NYC 中,将向量时钟更新放在 1,1
,后者的数据仓库复制到 LON。
但是,如果客户端同时将 "k1=5" 放置到 LON 中,客户端会在 NYC 中放置 "k1=8",因为"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 配置一起使用。在这个配置并发写入中,会导致死锁并丢失数据。但是,如果两个站点都访问不同的数据集,则可以使用带有 Active/Active 配置的同步备份策略,在这种情况下,并发写入的死锁不会有风险。
跨站点合并策略
除了将 Data Grid 配置为执行以下操作的跨站点合并策略外,数据中心还提供 XSiteEntryMergePolicy
SPI:
- 始终删除冲突条目。
- 在进行 write/remove 冲突时应用写入操作。
- 当发生 write/remove 冲突时删除条目。