原作者:张均
-
- MogHA简介
- 1.1 关于MogHA
- 1.2 支持模式
-
- 部署环境
-
- MogHA安装部署
- 3.1 操作系统及环境修改
- 3.2 安装步骤
-
- 启动MogHA服务
- 4.1 完善node.conf配置
- 4.2 启动服务
- 4.3 服务管理
- 4.4 查看VIP是否绑定在主机
-
- 简单测试
1. MogHA简介
在前⼀篇⽂章中我们搭建了⼀主两备的MogDB集群,基于主备同步复制技术MogDB集群能够满⾜数据的多副本存储需求,防⽌单点故障的发⽣。数据库支持主备库的部署结构,其目的仅仅是防止单点故障。但数据库并不提供故障检测以及自动化切换主备的功能,所以需要有 MogHA 这样的一套高可用系统,来保证数据库服务的连续性。
1.1 关于MogHA
MogHA 是云和恩墨基于 MogDB 同步异步流复制技术自研的一款保障数据库主备集群高可用的企业级软件系统(适用于 MogDB 和 openGauss 数据库)。
MogHA 能够自主探测故障实现故障转移,虚拟IP自动漂移等特性,使得数据库的故障持续时间从分钟级降到秒级(RPO=0,RTO<30s),确保数据库集群的高可用服务。
1.2 支持模式
- Lite模式
Lite 模式,顾名思义即轻量级模式,该模式仅需在主库和一台同步备机器上启动 MogHA 服务,此时 MogHA 服务可以保证这两台机器上数据库实例的高可用,当主库发生不可修复的问题或者网络隔离时,MogHA 可以自主地进行故障切换和虚拟IP漂移。 - Full模式
Full模式相较于 lite 模式,需要在所有实例机器上运行 MogHA 服务,且所有的实例有由 MogHA 来自动管理,当出现主库故障时,会优先选择本机房同步备进行切换,如果本机房同步备也是故障的情况,会选择同城备机房的同步备进行切换。为了达到RPO=0,MogHA 不会选择异步备库进行切换,以防止数据丢失。该模式会在主备切换时,会自动修改数据库的复制连接及同步备列表配置。
2. 部署环境
本实验使用的环境为上篇文章安装部署的一主二备MogDB集群,具体如下:
| 主机名 | IP | 角色 |
|---|---|---|
| mogdbm | 192.168.213.40 | 主 |
| mogdb1 | 192.168.213.41 | 备 |
| mogdb2 | 192.168.213.42 | 备 |
3. MogHA安装部署
3.1 操作系统及环境修改
- gsql,gs_ctl免密执行
检查pg_hba.conf中本地连接为trust即可:
[root@mogdbm ~]$ cat /opt/mogdb/install/data/dn/pg_hba.conf
host all all 127.0.0.1/32 trust
检验方式:切换到 omm 用户下,执行下面的命令不需要输入密码即可查询到集群状态:
gs_ctl -D [PGDATA] query
#本实验环境的PGDATA=/opt/mogdb/install/data/dn/
#示例如下
[omm@mogdbm ~]$ gs_ctl -D /opt/mogdb/install/data/dn query
[2022-07-12 11:24:07.072][4744][][gs_ctl]: gs_ctl query ,datadir is /opt/mogdb/install/data/dn
HA state:
local_role : Primary
static_connections : 2
db_state : Normal
detail_information : Normal
Senders info:
sender_pid : 113154
local_role : Primary
peer_role : Standby
peer_state : Normal
state : Streaming
sender_sent_location : 0/92403A8
sender_write_location : 0/92403A8
sender_flush_location : 0/92403A8
sender_replay_location : 0/92403A8
receiver_received_location : 0/92403A8
receiver_write_location : 0/92403A8
receiver_flush_location : 0/92403A8
receiver_replay_location : 0/92403A8
sync_percent : 100%
sync_state : Async
sync_priority : 0
sync_most_available : On
channel : 192.168.213.40:15401-->192.168.213.42:41538
sender_pid : 114079
local_role : Primary
peer_role : Standby
peer_state : Normal
state : Streaming
sender_sent_location : 0/92403A8
sender_write_location : 0/92403A8
sender_flush_location : 0/92403A8
sender_replay_location : 0/92403A8
receiver_received_location : 0/92403A8
receiver_write_location : 0/92403A8
receiver_flush_location : 0/92403A8
receiver_replay_location : 0/92403A8
sync_percent : 100%
sync_state : Sync
sync_priority : 1
sync_most_available : On
channel : 192.168.213.40:15401-->192.168.213.41:51112
Receiver info:
No information
- omm需要有sudo权限
由于 MogHA 需要自动挂虚拟IP的操作,内部需要通过 ifconfig 指令来操作网卡,MogHA 是通过数据库安装用户进行启动的,要想执行网卡操作就需要 sudo 权限,在安装期间脚本会检查 /etc/sudoers 配置中是否配置了运行用户的权限,如果存在就跳过配置,如果没有,会尝试自动的将 omm 用户添加到 /etc/sudoers 中,并赋予 ifconfig 的权限。
[root@mogdbm sbin]# which systemctl
/bin/systemctl
[root@mogdbm sbin]# which ifconfig
/sbin/ifconfig
[root@mogdbm sbin]# vim /etc/sudoers
#追加下面两行到文件末尾
omm ALL=(ALL) NOPASSWD:/bin/systemctl
omm ALL=(ALL) NOPASSWD:/sbin/ifconfig
3.2 安装步骤
特别说明:安装过程一定要使用root用户进行操作,涉及到给数据库安装用户sudo权限以及注册系统服务。避免后期运行服务报各种错误.
- 下载安装包
可以在发布记录页面下载对应平台的安装包。本实验选择mogha-2.3.5-CentOS-x86_64的版本。 - 解压安装包
拷贝压缩包到/home/omm/路径下,并执行解压命令
cp mogha-2.3.5-CentOS-x86_64.tar.gz /home/omm
tar -zxvf mogha-2.3.5-CentOS-x86_64.tar.gz
- 执行安装脚本
打开解压后的文件夹/home/omm/mogha
cd /home/omm/mogha
sudo ./install.sh omm /opt/mogdb/install/data/dn
#安装命令中 omm为数据库安装用户,后面地址为[PGDATA]
正确回显如下:
# 安装过程,输出类似以下内容
[2021-10-30 14:29:36]: MogHA installation directory:/home/omm/mogha
[2021-10-30 14:29:36]: runtime user:omm, user group:dbgrp
[2021-10-30 14:29:36]: PGDATA=/opt/mogdb/install/data/dn
[2021-10-30 14:29:36]: LD_LIBRARY_PATH=/opt/mogdb/app/lib:/opt/mogdb/tool/lib:/opt/huawei/install/om/lib:/opt/huawei/install/om/script/gspylib/clib:
[2021-10-30 14:29:36]: GAUSSHOME=/opt/mogdb/app
[2021-10-30 14:29:36]: database port: 15400
[2021-10-30 14:29:36]: architecture:x86_64
[2021-10-30 14:29:36]: modify owner for installation dir...
[2021-10-30 14:29:36]: generate mogha.service file...
[2021-10-30 14:29:36]: copy mogha.service to /usr/lib/systemd/system/
[2021-10-30 14:29:36]: reload systemd
[2021-10-30 14:29:37]: mogha service register successful
[2021-10-30 14:29:37]: add sudo permissions to omm
[2021-10-30 14:29:37]: add successful: NOPASSWD:/usr/sbin/ifconfig
[2021-10-30 14:29:37]: not found node.conf in current directory, generate it
node.conf generated,location:/home/omm/mogha/node.conf
[2021-10-30 14:29:37]: MogHA install successful!
Please edit /home/omm/mogha/node.conf first before start MogHA service!!!
Manage MogHA service by systemctl command:
Start service: sudo systemctl start mogha
Stop service: sudo systemctl stop mogha
Restart service:sudo systemctl restart mogha
Uninstall MogHA service command:
sudo ./uninstall.sh mogha
- 另外两台服务器重复以上操作
4. 启动MogHA服务
4.1 完善node.conf配置
执行完安装脚本后,不要立即启动 MogHA 服务,我们需要先完善一下配置文件(node.conf)再启动服务。特别说明:当第一次安装的时候,node.conf 文件是没有的,需要执行安装脚本后,脚本利用node.conf.tmpl模板文件自动生成一份 node.conf, 得到该文件后,参考配置文件的介绍,完善配置信息。
本试验环境node.conf主要修改以下配置:
- db_port
db_port=15400
#安装脚本会自动填入数据库端口信息,主要是确认信息是否正确
- host主机列表
在host列表中需要将数据库集群中的所有ip地址填入,最多支持九个服务器(一主八备),heartbeat_ips可以不填写。本实验只需要填写三个服务器ip。
[host1]
ip=192.168.213.40
heartbeat_ips=
[host2]
ip=192.168.213.41
heartbeat_ips=
[host3]
ip=192.168.213.42
heartbeat_ips=
- lite_mode
#本实验环境使用FULL模式及对应False值
lite_mode=False
- zone机房列表
# zone1~3 用于定义机房, 不同机房配置独立虚拟IP,
# 切换不会切过去,作为异地保留项目
# - vip: 机房虚拟IP (没有不填)
# - hosts: 本机房内机器列表, 填写机器在配置文件中对应的配置模块名 host1~9, 示例: host1,host2
# - ping_list: 用于检查网络是否通畅的仲裁节点, 例如网关, 支持填写多个IP (逗号分隔)
# - cascades: 机房内的级联机器列表 (配置方式同 hosts, 没有不填)
# - arping: (选填) 机房的 arping 地址, 切换虚拟IP后通知该地址
[zone1]
vip=192.168.213.45 #自拟的虚拟ip
hosts=host1,host2,host3
ping_list=192.168.213.2
cascades=
arping=
- 其余选项可以不做调整,保持默认。
三台服务器配置一致,重复以上操作
4.2 启动服务
三台服务器都需要启动MogHA服务,启动服务指令如下:
sudo systemctl start mogha
4.3 服务管理
- 查看运行状态
sudo systemctl status mogha
#正确回显如下
[omm@mogdbm ~]$ sudo systemctl status mogha
● mogha.service - MogHA High Available Service
Loaded: loaded (/usr/lib/systemd/system/mogha.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-07-12 14:27:21 CST; 25min ago
Docs: https://docs.mogdb.io/zh/mogha/v2.0/installation-and-depolyment
Main PID: 1060 (mogha)
Tasks: 50
Memory: 1.6G
CGroup: /system.slice/mogha.service
├─1060 /home/omm/mogha/mogha -c /home/omm/mogha/node.conf
├─1147 mogha: watchdog
├─1503 mogha: http-server
├─1505 mogha: heartbeat
└─9151 /opt/mogdb/install/app/bin/mogdb -D /opt/mogdb/install/data/dn -M ...
Jul 12 14:27:21 mogdbm systemd[1]: Started MogHA High Available Service.
Jul 12 14:27:22 mogdbm mogha[1060]: MogHA Version: Version: 2.3.5
Jul 12 14:27:22 mogdbm mogha[1060]: GitHash: 7dfa158
Jul 12 14:27:22 mogdbm mogha[1060]: config loaded successfully
- 设置开机启动
sudo systemctl enable mogha
- 关闭服务
#关闭
sudo systemctl stop mogha
#重启
sudo systemctl restart mogha
#卸载
cd /home/omm/mogha
./uninstall.sh
- 日志文件
安装⽬录中
[omm@mogdbm ~]$ 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接⼝的请求⽇志
查看主机mogdbm的心跳日志文件,正常回显应该如下
tailf /home/omm/mogha/mogha_heartbeat.log
#回显:
2022-07-12 14:58:24,611 INFO [__init__.py:61]: ping result: {'192.168.213.2': True, '192.168.213.41': True, '192.168.213.42': True}
2022-07-12 14:58:24,669 INFO [__init__.py:86]: local instance is alive Primary, state: Normal
2022-07-12 14:58:29,789 INFO [__init__.py:61]: ping result: {'192.168.213.2': True, '192.168.213.41': True, '192.168.213.42': True}
2022-07-12 14:58:29,850 INFO [__init__.py:86]: local instance is alive Primary, state: Normal
4.4 查看VIP是否绑定在主机
在主机mogdbm上使用ifconfig指令查看VIP:192.168.213.45是否成功绑定。
[omm@mogdbm mogha]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.213.40 netmask 255.255.255.0 broadcast 192.168.213.255
inet6 fe80::8ce5:e9c:7928:df3f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e7:33:11 txqueuelen 1000 (Ethernet)
RX packets 95303 bytes 9990771 (9.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 426658 bytes 979450827 (934.0 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.213.45 netmask 255.255.255.0 broadcast 192.168.213.255
ether 00:0c:29:e7:33:11 txqueuelen 1000 (Ethernet)
- 可以看到ens33:1后已经成功显示了VIP,绑定成功。
5. 简单测试
关闭主节点看看MogHA能否正常工作
#在主节点上输入以下指令停掉服务
[omm@mogdbm mogha]$ gs_ctl stop -D /opt/mogdb/install/data/dn -m fast
[2022-07-12 15:08:59.891][48707][][gs_ctl]: gs_ctl stopped ,datadir is /opt/mogdb/install/data/dn
waiting for server to shut down..... done
server stopped
然后查询集群状态,会发现主节点重启了,VIP也依旧在主节点上。
[omm@mogdbm mogha]$ gs_om -t status --detail
[ Cluster State ]
cluster_state : Normal
redistributing : No
balanced : Yes
current_az : AZ_ALL
[ Datanode State ]
node node_ip instance state
---------------------------------------------------------------------------
1 mogdbm 192.168.213.40 6001 /opt/mogdb/install/data/dn P Primary Normal
2 mogdb1 192.168.213.41 6002 /opt/mogdb/install/data/dn S Standby Normal
3 mogdb2 192.168.213.42 6003 /opt/mogdb/install/data/dn S Standby Normal
[omm@mogdbm mogha]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.213.40 netmask 255.255.255.0 broadcast 192.168.213.255
inet6 fe80::8ce5:e9c:7928:df3f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:e7:33:11 txqueuelen 1000 (Ethernet)
RX packets 118213 bytes 12394203 (11.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 467004 bytes 1031338046 (983.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.213.45 netmask 255.255.255.0 broadcast 192.168.213.255
ether 00:0c:29:e7:33:11 txqueuelen 1000 (Ethernet)
查看MogHA日志发现,MogHA检测到主库异常后会尝试重新拉起主库.
2022-07-12 15:18:26,629 ERROR [__init__.py:143]: detected local instance is shutdown
2022-07-12 15:18:26,650 INFO [__init__.py:192]: disk is health, try to restart
2022-07-12 15:18:26,650 INFO [__init__.py:240]: try to start local instance, count: 1
2022-07-12 15:18:27,818 INFO [__init__.py:242]: [2022-07-12 15:18:26.672][59037][][gs_ctl]: gs_ctl started,datadir is /opt/mogdb/install/data/dn
[2022-07-12 15:18:26.759][59037][][gs_ctl]: waiting for server to start...
[2022-07-12 15:18:27.817][59037][][gs_ctl]: done
[2022-07-12 15:18:27.817][59037][][gs_ctl]: server started (/opt/mogdb/install/data/dn)
MogHA集群部署成功




