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

  • PostgreSQL 复制没有内置的故障转移和监控功能 。当主节点发生故障时 , 我们需要将一个备份节点提升为新的主节点 。这种提升需要让用户无感知 , 且不会出现数据不一致问题 。
  • PostgreSQL 需要复制主节点的整个状态 。当你需要开发一个新的备份节点时 , 需要从主节点重放状态变化的整个历史 , 这会导致很大的资源消耗 , 并且使得删除头部节点和创建新节点的成本很高 。
  • 方法二:RBD(块设备复制)?RBD 方法依赖于磁盘镜像(也称为卷复制) 。在这种方法中 , 更改被写入一个持久卷 , 该卷被同步镜像到另一个卷 。
    RBD 是一个基于Ceph分布式存储系统的块设备复制方案 , 用于在PostgreSQL数据库中实现高可用性和容错性 。它通过将主服务器上的数据块实时复制?到备用服务器上 , 以确保在主服务器出现故障或宕机时 , 备用服务器可以立即接管其职责 。
    RBD是一个基于网络块设备的复制方案 , 它可以在多个Ceph节点之间实现数据复制 , 并通过Ceph的故障转移机制来保证数据的可用性和一致性 。在RBD中 , 主服务器和备用服务器之间通过Ceph集群的网络通信 , 实现数据块的实时复制和同步 。
    与其他流复制方案相比 , RBD具有以下优点:
    1. 数据复制速度更快:RBD通过Ceph的对象存储方式来管理数据 , 可以实现高效的数据复制和同步 , 比传统的流复制方案速度更快 。
    2. 数据安全性更高:RBD可以使用Ceph的数据加密和数据压缩功能 , 提高数据的安全性和传输效率 。
    3. 可扩展性更好:RBD可以根据需要对Ceph存储集群进行扩展 , 以满足不同的存储需求 。
    4. 系统稳定性更高:由于RBD是基于Ceph的分布式存储系统实现的 , 因此具有更好的容错性和可靠性 , 可以确保数据的可用性和一致性 。
    方法三:WALWAL 由段文件组成(默认为 16 MB) 。每个段都有一个或多个记录 。日志序列记录 (LSN) 是指向 WAL 中记录的指针 , 用于记录在日志文件中保存的位置(position/location) 。
    备份服务器利用 WAL 段(在 PostgreSQL 术语中也称为 XLOGS)从其主服务器不断复制更改 。你可以通过在DBMS中使用预写日志(write-ahead logging)来为数据提供持久性和原子性 , 具体做法是在将字节数组数据块(每个块都带有唯一的LSN)应用到数据库之前 , 将它们序列化并写入稳定的存储介质
    将变更应用到数据库可能会引起各种文件系统操作 。一个相关的问题是 , 在文件系统更新过程中 , 如果服务器由于停电而发生故障 , 数据库如何确保原子性 。具体做法是当数据库启动时 , 它会开始一个启动或重放过程 , 该过程可以读取可用的WAL段 , 并将它们与存储在每个数据页上的LSN进行比较(每个数据页都标记有影响该页的最新WAL记录的LSN) 。
    基于日志发送的复制(块级)流复制改进了日志发送的过程 。与等待WAL切换不同 , 记录在创建时就被发送 , 从而减少了复制延迟 。
    流复制也胜过日志发送 , 因为备份服务器通过复制协议在网络上与主服务器建立连接 。主服务器可以直接通过这个连接发送WAL记录 , 而不必依赖于用户提供的脚本 。
    基于日志发送的复制(文件级)日志发送是将日志文件复制到另一台PostgreSQL服务器 , 通过重放WAL文件生成另一台备用服务器 。且此服务器被配置为在恢复模式下工作 , 目的是为了在监听新的 WAL 文件 , 并进行应用 。
    备份服务器将成为主 PostgreSQL 服务器的热备份 。它还可以配置为只读副本 , 可以提供只读查询 。
    WAL 归档在创建 WAL 文件时将其复制到除pg_wal子目录以外的任何位置以将其归档称为 WAL 归档 。每次创建 WAL 文件时 , PostgreSQL 都会调用用户提供的脚本进行归档 。
    该脚本可以利用该scp命令将文件复制到一个或多个位置 , 例如 NFS。存档后 , 可以利用 WAL 段文件恢复数据库到任何给定时间点 。
    其他基于日志的配置如下: