介绍
pg_auto_failover使用状态机进行高度受控的执行。作为守门员 通知监视器有关新事件(或根本无法联系它), 监视器为每个节点分配当前状态和目标状态。节点的 当前状态是其能力的有力保证。国家本身 不要引起任何行动;操作在状态转换期间发生。这 分配的目标状态通知守门员要尝试的过渡。
新集群中的状态转换示例
熟悉各州的一个好方法是检查 群集从诞生到高可用性的转换。
启动监视器并为第一个数据节点运行 keeper 初始化后 (“节点 A”),监视器将该节点的状态注册为“init” “单身”的目标状态。初始化状态意味着监视器什么都不知道 关于节点,而不是它的存在,因为守护者还没有 持续运行以报告节点运行状况。
一旦守门员运行并向监视器报告其运行状况, 监视器将其状态分配为“单一”,这意味着它只是一个普通的 没有故障转移的 Postgres 服务器。因为还没有其他节点 在群集中,监视器还会为节点 A 分配目标状态 单 – 节点 A 的守护者不需要更改任何内容。
一旦初始化新节点(“节点 B”),监视器就会分配 节点 A 的目标状态为“wait_primary”。这意味着节点仍然有 没有故障转移,但有希望辅助数据库与之同步 很快。要完成从单个节点到wait_primary节点的转换 A 的守护者将节点 B 的主机名添加到 pg_hba.conf 以允许热备用 复制连接。
同时,节点 B 以目标转换为wait_standby 最初住在wait_standby。它只能等待 直到节点 A 授予它连接访问权限。节点 A 转换后 为了wait_primary,监视器将“追赶”的目标分配给 B, 这给了 B 的守护者进行过渡的绿灯 从wait_standby到追赶。此转换涉及运行 pg_basebackup,编辑 recovery.conf 并在 Hot 中重新启动 PostgreSQL 备用节点。
节点 B 在处于热备用模式且能够 以连接到节点 A。然后,监视器为节点 B 分配目标状态 “次要”和A的“主要”目标。Postgres运送WAL日志 从节点 A 并在节点 B 上重播它们。最后B被追上并告诉 监视器(特别是 B 报告其 pg_stat_replication.sync_state 和 沃尔重播滞后)。在这个光荣的时刻,监视器分配了 A 的状态 主要(目标:主要)和 B 次要(目标:次要)。
状态引用
下图显示了pg_auto_failover状态机。它不见了 指向状态的链接,删除时始终可以访问该状态 所有其他节点。single
pg_auto_failover 有限状态机图
在上图中,我们可以看到我们有一个包含六个状态的列表,其中 应用程序可以连接到读写 Postgres 服务:、、、 和 。single``wait_primary``primary``prepare_maintenance``apply_settings
初始化 Init
节点在首次注册时被分配为“init”状态 监视器。此时对节点一无所知,除了其 存在。如果没有其他节点向监视器注册 相同的阵型和组 ID,则为此节点分配目标状态 的“单身”。否则,节点的目标状态为“wait_standby”。
单个 Single
组中只有一个节点。它表现得像常规 PostgreSQL 实例,没有高可用性,也没有故障转移。如果 管理员删除一个节点,另一个节点将恢复为单个节点 州。
Wait_primary
应用于旨在成为主节点但尚未在该节点中的节点 位置。此时的主节点知道辅助节点的节点 名称或 IP 地址,并已授予节点热备用访问权限 pg_hba.conf 文件。
wait_primary状态可能是由新的潜在次级引起的 已注册到监视器(良好)或现有辅助数据库 变得不健康(坏)。在后一种情况下,在从 主节点到wait_primary,主节点的守护者禁用同步 节点上的复制。它还会取消当前阻止的查询。
Join_primary
当另一个备用节点加入主节点时应用于该节点。这 允许主节点在之前对其 HBA 设置应用必要的更改 允许加入系统的新节点运行命令。pg_basebackup
重要
此状态已弃用,不再分配给节点。任何 我们以前会使用的时间,现在我们改用。join_primary``primary
主要 Primary
存在健康的辅助节点,并且已赶上 WAL 复制。具体来说,守护者报告主要状态 仅当它已验证辅助数据库在 中报告为“同步” pg_stat_replication.sync_state,并且 WAL 滞后为 0。
主要状态是强有力的保证。这是我们唯一的状态 知道我们可以在需要时进行故障转移。
在从wait_primary到初级的过渡过程中,守门员还 启用同步复制。这意味着在故障转移后 辅助将完全最新。
Wait_standby
监视器确定此节点为备用节点。节点必须等到主节点 已授权它连接和设置热备用复制。
追赶 Catchingup
当主节点时,监视器将追赶分配给备用节点 已准备好进行复制连接(pg_hba.conf 已正确 已编辑,添加了连接角色等)。
备用节点守护者运行pg_basebackup,连接到主节点的 主机名和端口。然后,守门员编辑 recovery.conf 并开始 PostgreSQL 在热备用节点中。
备用 Secondary
具有此状态的节点充当主节点的热备用节点,并且 是最新的 WAL 日志那里。特别是,它在16MB以内 或初级的 1 个 WAL 段。
保养 Maintenance
群集管理员可以手动将辅助数据库移动到 维护状态以使其正常脱机。然后,主要将 从州初级状态过渡到wait_primary状态,在此期间 中学将联机接受写入。当旧的主节点到达 wait_primary状态,则辅助数据库可以安全地脱机 后果最小。
Prepare_maintenance
群集管理员可以手动将主节点移动到 维护状态以使其正常脱机。主然后 转换为prepare_maintenance状态以确保辅助状态 不丢失任何写入。在prepare_maintenance状态下,主服务器关闭 下。
Wait_maintenance
管理员可以手动将辅助数据库移动到维护中 状态以使其正常脱机。在达到维护状态之前 但是,我们希望将主节点切换到异步复制,在 以避免写入被阻止。在州wait_maintenance 待机一直等到主数据库达到wait_primary。
排水 Draining
复制缓冲区完成的主状态和降级状态 冲洗。排出节点将不接受新的客户端写入,但会 继续将现有数据发送到辅助数据库。
为了使用 Postgres 实现这一点,我们实际上停止了该服务。停止时, Postgres 确保正确刷新当前复制缓冲区 到同步待机。
降职 Demoted
主守护者或其数据库在某个时间后无响应 门槛。监视器将降级状态分配给主服务器以避免 一个裂脑场景,其中可能有两个节点没有 相互通信,并且都接受客户端写入。
在这种状态下,守护者会停止PostgreSQL并阻止它运行。
Demote_timeout
如果监视器为主服务器分配了降级的目标状态,但为主服务器分配了目标状态 Keeper 不承认在超时内转换到该状态 窗口中,则监视器将demote_timeout分配给主数据库。
最常见的情况可能发生在主计算机静默时。这 守护者未向监视器报告。
Stop_replication
stop_replication状态旨在确保主节点进入 在待机进入单机并接受之前降级状态 写入(以防主设备无法再联系监视器)。以前 提升辅助节点,守护者在主节点上停止 PostgreSQL 以避免出现裂脑情况。
为了安全起见,当主设备无法联系显示器并出现故障时 要查看pg_stat_replication中的pg_auto_failover连接,则转到 自行降级的状态。
Prepare_promotion
prepare_promotion状态旨在使备用服务器 促进。此状态允许在监视器上进行同步,确保 主数据库在提升辅助数据库之前已停止 Postgres,因此 防止脑裂的情况。
Report_LSN
report_lsn当故障转移 编排,并且有多个备用节点。为了选择 复制中最远的备用数据库,pg_auto_failover首先需要一个新的 报告每个备用节点上达到的当前 LSN 位置。
当节点达到report_lsn状态时,复制流将停止,由 重新启动没有 .这允许主 节点来检测网络分区,即当主节点无法连接时 到显示器,并且 中未列出待机。primary_conninfo``pg_stat_replication
Fast_forward
fast_forward状态分配给选定的晋升候选人 在故障转移期间,由于候选人优先级而赢得选举 设置,但所选节点不是最先进的备用节点,因为 在report_lsn州报告。
缺少的 WAL 字节由 使用 Postgres 级联复制功能:可以使用任何 中的备用节点。primary_conninfo
下降 Dropped
使用命令时,将删除状态分配给节点。这允许节点实现特定的本地操作 在从监视器数据库中完全删除之前。pg_autoctl drop node
当节点报告达到丢弃状态时,监视器会删除其 进入。如果一个节点不再报告,可能是因为它完全 不可用,则可以运行该命令,然后从监视器中删除节点条目。pg_autoctl drop node --force
pg_auto_failover守护者的状态机
当内置在 TEST 模式下时,可以使用以下命令来 获取 Keeper 有限状态机的可视化表示:
$ PG_AUTOCTL_DEBUG=1 pg_autoctl do fsm gv | dot -Tsvg > fsm.svg
点程序是 Graphviz 套件的一部分,并产生以下内容 输出:
[
守护者状态机




