Patroni的执行流_howard_shooter的博客-CSDN博客
这篇博客里介绍了Patroni的执行流,在集群初始化时,在每个节点的Ha._run_cycle()中会尝试获取leader锁,如果某个节点成功获取leader锁,并且通过查询dcs发现集群未初始化,就会执行初始化流程。
初始化流程起始于Ha._run_cycle()中调用Ha.bootstrap(),在Ha.bootstrap()中会判断本节点是否获取了leader锁、也会判断dcs中的initialize key是否被设置,如果本节点获取了锁,并且initialize key 未设置,则执行gs_ctl init,初始化opengauss,如果本节点没有获取锁,但initialize key已设置,则尝试从集群中另一个主节点拉取 basebackup。
如果本节点未获得锁,且initialize key未设置,在Ha.bootstrap()中会竞争初始化集群的权利,在self.dcs.initialize(create_new=True)这个函数中竞争,竞争成功后,调用Bootstrap._initdb()。
初始化opengauss的核心代码在Bootstrap._initdb()(patroni/postgresql/bootstrap.py)中,按照类似下面的步骤初始化Openguass:
echo "Postgres123"> /tmp/tmplk1xtqm1
gs_ctl init -D _pg_root -o "--encoding=UTF8 --nodename=og --no-locale --username=postgres --pwfile=/tmp/tmplk1xtqm1"
Patroni会调用gs_ctl init初始化,相对于PG所需的修改只要将pg_ctl initdb改为gs_ctl init。
初始化完后,还有个post bootstrap,核心代码在:
patroni/postgresql/bootstrap.py :Ha.post_bootstrap(),Ha.post_bootstrap()这个函数做两件事:
1、创建用户
不同于PG,OG不创建rewind和replication用户,OG只需要一个超级用户,basebackup和rewind都用这个超级用户。这个超级用户的用户名和密码在patroni.yml的postgresql.authentication.superuser 中定义,
在初始化时已经创建了超级用户,因此对于OG,post bootstrap中创建用户的逻辑被注释掉了。
patroni/postgresql/bootstrap.py:def post_bootstrap()
创建superuser、replication user、rewind user的代码被注释掉了,只留下创建普通user的代码,这样可以通过配置patroni.yml创建普通用户。
2、生成配置文件:postgresql.conf、pg_hba.conf、pg_ident.conf
生成 pg_hba.conf 和 pg_ident.conf 的代码没有改变,修改了生成postgresql.conf的代码,首先,由于OG的rewind(gs_ctl build)不支持postgresql.conf中的include语法,所以这里把postgresql.base.conf的内容直接写到postgresql.conf(postgresql.base.conf是之前的postgresql.conf),其次不使用Patroni中的校验patroni.yml中参数的逻辑,而是不管什么参数,都转写到postgresql.conf。
patroni/postgresql/config.py:def write_postgresql_conf()
3、除了上面三个文件,PG还会生成recovery.conf,但是OG配置主从,并不需要创建recovery.conf 和 standby.signal,也不需要在postgresql.conf里生成参数primary_conninfo。OG用postgresql.conf里的replconninfo1、replconninfo2替代primary_conninfo,只要postgresql.conf里有replconninfoXX配置,启动时即使不指定主备,也认为是集群节点,可以使用gs_ctl failover转为主。
因此注释掉了recovery.conf相关的代码:
patroni/postgresql/config.py:def write_recovery_conf()、def _write_recovery_params()
patroni/postgresql/__init__.py:def follow()
./patroni/postgresql/bootstrap.py:def _custom_bootstrap()
patroni/postgresql/bootstrap.py:def post_bootstrap()
patroni/postgresql/rewind.py:def ensure_clean_shutdown()