Patroni for opengauss 10:rewind
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相关推荐
- 编程之美2.10:寻找数组中的最大值和最小值
编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...
- 剑指offer——面试题10:斐波那契数列
个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...
- 实验10:创建带有生命周期方法的bean ||实验11:测试bean的后置处理器
实验10:创建带有生命周期方法的bean 实验11:测试bean的后置处理器 MyBeanPostProcessor.java package com.atguigu.bean;import org. ...
- Window 10 :如何彻底关闭:Windows Defender Service(2015-12-20日更新)
Window 10 :如何彻底关闭:Windows Defender Service? 网上流传的什么组策略gpeidt.msc方法,什么安装其他的杀软之类的方法都很麻烦,且有弊病! 其实很简单: 利 ...
- 【概率论】1-0:介绍
title: [概率论]1-0:Introduction categories: Mathematic Probability keywords: Probability 概率 the Frequen ...
- 【坐在马桶上看算法】算法10:二叉树
二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递 归定义是:二叉树要么为空,要么由根结点.左子树和右子树组成, ...
- [剑指offer]面试题10:二进制中1的个数
面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...
- Magento教程 10:如何修改网站文字?
你知道知名运动品牌NIKE.休闲鞋品牌TOMS都在使用Magento吗? Magento是一种多商店购物网站系统,其便利性佳.扩充性高,且功能强大,因此广受商家青睐. 此外,Magento在后台.前台 ...
- Java 10:局部变量类型推断
Java 10:局部变量类型推断 在本文中,我们将深入研究Java 10中引入的局部变量类型推断的新特性.我们将讨论使用局部变量类型推断的范围和局限性. 此功能是作为JEP(JDK增强提案)的一部分提 ...
最新文章
- SQL系列ROLLUP关键字
- 继电器rc吸收电路取值_一文读懂继电器的工作原理以及驱动电路
- 算法设计与分析python_Python算法设计与分析
- 【AngularJS】—— 2 初识AngularJs(续)
- 记忆讲师石伟华微信公众号2017所有文章汇总(待更新)
- 【今日CV 视觉论文速览】05 Dec 2018
- MySQL客户端连接被频繁杀掉,企业案例(一):由于mysql sleep线程过多小故障
- matlab m语言建模,MATLAB M语言高级编程
- Newtonsoft 转换json
- JavaScript闭包理解
- BAT校招产品经理:52道经典面试问题解答思路
- Python str islower()方法
- [论文笔记]Fader Networks: Manipulating Images by Sliding Attributes(2017 NIPS)
- Andorid moudle中的activity跳转到主项目的activity
- Java2.28~2.29学习笔记
- 逆向分析系列——查壳侦壳工具
- 新生宝宝办证-STEP1-出生证明办理
- 卓有成效的管理者|木深读书笔记
- 英特尔携手浪潮、锐捷网络和Silicom,构建强大的IPU生态系统
- 手把手教你学51单片机-C语言基础
热门文章
- JavaFx+Jfoenix
- 将逗号隔开的字符串String转换为list<T>集合
- Oracle SQL数字函数
- 计算机屏幕无信号咋回事,电脑显示屏无信号怎么回事?电脑打不开显示器无信号的解决办法...
- 金融级云原生探索实践系列 - 开篇
- 用Fiddle进行的简单抓包(需要fiddle ,firefox)
- 第六章 最大熵原理
- 拥抱开源,需要跨越那些鸿沟? ————《Open Life —— 有关开源的哲学》读后感...
- HIT CS大作业 Hello的一生
- java自学成才的大牛_自学成才的程序员,3年打破麻省理工难题,原本解决需35年!...