分布式数据库通过冗余、共识协议和自动恢复机制来处理故障。由于数据分布在多个节点或数据中心,因此该系统被设计为即使在单个组件发生故障时也能继续运行。关键策略包括复制数据、确保节点在中断期间达成一致,以及在发生故障后恢复一致性。这些方法优先考虑可用性和持久性,同时最大限度地减少停机时间和数据丢失。
一种核心方法是数据复制。像 Apache Cassandra 或 Amazon DynamoDB 这样的分布式数据库在多个节点上存储数据的副本。如果某个节点发生故障,请求将被重定向到副本,从而确保持续访问。例如,Cassandra 使用可调一致性模型:写入操作一旦被大多数副本确认就可以成功,从而允许系统容忍临时的节点中断。类似地,领导者-追随者架构(在 MongoDB 副本集中使用)会在主节点发生故障时自动将健康的追随者提升为领导者。这种冗余确保即使在硬件故障或网络分区期间,数据库仍然可以进行读写操作。
像 Raft 或 Paxos 这样的共识协议有助于节点在发生故障期间就系统的状态达成一致。例如,etcd 使用 Raft 协议在当前领导者无响应时选举一个新的领导者,从而确保持续的写入操作。这些协议还通过要求法定数量的节点验证决策来防止脑裂情况(其中两个节点充当领导者)。此外,分布式数据库采用心跳机制来快速检测节点故障。如果某个节点停止响应,系统会将其标记为离线并重新路由流量。一些数据库,如 Google Spanner,将这些技术与同步时钟相结合,即使在区域中断期间也能保持全局一致性。
在故障解决后,数据库必须恢复丢失的数据并同步节点。预写日志(WAL)是常用的:每个更改在应用之前都会被记录下来,因此发生故障的节点可以重播日志来追赶进度。例如,PostgreSQL 使用 WAL 在崩溃后恢复数据。在最终一致性模型中,版本向量或无冲突复制数据类型(CRDT)可以解决差异。Amazon Dynamo 采用向量时钟来跟踪数据版本,允许应用程序以逻辑方式合并冲突的更新。自动修复过程,例如 Cassandra 的反熵修复,比较副本之间的数据并修复不一致之处。通过结合这些方法,分布式数据库确保数据完整性并最大限度地减少故障期间的人工干预。