关系型数据库通过分片和复制等技术处理分布式存储,这些技术有助于跨多个服务器扩展数据,同时保持 ACID 属性。分片根据键(如用户 ID 或地理区域)将数据水平拆分(按行)到不同的节点。例如,一个客户数据库可能将 ID 为 1-1000 的用户存储在服务器 A 上,将 1001-2000 存储在服务器 B 上。复制在多个节点上创建数据的副本,以实现冗余和读取可扩展性——就像主节点处理写入,副本服务于读取查询。PostgreSQL 的逻辑复制或 MySQL 的组复制等工具可以自动化此过程,确保节点之间的数据一致性。
分布式关系型数据库在维护一致性和处理跨多个节点的事务时面临挑战。为了解决这个问题,系统使用两阶段提交 (2PC) 等协议来协调跨分片的事务。例如,如果一个事务更新了两个分片上的数据,协调器节点会确保两者要么都提交,要么都回滚。然而,这会引入延迟和复杂性。一些数据库,如 Google Spanner,使用同步时钟和 TrueTime API 来实现全局一致的读取和写入,而无需完全锁定。其他数据库,如 CockroachDB,采用分布式 SQL 层,可以智能地路由查询并自动管理数据放置,从而减少开发人员的开销。
现代分布式关系型系统通常将分片和复制与额外的优化相结合。例如,Amazon Aurora 将存储和计算分离,使用一个跨可用区复制数据的分布式存储层。这允许计算节点独立扩展,同时保持持久性。基于查询模式选择分区策略,如基于范围或基于哈希的分片。哈希分片均匀地分配数据,但使范围查询复杂化,而范围分片对相关数据(例如,按日期的时间序列日志)进行分组,以进行高效扫描。开发人员还必须处理边缘情况,例如当一个节点过载时重新分片,这需要在线模式更改或数据重新平衡的工具,而不会造成停机。