分布式数据库通过平衡数据可靠性和系统可用性来处理网络故障期间的一致性,通常依赖于预定义的一致性模型和复制策略。当网络分区发生时(节点无法通信),这些系统面临权衡:优先考虑立即一致性,阻止操作直到节点重新连接,或者允许临时不一致以维持可用性。该方法取决于数据库的设计目标和它所实现的一致性模型,例如强一致性、最终一致性或可调整的中间地带。
在优先考虑强一致性的系统中(如 Google Spanner 或 etcd),写入需要来自大多数节点的确认,使用诸如基于仲裁的复制或共识算法(例如,Raft)等机制。在网络故障期间,如果节点失去与大多数节点的联系,它将无法处理写入,从而确保不会发生冲突更新。例如,在使用 Raft 的 5 节点集群中,如果 3 个节点形成多数分区,则只有这 3 个节点可以接受写入。其余 2 个节点变为只读,直到网络恢复。这可以防止脑裂情况,但牺牲了缺乏多数分区的可用性。诸如领导者选举和心跳机制等工具可以检测故障并执行这些规则。
对于偏向可用性的数据库(如 Apache Cassandra 或 DynamoDB),最终一致性允许临时分歧。在分区期间,写入可以在拆分的双方进行,从而创建冲突版本。一旦连接恢复,冲突解决机制就会协调差异。例如,Cassandra 使用“后写优先”(基于时间戳)或应用程序定义的逻辑来合并数据。Amazon DynamoDB 使用向量时钟来跟踪版本历史,让应用程序手动解决冲突。一些系统还采用无冲突复制数据类型 (CRDT),它可以自动合并更新(例如,递增计数器)而无需手动干预。这些方法使系统在中断期间保持运行,但需要仔细处理恢复后的陈旧或冲突数据。