分布式数据库通过在地理位置上分离的节点之间同步数据来处理跨数据中心复制,同时平衡一致性、可用性和延迟。这通常涉及三个关键机制:复制策略、冲突解决和网络故障处理。目标是确保即使数据中心离线或出现延迟,数据仍然可以访问且一致。
首先,复制策略确定如何复制数据。 同步复制 需要所有副本在确认成功写入之前进行确认,从而确保强一致性,但会引入更高的延迟(例如,Google Spanner 使用同步时钟来实现全局一致性)。 异步复制 允许写入在后台传播,优先考虑速度,但存在临时不一致的风险(例如,Amazon DynamoDB Global Tables)。许多系统使用混合方法,例如 基于仲裁的复制,其中大多数节点必须确认写入(例如,Apache Cassandra 的可调一致性级别)。例如,开发人员可能会配置 5 个节点中的 3 个节点的仲裁,以平衡速度和可靠性。
其次,当跨数据中心发生并发更新时,冲突解决至关重要。 技术包括 版本向量 (跟踪更新时间戳)、 后写入获胜 (使用时钟解决冲突)或应用程序定义的逻辑(例如,用于可合并数据类型的 CRDT)。例如,Redis 使用无冲突复制数据类型 (CRDT) 来处理计数器或集合冲突,而无需手动干预。 某些数据库(如 CockroachDB)使用 混合逻辑时钟 来全局排序事件,即使系统时钟漂移。
最后,处理网络分区或中断需要权衡。 系统通常在中断期间优先考虑可用性(CAP 定理中的 AP),允许写入在本地继续进行,并在稍后进行协调。 例如,Cassandra 的 暗示移交 会在副本无法访问时在本地存储更新,并在连接恢复后转发它们。 其他人使用 多领导者拓扑 (例如,使用逻辑复制的 PostgreSQL)来让任何数据中心接受写入,尽管这增加了复杂性。 诸如 健康检查 之类的监视工具和自动故障转移(例如,etcd 的领导者选举)有助于在中断期间保持稳定性。 开发人员必须根据应用程序对过时数据与延迟的容忍度来配置超时、重试和一致性级别。