分布式关系型数据库旨在跨多个服务器或节点存储和管理数据,同时保留结构化 schema 和 SQL 支持等关系型数据库特性。主要特点包括数据分布、水平扩展性以及确保一致性和可用性的机制。这些系统旨在将传统关系型数据库的优势与分布式系统的灵活性结合起来,解决大规模数据处理和高可用性等挑战。
首先,分布式关系型数据库通过分片等技术将数据划分到多个节点上。分片基于一个键(例如用户 ID 或地理区域)将表分割成更小的块,并将它们分发到不同的节点。例如,一个用户表可以被分割,使得欧洲的用户存储在一个节点上,而亚洲的用户存储在另一个节点上。这允许并行处理查询,从而提高性能。复制是另一个关键方面:数据副本存储在多个节点上以确保冗余。像 CockroachDB 或 Google Spanner 这样的系统使用复制来维持可用性,即使某些节点发生故障。然而,平衡副本之间的一致性需要 Raft 或 Paxos 等协议来同步更新。
其次,这些数据库支持水平扩展性,通过增加更多节点而非升级单个服务器来处理增加的工作负载。传统的数据库通常通过垂直扩展(例如增加 CPU/RAM)达到性能极限,而分布式系统可以通过分配负载来扩展。例如,Amazon Aurora 允许读取副本分担主节点上的查询流量。查询执行通过分布式查询规划器在节点间进行优化,这些规划器将 SQL 查询分解为在相关分片上并行运行的任务。像 Citus(PostgreSQL 扩展)这样的工具使这一过程自动化,允许开发人员使用熟悉的 SQL 语法,而系统负责处理分布细节。
最后,分布式关系型数据库优先考虑高可用性和容错性。它们通过自动故障转移机制和分布式事务管理来实现这一点。如果一个节点发生故障,系统会将请求重定向到副本,无需人工干预。事务使用两阶段提交 (2PC) 等协议进行管理,以确保跨节点操作的原子性。例如,一个在分片之间更新余额的银行应用会使用 2PC 来确保所有节点提交更改或回滚。然而,这可能会引入延迟,因此一些系统提供可调一致性——允许开发人员在强一致性(例如立即数据准确性)或最终一致性(例如写入更快但临时不一致)之间进行选择。这些特性使得分布式关系型数据库适用于需要可扩展性和可靠性的应用,例如电子商务平台或全球金融系统。