第十六章 多主复制与读写分离

第一节 使用 BDR(Bi-Directional Replication)

目标:了解多主复制的概念及其解决的业务问题,并介绍 PostgreSQL 生态中最成熟的多主复制解决方案——BDR (Bi-Directional Replication)。

在标准的读写分离架构中,我们有一个主节点(Primary)处理所有写操作,以及多个只读副本(Replicas)处理读操作。这种架构极大地提升了读性能,但写操作的压力仍然集中在单个主节点上,并且如果主节点宕机,需要一定时间进行故障转移,期间写服务会中断。

多主复制(Multi-Master Replication)则允许集群中的多个节点都接受写操作。在一个节点上发生的写入,会自动地、异步地复制到其他所有节点。


多主复制的优势和挑战

优势:

  1. 写可用性(Write Availability):任何一个节点宕机,其他节点仍然可以接受写请求,实现了写操作的高可用。
  2. 地理分布(Geo-Distribution):可以在全球不同地理位置部署节点,用户可以连接到最近的节点进行读写,极大地降低了网络延迟。
  3. 写入扩展(Write Scalability):理论上可以将写负载分散到多个节点上。

核心挑战:冲突解决(Conflict Resolution) 由于写入可以在任何节点上发生,就不可避免地会出现写冲突。例如,在纽约的节点上,用户 A 将一行数据的 status 改为 'completed',几乎在同一时间,在伦敦的节点上,用户 B 将同一行数据的 status 改为 'cancelled'。当这两个变更相遇时,系统必须决定哪个变更是最终有效的。这就是多主复制最核心、最复杂的难题。


BDR (Bi-Directional Replication) 简介

BDR 是由 2ndQuadrant(现在是 EDB 的一部分)开发的、针对 PostgreSQL 的最成熟、功能最丰富的多主复制解决方案。它是一个商业产品,但也提供了部分开源组件。

BDR 通过异步的逻辑复制来实现,并提供了一套复杂的机制来自动或手动地解决写冲突。

BDR 的关键特性:

  • AlwaysOn 高可用:提供超过 99.999% 的可用性,任何节点故障都不会导致服务中断。
  • 地理分布性能:支持在全球范围内部署节点,并提供地理感知的连接路由。
  • 灵活的冲突解决:内置了“最后更新者获胜”(Last Update Wins)等自动冲突解决方法,并允许用户自定义复杂的解决逻辑。
  • 滚动升级:可以在不中断服务的情况下,对集群进行 PostgreSQL 版本或操作系统版本的滚动升级。

BDR 的工作原理

BDR 基于 PostgreSQL 内置的**逻辑解码(Logical Decoding)**功能。

  1. 当一个写事务在某个节点上提交时,其变更(INSERT, UPDATE, DELETE)会被 BDR 捕获。
  2. BDR 将这些变更转换成一种逻辑表示,并通过网络发送给集群中的其他节点。
  3. 其他节点接收到这些变更后,将其重新应用(Replay)到自己的数据库中。
  4. 如果在应用变更时检测到冲突(例如,要 UPDATE 的行已经被本地修改过),BDR 的冲突解决机制就会被触发。

冲突检测与 CRDTs BDR 的一个高级特性是支持 CRDTs (Conflict-Free Replicated Data Types)。这是一种特殊的数据类型(如 crdt_counter),它在数学上保证了即使在并发写入的情况下,最终所有节点的状态也总能收敛到一致,从而“无冲突”地解决了冲突。


BDR 的适用场景

BDR 并非万能药,它适用于对写可用性地理分布有极致要求的特定场景。

典型场景:全球分布的 SaaS 应用

  • 一个 SaaS 应用在全球(如北美、欧洲、亚洲)都有大量用户。
  • 在每个大区部署一个或多个 BDR 节点。
  • 用户会被自动路由到延迟最低的本地节点进行读写操作。
  • 一个大区的服务中断(如网络故障、机房断电)完全不影响其他大区的用户。

不适用的场景:

  • 通用写入扩展:如果你的应用只是需要扩展写入吞吐量,但大部分业务逻辑都集中在一个数据中心,那么像 Citus 这样的分片方案通常是更好、更简单的选择。BDR 的冲突处理开销和复杂性,使得它不适合作为纯粹的写入性能扩展工具。

📌 小结

  • 多主复制通过允许在多个节点上进行写操作,解决了单主架构的写可用性地理延迟问题。
  • 其核心挑战在于写冲突的检测与解决
  • BDR 是 PostgreSQL 生态中最强大的多主复制解决方案,它提供了 AlwaysOn 可用性、灵活的冲突解决机制和滚动升级等企业级特性。
  • BDR 主要适用于对可用性要求极高、需要进行全球地理分布部署的关键业务系统。对于通用的扩展需求,分片方案(Citus)通常更合适。

在下一节,我们将对比 BDR 所使用的逻辑复制与 PostgreSQL 内置的物理复制,以更深入地理解它们之间的差异。