一、MogHA简介
在前一篇文章中我们搭建了一主两备的MogDB集群,基于主备同步复制技术MogDB集群能够满足数据的多副本存储需求,防止单点故障的发生。
作为企业级的数据库软件,MogDB需要保证数据库尽可能提供不间断的服务,满足上层业务稳定运行的需求。要实现数据库服务的高可用,就需要一套高可用系统,当服务器宕机、实例宕机等多种异常情况出现后能及时发现问题,并通过主备自动切换和虚拟IP的自动漂移等方式快速回复业务。
MogHA是云和恩墨基于MogDB同步和异步流复制技术自研的一款企业级高可用软件系统,适用于 MogDB 和 openGauss 数据库的高可用需求。MogHA 主要针对服务器宕机、实例宕机等多种情况,实现主备自动切换和虚拟IP的自动漂移,使数据库的故障持续时间从分钟级降到秒级,确保业务系统的持续运行。
MogHA具有自主发现实例主备角色,实时监控系统和服务状态,自动故障处理和VIP飘逸,自身进程高可用和防止脑裂等特性。MogHA支持lite和full两种模式。
-
lite模式:顾名思义即轻量级模式,该模式仅需在主库和一台同步备机器上启动 MogHA 服务,此时 MogHA 服务可以保证这两台机器对于应用的连续性服务,当主库发生不可修复的问题或者网络隔离时,MogHA 可以实现即时数据库的 Failover 切主和虚拟IP的漂移操作。 (该模式适用于数据库数量仅有两台或限制切换到其他机器等场景)

-
full模式:该模式需要在启动 MogHA 服务前,在配置文件中配置所有数据库实例的信息(最多9个实例[1主8备]),然后在所有实例机器上运行 MogHA 服务。该模式会在主备切换时,修改数据库的复制连接配置(replconninfo )。

lite模式由于只有两个节点,当其中一台出现网络故障或网络分区时两节点无法互通,MogHA并不能判断是否自身出现故障。为了避免脑裂,需要一个或多个额外的ip用来判断自身网络是否正常,这个ip可以是网关也可以是两个节点都可以连通的第三方节点ip。lite模式下必须在配置文件(node.conf)中配置机器所在 zone 的 ping_list 字段。full模式无此要求。
当发生切换后lite模式下不会修改复制关系配置,而full模式下会对复制关系配置进行修改。
接下来我们实验 具体展示下 MogHA的安装和配置。
二、MogHA安装部署
1、操作系统及环境修改
- Python版本需>=3.6
python3 -V
#输出版本3.6即可
- gsql, gs_ctl 免密执行
#检查pg_hba.conf中本地连接为trust即可,如
[root@mogdb2 ~]# cat /mogdb/data/db1/pg_hba.conf |grep 127.0.0.1
host all all 127.0.0.1/32 trust
#也可切换到omm用户 执行gs_ctl -D [PGDATA] query ,无需密码可返回结果即可
[omm@mogdb ~]$ gs_ctl -D /mogdb/data/db1 query
[2021-11-26 15:03:42.107][43263][][gs_ctl]: gs_ctl query ,datadir is /mogdb/data/db1
HA state:
local_role : Primary
static_connections : 2
db_state : Normal
detail_information : Normal
Senders info:
sender_pid : 41147
local_role : Primary
peer_role : Standby
peer_state : Normal
state : Streaming
sender_sent_location : 0/53E24F0
sender_write_location : 0/53E24F0
sender_flush_location : 0/53E24F0
sender_replay_location : 0/53E24F0
receiver_received_location : 0/53E24F0
receiver_write_location : 0/53E24F0
receiver_flush_location : 0/53E24F0
receiver_replay_location : 0/53E24F0
sync_percent : 100%
sync_state : Quorum
sync_priority : 1
sync_most_available : On
channel : 172.16.71.30:26001-->172.16.71.31:56222
sender_pid : 41148
local_role : Primary
peer_role : Standby
peer_state : Normal
state : Streaming
sender_sent_location : 0/53E24F0
sender_write_location : 0/53E24F0
sender_flush_location : 0/53E24F0
sender_replay_location : 0/53E24F0
receiver_received_location : 0/53E24F0
receiver_write_location : 0/53E24F0
receiver_flush_location : 0/53E24F0
receiver_replay_location : 0/53E24F0
sync_percent : 100%
sync_state : Quorum
sync_priority : 1
sync_most_available : On
channel : 172.16.71.30:26001-->172.16.71.32:52336
- omm用户需要有sudo权限
[root@mogdb ~]# which systemctl
/usr/bin/systemctl
[root@mogdb ~]# which ifconfig
/usr/sbin/ifconfig
vim /etc/sudoers
# 追加下列 2 行到文件末尾
omm ALL=(ALL) NOPASSWD: /usr/sbin/ifconfig
omm ALL=(ALL) NOPASSWD: /usr/bin/systemctl
2、安装MogHA
使用root用户执行
wget https://cdn-mogdb.enmotech.com/mogha/2.2.2/mogha-2.2.2-x86_64.tar.gz
tar -zxf mogha-2.2.2-x86_64.tar.gz -C /home/omm/
cd /home/omm/mogha/
./install.sh omm /mogdb/data/db1
如返回“ MogHA 安装成功!”则标志MogHA已完成安装,接下来需要修改node.conf配置文件
[root@mogdb2 mogha]# ./install.sh omm /opt/mogdb/data
[2021-11-26 15:22:42]: MogHA 安装目录为:/home/omm/mogha
[2021-11-26 15:22:42]: 数据库安装用户为:omm, 所在用户组为:dbgrp
[2021-11-26 15:22:42]: 数据库数据目录为:/opt/mogdb/data
[2021-11-26 15:22:42]: LD_LIBRARY_PATH=/opt/mogdb/app/lib:/opt/mogdb/tools/lib:
[2021-11-26 15:22:42]: GAUSSHOME=/opt/mogdb/app
[2021-11-26 15:22:42]: PGHOST=/opt/mogdb/tools/omm_mppdb
grep: /opt/mogdb/data/postgresql.conf: No such file or directory
[2021-11-26 15:22:42]: 数据库端口: 5432
[2021-11-26 15:22:42]: 当前系统架构为:x86_64
[2021-11-26 15:22:42]: 修改安装目录及其子目录或文件的用户和用户组...
[2021-11-26 15:22:42]: 链接系统的 python3 解释器到虚拟环境...
[2021-11-26 15:22:42]: 当前系统中 Python3 的路径为:/usr/bin/python3
[2021-11-26 15:22:42]: Python3 的版本为:3.6
[2021-11-26 15:22:42]: 虚拟环境中 python 解释器链接成功
[2021-11-26 15:22:42]: 生成 mogha.service 文件...
[2021-11-26 15:22:42]: 复制 mogha.service 文件到 /usr/lib/systemd/system/
[2021-11-26 15:22:42]: 重载配置文件
[2021-11-26 15:22:43]: mogha 服务注册成功
[2021-11-26 15:22:43]: 用户 omm 已经存在于 /etc/sudoers 文件中,请自行确认权限!
[2021-11-26 15:22:43]: 生成 supervisord.conf 配置文件...
[2021-11-26 15:22:43]: supervisord.conf 生成成功
[2021-11-26 15:22:43]: 没有在安装目录中发现 node.conf 配置文件
[2021-11-26 15:22:43]: 生成 node.conf...
node.conf 生成成功,位于目录:/home/omm/mogha/node.conf
[2021-11-26 15:22:43]: MogHA 安装成功!
请修改 /home/omm/mogha/node.conf 配置文件后再启动服务 !!!
启动 MogHA 的命令:
systemctl start mogha
3、修改配置文件
切换到omm用户,修改配置文件
su - omm
vim /home/omm/mogha/node.conf
主要有以下几项配置需要修改
- db_port
# 数据库端口,用于连接数据库
db_port=26000
- host 主机列表
主机列表需要用户将自己的数据库集群中的所有主备实例所在的服务器的业务IP填写到 ip 字段。 如果没有心跳IP的话,可以不填写置空,如果有则填写,如果有多个心跳IP,则以英文半角逗号分隔填写
# 这部分从host1-8,每个代表一个机器
[host1]
# 业务网络ip
ip=172.16.71.30
# 心跳网络ip,允许配置多个心跳网络,以逗号隔开
heartbeat_ips=
[host2]
ip=172.16.71.31
heartbeat_ips=
[host3]
ip=172.16.71.32
heartbeat_ips=
[host4]
ip=
heartbeat_ips=
[host5]
ip=
heartbeat_ips=
[host6]
ip=
heartbeat_ips=
- lite_mode
# 是否使用 lite 模式,可选值:True / False
# lite 模式下,即便是一主多备,也只需在主和同步备启动服务。
# 该值为 False 的话,即为 full 模式,需要在所有节点启动高可用服务。
# 二者的区别:lite 模式,HA服务不会修改数据库的主备相关配置,而 full 模式下会自动修改
lite_mode=False
- zone 机房列表
zone 在这里代表的是机房的概念 vip:不同的机房拥有各自的虚拟IP(VIP),虚拟IP用于业务访问,解耦服务器的私有IP,便于主备切换 arping: 可以留空,系统会采用广播地址
ping_list:用于检查网络的中间节点IP,一般可以选择网关地址
hosts:本机房中的主机列表,特别强调,这里不是填写主机名或主机IP,这里是用于归类上一步中填写的 host 列表,所以这个字段应该填写的是本配置文件中定义的 host1,host2 ... 等等这种 section 名,举例:假如 host1, host2 这两个机器同属于 zone1 这个机房,那么这里的 hosts 应该填写为: hosts=host1,host2 (以英文半角逗号分隔)
cascade: 本机房中的级联备列表,配置方式同 hosts
# 这部分主要用于区分机房,不同机房会有自己的VIP,
# zone可以配置zone1,zone2,zone3,但切换不会切过去,作为异地保留项目
[zone1]
# 本机房的VIP
vip=172.16.71.29
# 本机房的arping地址,如果不知道,可以留空,会采用arp广播模式
arping=
# 检查网络的中间节点,一般是可以ping通的网关地址
ping_list=172.16.71.2
# 本机房的机器列表,例如 host1,host2,host3
hosts=host1,host2,host3
# 本机房的级联备库列表
cascade=
[zone2]
vip=
arping=
ping_list=
hosts=
cascades=
[zone3]
vip=
arping=
ping_list=
hosts=
cascades=
三、启动MogHA
1、服务管理
- 启动服务
sudo systemctl start mogha
- 查看运行状态
sudo systemctl status mogha
- 设置开机启动
sudo systemctl enable mogha
- 关闭服务
#关闭
sudo systemctl stop mogha
#重启
sudo systemctl restart mogha
#卸载
cd /home/omm/mogha
./uninstall.sh
- 日志文件
在安装目录中
[omm@mogdb2 ~]$ ll /home/omm/mogha/*.log
-rw-r--r--. 1 omm dbgrp 1564 Nov 26 15:45 /home/omm/mogha/mogha_heartbeat.log //记录HA的心跳日志,也是排查问题主要的优先检查的日志文件
-rw-r--r--. 1 omm dbgrp 1564 Nov 26 15:45 /home/omm/mogha/mogha_web.log //记录 web api 接口的请求日志
检查心跳日志发现有报错,应该是mogha配置文件中db_datadir配置错误
[omm@mogdb ~]$ tailf /home/omm/mogha/mogha_heartbeat.log
File "lib/_helpers.py", line 85, in open_or_return
FileNotFoundError: [Errno 2] No such file or directory: '/opt/mogdb/data/postgresql.conf'
[44273] Failed to execute script main
Traceback (most recent call last):
File "main.py", line 53, in <module>
File "lib/decorators.py", line 13, in get_instance
File "config.py", line 87, in __init__
File "lib/pgconf.py", line 69, in parse
File "lib/_helpers.py", line 85, in open_or_return
FileNotFoundError: [Errno 2] No such file or directory: '/opt/mogdb/data/postgresql.conf'
修改配置文件后重启mogha
# 数据库的数据目录,用于信号发送等本地通讯行为
db_datadir=/opt/mogdb/data
--------->修改为
# 数据库的数据目录,用于信号发送等本地通讯行为
db_datadir=/mogdb/data/db1
重启mogha
sudo systemctl restart mogha
tailf /home/omm/mogha/mogha_heartbeat.log 可以看到VIP已绑定在主节点

通过VIP可以直接访问到主库

2、简单切换测试
我们关闭主节点看看MogHA能够正常failover。在主上执行以下命令
gs_ctl stop -D /mogdb/data/db1 -m fast
观察一段时间发现主节点重启了,VIP仍然在主节点上

查看MogHA日志发现,MogHA检测到主库异常后尝试重新拉起主库,主库启动成功未故未触发VIP的切换


通过VIP依然能正常访问主库

小结
本文介绍了MogDB企业级高可用组件MogHA,实验了MogHA的部署、配置和管理等操作,进行了关闭主库的测试。测试发现MogHA能快速发现主库异常,并进行了重启主库的操作,恢复后通过VIP访问主库未受影响。接下来我们还将对MogHA在各种故障场景下的高可用功能进行测试,以及测试MogHA不同的failover配置的区别,并验证对客户端访问的影响。




