====================
== Hi, I'm Vimiix ==
====================
Get hands dirty.

MogDB 中 synchronous_standby_names 参数的工作机制

mogdb synchronous_standby_names notes

在 MogDB 中,参数 synchronous_standby_names 用于配置同步复制设置。特别是当这个参数设置为 '*' 时,表示可以使用任何一个可用的同步备库作为同步备库。这个配置允许任何一个当前连接的备库都可以被用作同步备库,而不需要明确指定备库的名称。

工作机制

synchronous_standby_names 被设置为 '*' MogDB 的同步复制机制会按照以下步骤选择同步备库:

  1. 初始连接: 当主服务器启动或参数被更改时,主服务器会接受所有连接的备库。

  2. 同步备库的确认:

    • 主服务器会向所有连接的备库发送同步请求。
    • 每个备库在接收到同步请求后,会进行确认并向主服务器报告其状态。
  3. 选择同步备库:

    • 主服务器根据备库的响应情况,选择最早确认的一个或多个备库作为同步备库。
    • 这个选择过程是动态的,也就是说,当有新的备库连接或当前的同步备库断开连接时,主服务器会重新选择同步备库。

优先级和行为

  • 无优先级排序: 由于 '*' 表示任何备库,因此所有备库的优先级是相同的,主服务器只是选择最早响应的备库作为同步备库。
  • 动态调整: 当一个同步备库断开连接时,主服务器会自动选择下一个响应的备库作为新的同步备库。这保证了同步复制的持续性和可靠性。
  • 并发管理: 如果多个备库同时连接,主服务器可以处理这些并发连接,并根据同步请求的确认情况选择同步备库。

示例配置和使用

假设我们有一个主服务器和三个备库(standby1standby2standby3),在配置文件 postgresql.conf 中设置 synchronous_standby_names'*'

synchronous_standby_names = '*'

场景分析

  1. 启动时选择:

    • 当主服务器启动时,所有连接的备库都会发送心跳信号并等待主服务器的同步请求。
    • 主服务器会选择最早响应的备库作为同步备库。
  2. 运行时变化:

    • 如果当前同步备库 standby1 断开连接,主服务器会自动选择下一个响应的备库 standby2 作为新的同步备库。
    • 如果新的备库 standby3 连接到主服务器,且当前没有同步备库,主服务器会选择 standby3 作为同步备库。

动态调整

如果我们启动了主服务器和三个备库,并且设置了 synchronous_standby_names = '*',以下是可能的状态转换示例:

  • 初始状态: 所有备库(standby1standby2standby3)连接,主服务器选择最早响应的备库 standby1 作为同步备库。
  • standby1 断开连接: 主服务器自动选择下一个响应的备库 standby2 作为新的同步备库。
  • 新备库连接: 新的备库 standby4 连接,主服务器不会改变当前的同步备库,除非 standby2 断开连接。

总结

synchronous_standby_names 设置为 '*' 时,PostgreSQL 会动态地选择任何一个当前可用的备库作为同步备库。这提供了一种灵活和高可用的同步复制机制,无需管理员手动指定备库的名称。选择过程基于备库的响应情况,并在运行时自动调整,以保证同步复制的持续性和可靠性。