
按照Patroni官方给的流程图,可以将整个流程划分为:
1、节点启动流程
2、节点拉起流程
3、处理健康集群流程
4、处理不健康流程
①节点启动
l 步骤1.1:从DCS中加载集群信息
Ø 判断条件2.1:如果在DCS中已经注册了节点,那么执行判断条件2.2,如果没有注册,则执行步骤1.2
l 步骤1.2:在DCS中持久化节点信息
Ø 判读条件2.2:判读当前节点Postgresql的状态,如果是开始中、停止中、重新启动中以及重新初始化中,那么进入判断条件2.3,否则就进入判断条件2.4
Ø 判断条件2.3:判断该节点是否拥有领导者锁,如果拥有领导者锁,则执行步骤1.3,否则执行步骤1.4
l 步骤1.3:更新领导者锁
l 步骤1.4:持久化节点状态到DCS中
Ø 判断条件2.4:集群是否还原状态,并且失败了,如果是执行步骤1.5,否则执行判断条件2.5
l 步骤1.5: 如果当前节点是leader节点,则移除leader key。
Ø 判断条件2.5:判断数据目录是否为空,如果是执行步骤1.6,否则执行判断条件2.6
l 步骤1.6:执行②节点拉起流程
Ø 判断条件2.6:集群信息在DCS中初始化,如果是则执行判断条件2.7,否则执行判断条件2.8
Ø 判断条件2.7:数据目录是否属于集群,如果是执行判断条件2.9,否则执行步骤1.7
Ø 判断条件2.8:集群是否有领导者,如果是执行判断条件2.9,否则执行步骤1.8
l 步骤1.7:节点启动失败并退出
Ø 判断条件2.9:节点是否健康状态(Postgresql运行中),如果是执行判断条件2.10,否则执行步骤1.9
l 步骤1.8:初始化一个新集群
l 步骤1.9:设置成只读节点及还原标志
Ø 判断条件2.10:集群是否有一个领导者,如果是执行③处理健康集群流程,否则执行④处理不健康集群流程
②节点拉起
Ø 判断条件2.1:集群是否有一个领导者,如果是执行步骤1.1,否则执行判断条件2.2
l 步骤1.1:选择一个节点,并且获得备份,执行步骤1.2
l 步骤1.2:执行pg_basebackup还原备份
Ø 判断条件2.2:集群是否有一个初始键,如果是执行步骤1.3,否则执行步骤1.4
l 步骤1.3:等待一个leader key
l 步骤1.4:竞争初始键
Ø 判断条件2.3:判断是否赢得了竞争初始键,如果是执行步骤1.5,否则执行步骤1.6
l 步骤1.5:初始化数据库、运行Postgresql并且创建对应角色,执行判断条件2.4
l 步骤1.6:需要等待leader key
Ø 判断条件2.4:操作成功,执行步骤1.7,否则执行步骤1.8
l 步骤1.7:将leader key存储到DCS中,执行步骤1.9
l 步骤1.8:从DCS中移除初始化键,并且删除数据目录,执行步骤1.9
l 步骤1.9:持久化节点状态到DCS中
③处理健康集群
Ø 判断条件2.1:判断当前节点是否拥有领导者锁,如果是执行步骤1.1,否则执行步骤1.2
l 步骤1.1:尝试更新领导者锁,执行判断条件2.2
l 步骤1.2:跟随领导者
Ø 判断条件2.2:如果执行成功,则执行判断条件2.3,否则执行步骤1.3
Ø 判断条件2.3:当前节点是否作为主节点在运行,如果是执行步骤1.5,否则步骤1.4
l 步骤1.3:执行节点降级操作
l 步骤1.4:提升当前节点为主节点
l 步骤1.5:持久化节点状态到DCS中
④处理不健康集群
Ø 判断条件2.1:判断当前节点是否为健康状态,如果是执行步骤1.1,否则执行步骤1.2
l 步骤1.1:创建leader key
l 步骤1.2:尝试跟随其他节点
Ø 判断条件2.2:是否可以获得锁,如果可以执行判断条件2.3,否则执行步骤1.2
Ø 判断条件2.3:当前节点是否作为Postgresql主节点在运行,如果是执行步骤1.3,否则执行步骤1.4
l 步骤1.3:持久化节点状态到DCS中
l 步骤1.4:提升当前节点为主节点




