OpenGauss(OG)的gs_ctl build 对应 PG的pg_rewind,OG没有pg_rewind这个可执行程序,但是有pg_rewind.cpp这个文件,gs_ctl build会调用pg_rewind.cpp中的gs_increment_build()。

在对Patroni的修改中,原pg_rewind的相关逻辑不再被调用,根据代码可知,只要在patroni.yml中设置use_pg_rewind为false,就能禁用Patroni中pg_rewind所有相关逻辑,而且OG也没有pg_rewind可执行程序(而是用gs_ctl build替代pg_rewind),这也是patroni判断是否禁用pg_rewind的充分条件。

patroni.yml

patroni/postgresql/rewind.py

禁用了原pg_rewind逻辑后,要增加opengauss的rewind逻辑,逻辑要实现下面的功能:

1、启动Patroni时,判断自己为备机后,做一次rewind(如果没有做过basebackup则做basebackup而不是rewind),如果集群中还没有主机,要推迟到下一个run_cycle循环中的follow做rewind,如果还没有,再推迟到下一个follow,直到集群中出现主机。

2、在运行过程中,备机发现主机改变了(集群中发生了主备切换),备机要做一次rewind。

3、备机发现opengauss崩溃退出,拉起opengauss前要做一次rewind。

4、做rewind时如果不成功,连续尝试3次,都失败后执行reinitialize(删除数据目录,做basebackup)。

5、执行rewind不另起一个线程,而是使用主循环线程。

patroni/ha.py:class Ha :def __init__()

patroni/ha.py:def load_cluster_from_dcs()  判断集群主节点的改变

patroni/ha.py:def _handle_opengauss_rewind_or_reinitialize() 尝试3次调用gs_ctl build做rewind,返回0认为成功,其它认为失败,如果3次都失败,则执行reinitialize,即删除datadir,执行basebackup。如果集群中没有主节点,则返回None,推迟到下一个follow中执行。

patroni/ha.py:def recover() 在recover中执行rewind,recover并非每次循环都会执行。当第一次启动、拉起opengauss时会执行recover,如果集群中还没有确定leader,则等待下一个循环执行。

patroni/ha.py:def follow() 在follow中执行rewind,follow每次循环都会执行。当集群的主节点发生改变(自动切换或手动切换)时,在def load_cluster_from_dcs()中self._opengauss_leader_changed被设为True,导致follow中执行rewind,执行成功后self._opengauss_leader_changed被设为False。

patroni/postgresql/rewind.py:def gsctl_build() 生成gs_ctl build命令并且调用,并获得返回值,返回0表示执行成功,需要判断一下,如果自己是主节点,则不执行gs_ctl build直接返回成功。

注意,这些逻辑的原则是:避免rewind重复执行,和避免在该执行rewind的时候未能执行。

通过patroni.yml中新增参数:use_rewind来控制是否使能opengauss的rewind逻辑。

为这个参数新增一个openguass段,是因为在Patroni代码中,将第一层参数识别为字典,所以布尔类型的参数最好不要放在第一层。

Patroni for opengauss 10:rewind相关推荐

  1. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  2. 剑指offer——面试题10:斐波那契数列

    个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...

  3. 实验10:创建带有生命周期方法的bean ||实验11:测试bean的后置处理器

    实验10:创建带有生命周期方法的bean 实验11:测试bean的后置处理器 MyBeanPostProcessor.java package com.atguigu.bean;import org. ...

  4. Window 10 :如何彻底关闭:Windows Defender Service(2015-12-20日更新)

    Window 10 :如何彻底关闭:Windows Defender Service? 网上流传的什么组策略gpeidt.msc方法,什么安装其他的杀软之类的方法都很麻烦,且有弊病! 其实很简单: 利 ...

  5. 【概率论】1-0:介绍

    title: [概率论]1-0:Introduction categories: Mathematic Probability keywords: Probability 概率 the Frequen ...

  6. 【坐在马桶上看算法】算法10:二叉树

    二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递 归定义是:二叉树要么为空,要么由根结点.左子树和右子树组成, ...

  7. [剑指offer]面试题10:二进制中1的个数

    面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...

  8. Magento教程 10:如何修改网站文字?

    你知道知名运动品牌NIKE.休闲鞋品牌TOMS都在使用Magento吗? Magento是一种多商店购物网站系统,其便利性佳.扩充性高,且功能强大,因此广受商家青睐. 此外,Magento在后台.前台 ...

  9. Java 10:局部变量类型推断

    Java 10:局部变量类型推断 在本文中,我们将深入研究Java 10中引入的局部变量类型推断的新特性.我们将讨论使用局部变量类型推断的范围和局限性. 此功能是作为JEP(JDK增强提案)的一部分提 ...

最新文章

  1. SQL系列ROLLUP关键字
  2. 继电器rc吸收电路取值_一文读懂继电器的工作原理以及驱动电路
  3. 算法设计与分析python_Python算法设计与分析
  4. 【AngularJS】—— 2 初识AngularJs(续)
  5. 记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
  6. 【今日CV 视觉论文速览】05 Dec 2018
  7. MySQL客户端连接被频繁杀掉,企业案例(一):由于mysql sleep线程过多小故障
  8. matlab m语言建模,MATLAB M语言高级编程
  9. Newtonsoft 转换json
  10. JavaScript闭包理解
  11. BAT校招产品经理:52道经典面试问题解答思路
  12. Python str islower()方法
  13. [论文笔记]Fader Networks: Manipulating Images by Sliding Attributes(2017 NIPS)
  14. Andorid moudle中的activity跳转到主项目的activity
  15. Java2.28~2.29学习笔记
  16. 逆向分析系列——查壳侦壳工具
  17. 新生宝宝办证-STEP1-出生证明办理
  18. 卓有成效的管理者|木深读书笔记
  19. 英特尔携手浪潮、锐捷网络和Silicom,构建强大的IPU生态系统
  20. 手把手教你学51单片机-C语言基础

热门文章

  1. JavaFx+Jfoenix
  2. 将逗号隔开的字符串String转换为list<T>集合
  3. Oracle SQL数字函数
  4. 计算机屏幕无信号咋回事,电脑显示屏无信号怎么回事?电脑打不开显示器无信号的解决办法...
  5. 金融级云原生探索实践系列 - 开篇
  6. 用Fiddle进行的简单抓包(需要fiddle ,firefox)
  7. 第六章 最大熵原理
  8. 拥抱开源,需要跨越那些鸿沟? ————《Open Life —— 有关开源的哲学》读后感...
  9. HIT CS大作业 Hello的一生
  10. java自学成才的大牛_自学成才的程序员,3年打破麻省理工难题,原本解决需35年!...