• Patroin源码修改八:初始化Opengauss


    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()

  • 相关阅读:
    python+vue驾校驾驶理论考试模拟系统
    mysql 事务原理详解
    OKR,为什么我喜欢他们
    政企组织为什么更需要私有化的IM即时通讯平台?
    k8s--基础--19--DaemonSet
    华为ensp创建 VLAN
    c#设计模式-行为型模式 之 中介者模式
    FreeRTOS深入教程(任务的引入及栈的作用)
    latex方程组编写,一种可以保证方程编号自适应的方法
    使用ThreeJS绘制一个饼图
  • 原文地址:https://blog.csdn.net/howard_shooter/article/details/126645728