本文档介绍了openGauss的主备架构、如何修改事务提交方式(同步、异步)、解释了主备日志复制的相关GUC参数、以及对openGauss3.0新添加的CM工具进行了介绍。
本文档的内容主要由其他文章及官方文档学习整理而来。
参考链接:https://cdn.modb.pro/db/108743
openGauss的主备HA架构图如下。
ParallelRecov:支持备机并行日志恢复
两地三中心的部署架构,如下图。
更多术语解释可查看官方文档: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文件。
通常情况下,一个事务产生的日志的同步顺序如下:
1. 主机将日志内容写入本地内存。
2. 主机将本地内存中的日志写入本地文件系统。
3. 主机将本地文件系统中的日志内容刷盘。
4. 主机将日志内容发送给备机。
5. 备机接受到日志内容,存入备机内存。
6. 备机将备机内存中的日志写入备机文件系统。
7. 备机将备机文件系统中的日志内容刷盘。
8. 备机回放日志,完成对数据文件的增量更新。
事务提交方式由参数synchronous_commit
决定,共有6种提交方式,如下:
- on:表示主机事务提交需要等待备机将对应日志刷新到磁盘。
- off:表示主机事务提交无需等待主机自身将对应日志刷新到磁盘,通常也称为异步提交。
- local:表示主机事务提交需要等待主机自身将对应日志刷新到磁盘,通常也称为本地提交。
- remote_write:表示主机事务提交需要等待备机将对应日志写到文件系统(无需刷新到磁盘)
- remote_receive:表示主机事务提交需要等待备机接收到对应日志数据(无需写入文件系统)
- remote_apply:表示主机事务提交需要等待备机完成对应日志的回放操作。
默认值:on
上述6种提交方式中,off和local属于非同步提交,其他均为同步提交。
下面给出on
和local
两种方式的事务提交时序图。
1、synchronous_commit = on
(默认值)
该方式有性能损耗,可靠性高。
2、synchronous_commit = local
该方式性能高,可靠性差。
GUC: Grand Unified Configuration,数据库运行参数。配置这些参数可以影响数据库系统的行为。
更多GUC参数可查看:GUC参数说明
修改GUC参数的方法:重设GUC参数
**参数说明:**WalWriter进程的写间隔时间。如果时间过长可能造成WAL缓冲区的内存不足,时间过短会引起WAL不断写入,增加磁盘I/O负担。
取值范围:整型, 1~10000(毫秒)
**默认值:**200ms
参数说明:设置checkpoint_timeout周期内所保留的最少WAL日志段文件数量。每个日志文件大小为16MB。
取值范围:整型,最小值1
提升此参数可加快大数据的导入速度,但需要结合checkpoint_timeout、shared_buffers这两个参数统一考虑。这个参数同时影响WAL日志段文件复用数量,通常情况下pg_xlog文件夹下最大的复用文件个数为2倍的checkpoint_segments个,复用的文件被改名为后续即将使用的WAL日志段文件,不会被真正删除。
**默认值:**64
shared_buffers
**参数说明:**设置openGauss使用的共享内存大小。增加此参数的值会使openGauss比
系统默认设置需要更多的System V共享内存。
**默认值:**8MB
**参数说明:**设置自动WAL检查点之间的最长时间。
取值范围:整型, 30~3600(秒)
在提升checkpoint_segments以加快大数据导入的场景也需将此参数调大,同时这两个参数提升会加大shared_buffers的负担,需要综合考虑。
**默认值:**15min
**参数说明:**备DN表示当前回放的最新检查点位置和当前日志回放位置之间日志量的期望值,主DN表示恢复点到当前最新日志之间日志量的期望值,关注RTO的情况下,这个值建议不宜过大。
取值范围:整型,163840~2147483647,单位为KB
**默认值:**1GB
**参数说明:**设置最大并行回放线程个数。
取值范围:整型,0~20
**默认值:**1(安装工具默认设置为4,以获得更好地性能)
参数说明:指定事务日志发送进程的并发连接最大数量。不可大于等于max_connections。
wal_level必须设置为archive、hot_standby或者logical以允许备机的连接。
取值范围:整型,0 ~ 1024(建议取值范围:8 ~ 100)
**默认值:**16
**参数说明:**Xlog日志文件段数量。设置“pg_xlog”目录下保留事务日志文件的最小数目,备机通过获取主机的日志进行流复制。
**取值范围:**整型,2 ~ INT_MAX
**默认值:**16
设置建议:
个人思考:1)被产生的新事务日志覆盖、2)主机日志回收,这两个关键语句,意味着主机的WAL日志已经被覆盖了,丢失了旧的数据,如果此时有备机要重建,读取主机WAL日志进行回放,就会丢失数据,与主机数据不一致!因此,我觉得这个参数决定了在备机故障断连的情况下,主机的WAL日志的保存上限。
参考链接:https://my.oschina.net/u/5059795/blog/5515466
CM,即Cluster Manager,数据库管理模块。管理和监控系统中各个功能单元和物理资源的运行情况,确保整个系统的稳定运行。
CM 提供了丰富的集群管理能力,如集群、节点、实例级的启停,集群状态查询、选主、主备切换、日志管理等。
CM 架构图如上所示,组件包括 4 个可执行文件:
cm_server:(cms)cm 的服务端,负责收集 cma 上报的状态,并作为仲裁中心和全局配置中心,集群能否稳定运行以及在发生单点故障后,备实例能否正常切换为主来保证集群的可用性,都与 CMS 是否稳定相关。
cm_agent:(cma)通常集群中的每台机器都安装一个,负责管理本节点所有实例的状态检测和上报以及 cms下发命令的执行。
om_monitor:通常集群中的每台机器都安装一个,负责保障本节点 cm_agent 进程的健康。
cm_ctl:cm 的客户端工具,提供集群管理操作。
cm 接管集群后,会周期性的对集群中的所有进程 (包括 cma,cms,openGauss 等进程) 进行探测监控,负责集群进程的保活及僵死恢复。
cma 会周期性的采集 openGauss 数据库的运行状态,采集指标包括主备状态,日志位置及回放速率,日志发送接收进度等信息,并汇总在 cms,这些信息将被用于选主仲裁及工具展示。
cma 提供了日志管理能力,通过日志文件总大小,日志文件数量,日志时间等维度对日志目录进行监控,自动归档,清理日志。
当数据库主机发生不可恢复的故障而无法继续提供服务时,集群管理会感知并基于 qurom 协议,进行选主仲裁。CM 的仲裁都是使用的状态机模式,依据当前数据库状态进行仲裁逻辑的推进。
以上是 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。
在安装带 CM 的 openGauss 之前,需要创建 clusterconfig.xml 配置文件。XML 文件包含部署 openGauss+CM 的服务器信息、安装路径、IP 地址以及端口号等。用于告知 openGauss、CM 如何部署。用户需根据不同场配置对应的 XML 文件,带 CM 的安装,除安装配置文件需要添加 CM 外,其余步骤与 openGauss 安装完全相同。
下面以一主二备的部署方案为例,说明如何创建带 CM 的 openGauss 集群 XML 配置文件。
集群安装 xml 样例
<ROOT>
<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>
<DEVICE sn="node1_hostname">
<PARAM name="name" value="node1_hostname"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
<PARAM name="backIp1" value="192.168.0.1"/>
<PARAM name="sshIp1" value="192.168.0.1"/>
<PARAM name="cmsNum" value="1"/>
<PARAM name="cmServerPortBase" value="15000"/>
<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"/>
<PARAM name="cmServerlevel" value="1"/>
<PARAM name="cmServerRelation" value="node1_hostname,node2_hostname,node3_hostname"/>
<PARAM name="cmDir" value="/opt/huawei/data/cmserver"/>
<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>
<DEVICE sn="node2_hostname">
<PARAM name="name" value="node2_hostname"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
<PARAM name="backIp1" value="192.168.0.2"/>
<PARAM name="sshIp1" value="192.168.0.2"/>
<PARAM name="cmServerPortStandby" value="15000"/>
<PARAM name="cmDir" value="/opt/huawei/data/cmserver"/>
DEVICE>
<DEVICE sn="node3_hostname">
<PARAM name="name" value="node3_hostname"/>
<PARAM name="azName" value="AZ1"/>
<PARAM name="azPriority" value="1"/>
<PARAM name="backIp1" value="192.168.0.3"/>
<PARAM name="sshIp1" value="192.168.0.3"/>
<PARAM name="cmServerPortStandby" value="15000"/>
<PARAM name="cmDir" value="/opt/huawei/data/cmserver"/>
DEVICE>
DEVICELIST>
ROOT>
部分参数说明如下表:
实例类型 | 参数 | 说明 |
---|---|---|
CM | cmServerPortBase | 主CM Server端口号,默认值5000。 |
cmServerPortStandby | 备CM Server端口号,默认值5500。 | |
cmServerListenIp1 | CM Server用于侦听CM Agent连接请求或DBA管理请求的IP地址。 | |
cmServerHaIp1 | 主、备CM Server间通信的IP地址。Value中左边为主CM Server的主机IP地址,右边为备CM Server的主机IP地址。未设置时,默认根据主、备CM Server所在主机的backIp1生成。 | |
cmDir | CM数据文件路径。保存CM Server和CM Agent用到的数据文件,参数文件等。各集群主机上均需配置该参数。 |