深入学习openGauss主备

openGauss主备

本文档介绍了openGauss的主备架构、如何修改事务提交方式(同步、异步)、解释了主备日志复制的相关GUC参数、以及对openGauss3.0新添加的CM工具进行了介绍。

本文档的内容主要由其他文章及官方文档学习整理而来。

1. 主备架构

参考链接:https://cdn.modb.pro/db/108743

openGauss的主备HA架构图如下。

image.png

ParallelRecov:支持备机并行日志恢复

两地三中心的部署架构,如下图。

image.png

2. 术语解释

更多术语解释可查看官方文档:https://opengauss.org/zh/docs/3.0.0/docs/Glossary/Glossary.html

AZ:Available Zone,通常指一个机房。

HA:高可用性(HighAvailability),通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。

检查点:将数据库内存中某一时刻的数据存到磁盘的机制。openGauss定期将已提交的事务数据和未提交的事务数据存到磁盘,这些数据用来和Redo日志一起在数据库重启和崩溃时恢复数据库。

Postmaster:数据库服务启动时启动的一个线程。用于侦听来自数据库其它节点或客户端的连接请求。主机上侦听到备机连接请求,并接受后,就会创建一个WAL Sender线程,用于处理与备机的交互。

WAL:Write-Ahead Logging,也称为 XLog,预写日志系统。实现事务日志的标准方法,是指对数据文件(表和索引的载体)持久化修改之前必须先持久化相应的日志。

WAL Receiver:数据库复制时备机创建的一个线程的名称。此线程用于从主机接收数据、命令,并反馈确认信息至主机。一个备机只有一个WALReceiver线程。

WAL Sender:数据库复制过程中,主机接受到备机的连接请求后创建的一个线程的名称。此线程用于发送命令、数据到备机,并从备机接收信息。一个主机可能会有多个WAL Sender线程,每一个WAL Sender线程对应一个备机的一个连接请求。

目前一主多备方式架构,主机通过walsender线程向备机同步日志,备机通过walreceiver线程接受日志,并刷到本地盘,备机读取redo日志,完成主备之间的数据同步。主备机之间walsender与walreceiver一一对应

WAL Writer:数据库启动时创建的一个写Redo日志的线程,用于将内存中的日志写入到持久性设备(如:磁盘)。

Xlog: 表示事务日志,一个逻辑节点中只有一个,不允许创建多个Xlog文件。

3. 事务提交方式(主备日志同步方式)

通常情况下,一个事务产生的日志的同步顺序如下:

1. 主机将日志内容写入本地内存。
2. 主机将本地内存中的日志写入本地文件系统。
3. 主机将本地文件系统中的日志内容刷盘。
4. 主机将日志内容发送给备机。
5. 备机接受到日志内容,存入备机内存。
6. 备机将备机内存中的日志写入备机文件系统。
7. 备机将备机文件系统中的日志内容刷盘。
8. 备机回放日志,完成对数据文件的增量更新。

事务提交方式由参数synchronous_commit决定,共有6种提交方式,如下:

- on:表示主机事务提交需要等待备机将对应日志刷新到磁盘。
- off:表示主机事务提交无需等待主机自身将对应日志刷新到磁盘,通常也称为异步提交。
- local:表示主机事务提交需要等待主机自身将对应日志刷新到磁盘,通常也称为本地提交。
- remote_write:表示主机事务提交需要等待备机将对应日志写到文件系统(无需刷新到磁盘)
- remote_receive:表示主机事务提交需要等待备机接收到对应日志数据(无需写入文件系统)
- remote_apply:表示主机事务提交需要等待备机完成对应日志的回放操作。
默认值:on

上述6种提交方式中,off和local属于非同步提交,其他均为同步提交。

下面给出onlocal两种方式的事务提交时序图。

1、synchronous_commit = on(默认值)

image.png

该方式有性能损耗,可靠性高。

2、synchronous_commit = local

image.png

该方式性能高,可靠性差。

4. 主备日志复制的相关GUC参数

GUC: Grand Unified Configuration,数据库运行参数。配置这些参数可以影响数据库系统的行为。

更多GUC参数可查看:GUC参数说明

修改GUC参数的方法:重设GUC参数

1、wal_writer_delay

**参数说明:**WalWriter进程的写间隔时间。如果时间过长可能造成WAL缓冲区的内存不足,时间过短会引起WAL不断写入,增加磁盘I/O负担。

取值范围:整型, 1~10000(毫秒)

**默认值:**200ms

2、checkpoint_segments

参数说明:设置checkpoint_timeout周期内所保留的最少WAL日志段文件数量。每个日志文件大小为16MB。

取值范围:整型,最小值1

提升此参数可加快大数据的导入速度,但需要结合checkpoint_timeoutshared_buffers这两个参数统一考虑。这个参数同时影响WAL日志段文件复用数量,通常情况下pg_xlog文件夹下最大的复用文件个数为2倍的checkpoint_segments个,复用的文件被改名为后续即将使用的WAL日志段文件,不会被真正删除。

**默认值:**64

shared_buffers

**参数说明:**设置openGauss使用的共享内存大小。增加此参数的值会使openGauss比

系统默认设置需要更多的System V共享内存。

**默认值:**8MB

3、checkpoint_timeout

**参数说明:**设置自动WAL检查点之间的最长时间。

取值范围:整型, 30~3600(秒)

在提升checkpoint_segments以加快大数据导入的场景也需将此参数调大,同时这两个参数提升会加大shared_buffers的负担,需要综合考虑。

**默认值:**15min

4、max_redo_log_size

**参数说明:**备DN表示当前回放的最新检查点位置和当前日志回放位置之间日志量的期望值,主DN表示恢复点到当前最新日志之间日志量的期望值,关注RTO的情况下,这个值建议不宜过大。

取值范围:整型,163840~2147483647,单位为KB

**默认值:**1GB

5、recovery_max_workers

**参数说明:**设置最大并行回放线程个数。

取值范围:整型,0~20

**默认值:**1(安装工具默认设置为4,以获得更好地性能)

6、max_wal_senders

参数说明:指定事务日志发送进程的并发连接最大数量。不可大于等于max_connections

wal_level必须设置为archive、hot_standby或者logical以允许备机的连接。

取值范围:整型,0 ~ 1024(建议取值范围:8 ~ 100)

**默认值:**16

7、wal_keep_segments

**参数说明:**Xlog日志文件段数量。设置“pg_xlog”目录下保留事务日志文件的最小数目,备机通过获取主机的日志进行流复制。

**取值范围:**整型,2 ~ INT_MAX

**默认值:**16

设置建议:

  • 当服务器开启日志归档或者从检查点恢复时,保留的日志文件数量可能大于wal_keep_segments设定的值。
  • 如果此参数设置过小,则在备机请求事务日志时,此事务日志可能已经被产生的新事务日志覆盖,导致请求失败,主备关系断开。
  • 当双机为异步传输时,以COPY方式连续导入4G以上数据需要增大wal_keep_segments配置。以T6000单板为例,如果导入数据量为50G,建议调整参数为1000。您可以在导入完成并且日志同步正常后,动态恢复此参数设置。
  • 若synchronous_commit级别小于LOCAL_FLUSH,重建备机时,建议调大改参数为1000,避免重建过程中,主机日志回收导致重建失败。

个人思考:1)被产生的新事务日志覆盖、2)主机日志回收,这两个关键语句,意味着主机的WAL日志已经被覆盖了,丢失了旧的数据,如果此时有备机要重建,读取主机WAL日志进行回放,就会丢失数据,与主机数据不一致!因此,我觉得这个参数决定了在备机故障断连的情况下,主机的WAL日志的保存上限。

5. CM

参考链接:https://my.oschina.net/u/5059795/blog/5515466

5.1 CM是什么?

CM,即Cluster Manager,数据库管理模块。管理和监控系统中各个功能单元和物理资源的运行情况,确保整个系统的稳定运行。

5.2 CM 能做什么?
5.2.1 CM的架构及核心组件

CM 提供了丰富的集群管理能力,如集群、节点、实例级的启停,集群状态查询、选主、主备切换、日志管理等。

img

CM 架构图如上所示,组件包括 4 个可执行文件:

cm_server:(cms)cm 的服务端,负责收集 cma 上报的状态,并作为仲裁中心和全局配置中心,集群能否稳定运行以及在发生单点故障后,备实例能否正常切换为主来保证集群的可用性,都与 CMS 是否稳定相关。

cm_agent:(cma)通常集群中的每台机器都安装一个,负责管理本节点所有实例的状态检测和上报以及 cms下发命令的执行。

om_monitor:通常集群中的每台机器都安装一个,负责保障本节点 cm_agent 进程的健康。

cm_ctl:cm 的客户端工具,提供集群管理操作。

5.2.2 进程监控

cm 接管集群后,会周期性的对集群中的所有进程 (包括 cma,cms,openGauss 等进程) 进行探测监控,负责集群进程的保活及僵死恢复。

5.2.3 数据库状态采集

cma 会周期性的采集 openGauss 数据库的运行状态,采集指标包括主备状态,日志位置及回放速率,日志发送接收进度等信息,并汇总在 cms,这些信息将被用于选主仲裁及工具展示。

5.2.4 日志压缩

cma 提供了日志管理能力,通过日志文件总大小,日志文件数量,日志时间等维度对日志目录进行监控,自动归档,清理日志。

5.2.5 可靠的选主仲裁

当数据库主机发生不可恢复的故障而无法继续提供服务时,集群管理会感知并基于 qurom 协议,进行选主仲裁。CM 的仲裁都是使用的状态机模式,依据当前数据库状态进行仲裁逻辑的推进。

img

以上是 CMS 选主仲裁的时序图,总体流程包含上报和仲裁两大部分 (仲裁命令实际实时都是通过信息上报获取的,图中返回结果只是为了方便理解)。

信息采集上报:

每个数据库实例的状态都会被 cma 定时采集并上报 cms。

选主仲裁:

cms 周期性的检测数据库的主备状态,如果发现主机不能够正常提供服务,则会触发选主仲裁。

1. **状态:**无主。

**操作:**给所有备机发送命令,使其进入 LOCK1 状态。

说明: 如果备机此时连接主机,则 lock1 不会成功。Lock1 状态成功主要有两个条件:1)备机与主机复制链路永久断开且不再主动重连。2)备机日志全部回放结束,不再增加。

2. 状态:(n+1)/2 个备机已经进入 LOCK1 状态。

**操作:**选合适的主,发送 failover

**说明:**根据 qurom 的特点,当 (n+1)/2 个备机进入 LOCK1 状态后,这几个备机中一定有至少 1 个同步备,cms 从这几个备机中找到日志最多的节点 (一定是同步备),发送升主命令。如果有多个满足条件的备机,则按照以下策略:

a) 原主能起来,则选原主

b) 选择与原主同 AZ 的

c) 按节点顺序

3. 状态:新主升主成功。

操作:给主备机发送 unlock/lock2 消息,恢复成正常状态

说明:如果主机处于 lock1 状态,则给主机发送 unlock 消息使其退出 lock1 状态,如果备机处于 lock1 状态,则给备机发送 lock2 消息,指定新主 ip,使其连接新主。

通过以上逻辑,CM 保证了集群永远只有一个可写主机,且 RPO=0。

5.3 CM 集群的安装说明

在安装带 CM 的 openGauss 之前,需要创建 clusterconfig.xml 配置文件。XML 文件包含部署 openGauss+CM 的服务器信息、安装路径、IP 地址以及端口号等。用于告知 openGauss、CM 如何部署。用户需根据不同场配置对应的 XML 文件,带 CM 的安装,除安装配置文件需要添加 CM 外,其余步骤与 openGauss 安装完全相同。

下面以一主二备的部署方案为例,说明如何创建带 CM 的 openGauss 集群 XML 配置文件。

集群安装 xml 样例

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <!-- openGauss整体信息 --> 
    <CLUSTER> 
        <PARAM name="clusterName" value="Cluster_template" /> 
        <PARAM name="nodeNames" value="node1_hostname,node2_hostname,node3_hostname" /> 
    
        <PARAM name="gaussdbAppPath" value="/opt/huawei/install/app" /> 
        <PARAM name="gaussdbLogPath" value="/var/log/omm" /> 
        <PARAM name="tmpMppdbPath" value="/opt/huawei/tmp"/> 
        <PARAM name="gaussdbToolPath" value="/opt/huawei/install/om" /> 
        <PARAM name="corePath" value="/opt/huawei/corefile"/> 
        <PARAM name="backIp1s" value="192.168.0.1,192.168.0.2,192.168.0.3"/> 
     
    </CLUSTER> 
    <!-- 每台服务器上的节点部署信息 --> 
    <DEVICELIST> 
        <!-- node1上的节点部署信息 --> 
        <DEVICE sn="node1_hostname"> 
            <PARAM name="name" value="node1_hostname"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.0.1"/> 
            <PARAM name="sshIp1" value="192.168.0.1"/> 
            <!--CM节点部署信息--> 
            <PARAM name="cmsNum" value="1"/> 
            <PARAM name="cmServerPortBase" value="15000"/> 
            <!--CM Server用于侦听CM Agent连接请求或DBA管理请求的IP地址-->
            <PARAM name="cmServerListenIp1" value="192.168.0.1,192.168.0.2,192.168.0.3"/> 
            <PARAM name="cmServerHaIp1" value="192.168.0.1,192.168.0.2,192.168.0.3"/> 
             <!-- cmServerlevel目前只支持1 -->
            <PARAM name="cmServerlevel" value="1"/> 
            <PARAM name="cmServerRelation" value="node1_hostname,node2_hostname,node3_hostname"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
	    <!--dn--> 
            <PARAM name="dataNum" value="1"/> 
	    <PARAM name="dataPortBase" value="15400"/> 
	    <PARAM name="dataNode1" value="/opt/huawei/install/data/dn,node2_hostname,/opt/huawei/install/data/dn,node3_hostname,/opt/huawei/install/data/dn"/> 
            <PARAM name="dataNode1_syncNum" value="0"/> 
        </DEVICE> 
 
        <!-- node2上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="node2_hostname"> 
            <PARAM name="name" value="node2_hostname"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.0.2"/> 
            <PARAM name="sshIp1" value="192.168.0.2"/> 
            <!-- cm --> 
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
	</DEVICE> 
 
        <!-- node3上的节点部署信息,其中“name”的值配置为主机名称 --> 
        <DEVICE sn="node3_hostname"> 
            <PARAM name="name" value="node3_hostname"/> 
            <PARAM name="azName" value="AZ1"/> 
            <PARAM name="azPriority" value="1"/> 
            <!-- 如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP --> 
            <PARAM name="backIp1" value="192.168.0.3"/> 
            <PARAM name="sshIp1" value="192.168.0.3"/> 
            <!-- cm --> 
            <PARAM name="cmServerPortStandby" value="15000"/> 
            <PARAM name="cmDir" value="/opt/huawei/data/cmserver"/> 
	</DEVICE> 
    </DEVICELIST> 
</ROOT>

部分参数说明如下表:

实例类型参数说明
CMcmServerPortBase主CM Server端口号,默认值5000。
cmServerPortStandby备CM Server端口号,默认值5500。
cmServerListenIp1CM Server用于侦听CM Agent连接请求或DBA管理请求的IP地址。
cmServerHaIp1主、备CM Server间通信的IP地址。Value中左边为主CM Server的主机IP地址,右边为备CM Server的主机IP地址。未设置时,默认根据主、备CM Server所在主机的backIp1生成。
cmDirCM数据文件路径。保存CM Server和CM Agent用到的数据文件,参数文件等。各集群主机上均需配置该参数。
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值