分布式数据库通过在可用性和一致性之间进行权衡来处理网络分区和数据一致性,这受 CAP 定理的指导。CAP 定理指出,在网络分区期间(将节点隔离的网络分割),系统可以优先考虑一致性(所有节点看到相同的数据)或可用性(节点保持响应),但不能同时优先考虑两者。为了管理这一点,数据库实现了诸如复制协议、基于仲裁的写入和冲突解决机制等策略。例如,系统可以使用多数仲裁,其中写入需要超过一半节点的确认,以确保在分区期间的一致性,即使某些节点无法访问。这种方法降低了数据发散的风险,但如果无法访问仲裁,可能会暂时限制可用性。
为了保持数据一致性,分布式数据库使用一致性模型,例如强一致性、最终一致性或可调一致性。强一致性保证所有读取都返回最新的写入,这通常通过同步复制和诸如 Raft 或 Paxos 之类的协议来实现共识。但是,这可能会增加分区期间的延迟。最终一致性允许暂时的不一致,但确保一旦分区解决,所有节点都收敛到相同的状态。可调一致性让开发人员可以为每个操作选择级别。例如,Apache Cassandra 允许配置读/写一致性级别(例如,要求来自特定数量节点的确认)。冲突解决工具(例如版本向量或应用程序定义的逻辑)有助于在分区后协调冲突的更新。Amazon DynamoDB 默认使用“最后写入获胜”,但支持有条件的写入以进行自定义冲突处理。
实际系统会根据用例平衡这些权衡。例如,金融系统通常优先考虑一致性,在分区期间使用同步复制并牺牲可用性。社交媒体平台可能会偏向可用性,接受最终一致性以保持服务运行。Riak 等工具采用向量时钟来跟踪数据版本历史记录,从而实现自动或手动冲突解决。此外,现代数据库利用混合方法:Google Spanner 将强一致性与全局原子时钟相结合,以最大程度地减少分区的影响,而 CockroachDB 使用混合逻辑时钟和分布式事务。开发人员必须了解这些机制才能有效地配置系统,从而确保其应用程序的可靠性和性能需求的正确平衡。