Patroni 运用 etcd 集群存储、检测 Halo 主从节点的状态与配置信息,当该故障节点 是主节点,Patroni 自动进行切换,从而减少对式数据库集群的影响。下文针对故障自动转 移优先级以及 DCS 故障保护模式进行部分场景实践。
原理
故障转移优先级是 Patroni 集群中用于控制故障发生时节点晋升为主节点的策略。通过 设置`failover_priority`属性,可以指定在主节点出问题时,哪些节点有更高的优先级来接管。 当 `failover_priority` 为 正 数 , 节 点 参 与 领 导 者 竞 赛 ; 为 0 或 负 数 , 则 不 参 与 。 `synchronous_node_count`用于设置同步复制的节点数量,优先级较高的同步节点将作为主 节点。
同步 :

异步:

优先级 sync > failover_priority
DCS(分布式协调服务)故障保护模式是 Patroni 在面对 DCS 服务不可用时的行为策略。 `failsafe_mode`参数决定了 Patroni 在 DCS 故障时是否维持当前集群状态或尝试执行故障转移。 默认为`false`,此时 Patroni 依赖 DCS,DCS 故障可能导致服务变为只读或暂停;设为`true` 时,Patroni 将尽可能保持当前集群配置,即使 DCS 不可用。

实施步骤
1. 故障转移优先级
- 修改`failover_priority`为 2,并重启 Patroni 集群。
- 模拟主库故障,观察具有高优先级的节点成为新主。
- 修改`synchronous_node_count`为 2,观察主库如何切换至优先级更高的节点。
具体操作:
(1) 设置 failover_priority 为 2,重启 patroni 集群,查看集群状 vi patroni_halo.yml tag 下:
failover_priority: 2
--重启 patroni 集群
systemctl restart patroni
--查看集群状态
patronictl list

(2) 夯住主库,patoni 切换,failover_priority 级别高的会成为新主库
ps -ef|grep patroni
kill -STOP 1110

(3) patronictl edit-config 增加参数,查询集群状态,一同步一异步,挂起进程,发 现主库切换到 Role 为 sync 上,是 Sync 节点的优先级高于 failover_priority 节点

(4) patronictl edit-config 修改参数 synchronous_node_count 为 2,形成两同步: 两个同步节点的情况下 主库总是会迁移到 failover_priority 级别高的数据库

2. DCS 故障保护模式
- `failsafe_mode`默认为`false`,模拟 DCS 故障,观察 Patroni 如何处理。
- 设置`failsafe_mode`为`true`,重复上述故障模拟,查看 Patroni 如何保持服务
具体操作:
(1) 参数配置 failsafe_mode 默认为 false
--查看状态 patronictl list

(2) 夯住三台机器的 etcd 进程,发现 halo 数据库,同步降为异步,且不可写
ps -ef |grep etcd
kill -STOP xxx

(3) 恢复进程,发现 Patroni 主备已经切换
kill -CONT xxxx
patronictl list

(4) 参数配置 patronictl edit-config
failsafe_mode: true
patronictl reload halo-cluster
--查看状态

(5) 夯住 etcd 进程,halo 数据库,仍然是同步状态,而且可写
ps -ef |grep etcd
kill -STOP XXXX
select * from pg_stat_replication;
select * from pg_replication_slots;
create table a(id int);

(6) 恢复进程,主备没有产生切换。

结论
故障转移优先级确保在主节点故障时,具有最高优先级和最多 WAL 日志的节点成为新主,提供了一种有序的故障恢复策略。而 DCS 故障保护模式通过`failsafe_mode`的配置,允许管理员在服务连续性和数据一致性之间做出选择。当`failsafe_mode`设为`false`,服务响应速度快但风险较高;设为`true`,则能在 DCS 故障时维持服务,但可能导致故障恢复延迟。因此,正确配置这些参数对于 Patroni 集群的健壮性和服务质量至关重要。




