从0到1,PostgreSQL复制的不同策略详解( 四 )

  • 同步复制:在提交每个同步复制事务之前 , 主服务器会等待备用服务器以确认它们已获取数据 。这种配置的好处是不会因为并行写入进程而导致任何冲突 。
  • 同步多主复制:这种情况下 , 每个服务器都可以接受写入请求 , 并且在每个事务提交之前 , 修改后的数据从原始服务器传输到每个其他服务器 。它利用 2PC 协议并遵守全有或全无规则 。
  • WAL 流协议详细信息WAL接收器的进程运行在备用服务器上 , 利用recovery.conf中提供的primary_conninfo参数中的连接详细信息 , 通过TCP/IP连接到主服务器 。
    【从0到1,PostgreSQL复制的不同策略详解】开始流式复制时 , 前端可以在启动消息中发送复制参数 。值为true、yes、1或ON的布尔值让后端知道它需要进入物理复制walsender模式 。
    WAL发送器是在主服务器上运行的另一个进程 , 负责在生成WAL记录时将其发送到备用服务器 。WAL接收器将WAL记录保存在WAL中 , 就像本地的客户端连接一样 。
    一旦WAL记录到达WAL段文件 , 备用服务器就不断地重放WAL , 以使主服务器和备用服务器保持最新同步状态 。
    PostgreSQL 复制的要素接下来我们将更深入地了解 PostgreSQL 复制的常用模型(单主复制和多主复制)、类型(物理复制和逻辑复制)以及模式(同步和异步) 。
    PostgreSQL 数据库复制模型可扩展性是指向现有节点添加更多资源/硬件 , 以增强数据库存储和处理更多数据的能力 , 可以进行水平和垂直扩展 。PostgreSQL 复制是水平可伸缩性的一个例子 , 它比垂直可伸缩性更难实现 。主要通过单主复制(SMR)和多主复制(MMR)来实现水平扩展 。
    单主复制仅允许在单个节点上修改数据 , 并将这些修改复制到一个或多个节点 。副本数据库中的复制表不允许接受任何更改 , 但来自主服务器的更改除外 。
    大多数时候 , SMR 足以满足应用程序的需求 , 因为它的配置和管理不那么复杂 , 而且不会发生冲突 。单主复制也是单向的 , 因为复制数据主要在一个方向上流动 , 从主数据库到副本数据库 。
    在某些情况下 , 单靠 SMR 可能不够 , 你可能需要实施 MMR 。MMR 允许多个节点充当主节点 。对多个指定主数据库中表行的更改将复制到每个其他主数据库中的对应表 。在这个模型中 , 经常采用冲突解决方案来避免重复主键等问题 。
    使用 MMR 有几个优点 , 即:
    • 在主机故障的情况下 , 其他主机仍然可以提供更新和插入服务 。
    • 主节点分布在几个不同的位置 , 因此所有主节点发生故障的可能性很小 。
    • 能够使用主数据库的广域网 (WAN) , 这些主数据库在地理位置上可以靠近客户端组 , 同时保持网络中的数据一致性 。
    然而 , 实施 MMR 的缺点是复杂性和冲突难以解决 。
    一些机构和应用程序提供 MMR 解决方案 , 因为 PostgreSQL 本身并不支持 。这些解决方案可能是开源的、免费的或付费的 。如双向复制 (BDR) , 它是异步的并且基于 PostgreSQL 逻辑解码功能 。
    由于 BDR 应用程序在其他节点上重放事务 , 如果正在应用的事务与在接收节点上提交的事务之间存在冲突 , 重放操作可能会失败 。
    PostgreSQL 复制的类型PostgreSQL 复制有两种类型:逻辑复制和物理复制 。
    一个简单的 initdb 逻辑操作 , 将会执行为集群创建基准目录的物理操作 。同样 , 一个简单的逻辑操作(CREATE DATABASE)将执行为在基准目录中创建子目录的物理操作 。
    物理复制通常处理文件和目录 。它不知道这些文件和目录代表什么 。物理复制方法用于在另一台机器上维护单个集群的完整数据副本 , 并且在文件系统级别或磁盘级别进行 , 并使用精确的块地址 。
    逻辑复制是一种根据复制标识(通常是主键)复制数据实体及其修改的方法 。与物理复制不同 , 它处理数据库、表和 DML 操作 , 并在数据库集群级别完成 。它使用发布和订阅模型 , 一个订阅者可以订阅发布者节点上的一个或多个发布 。


    推荐阅读