本期内容将介绍Halo数据库的高可用解决方案Shield,并在虚拟环境中搭建三节点的Shield。Halo Shield 是一套自动管理 Halo 主从数据库的高可用解决方案。该方案包括以下几个组成部分。1. Etcd 分布式键值数据库2. Patroni 流复制创建、管理、监控和自动故障转移进程。
Etcd 最少需要三个节点且为奇数来进行 leader 选举。一般可以和Halo数据库部署在相同的服务器上。Etcd 集群之间会进行心跳检测,当发生网络故障时,节点数少的etcd集群会不可用,从而避免脑裂。
Patroni 运用 etcd 集群存储、检测Halo 主从节点的状态与配置信息,当由于故障使得某个节点无法工作,Patroni会自动侦测故障,并通过 etcd 更新节点信息,从而通知所有其他节点。如果该故障节点是主节点,Patroni 还会自动切换,并重新绑定VIP到新的主节点,从而减少对应用系统的影响。
Patroni 通过连接 etcd 对其它节点做心跳检测,当主节点无法更新etcd中的leader lock,patroni会终止当前节点的Halo数据库从而避免脑裂。

应用系统通过访问虚拟IP(VIP)访问数据库。VIP通过网卡绑定在主库的网卡上,当发生故障转移时,主备节点切换,VIP随之绑定到新主库的网卡上,从而实现平滑的故障转移。
下面我们在vmware workstation中安装三台虚拟机,安装Oracle Linux7.9的操作系统。三台虚拟机安装Halo的软件,其中一台作为主库,初始化创建数据库集群,另外两台作为从库,使用pg_basebackup创建流复制的异步复制的从库。Halo安装好后,Etcd和Patroni的软件也随之安装,需要配置Etcd和Patroni,然后启动和开机自启动Etcd和Patroni的服务。
虚拟机的准备
准备三台虚拟机,内存2G,硬盘40G,网络适配器为仅主机模式,CD/DVD选择Oracle Linux 7.9的iso文件。安装操作系统,主机名为Halo1,Halo2,Halo3,网址为仅主机模式的网段,这里是192.168.137.0/24网段,规划为192.168.137.11,192.168.137.12,192.168.137.13,VIP规划为192.168.137.15。最好不要使用最小化安装,建议选择server with GUI。

2. Halo数据库软件的安装和主库的初始化。
参照
https://mp.weixin.qq.com/s/vJ0rl_KGUkwwxa3gxQlnWA 一宝,公众号:Halo TechHalo数据库安装,三分钟快速上手!你的第一个国产数据库!
注意特别要关闭防火墙和开机不自启动防火墙,并关闭selinux。halo1主机初始化数据库集群,halo2和halo3仅安装数据库软件,不进行初始化。
3. 构建两个从库的流复制环境。
参照
https://mp.weixin.qq.com/s/NXEQouettch01HmANXhXgA ZhouLanQing,公众号:Halo TechHalo数据库之流复制概述
注意将三台主机的主机名和IP地址写到三台主机的hosts文件中。
4.Etcd的配置。
确保 HALO_BASE 环境变量已设置,在所有需要运行 etcd 服务的服务器上用 halo用户执行 etcd_config.sh,输入etcd 将要运行的所有服务器 IP 地址。
export HALO_BASE=/u01/app/halo$HALO_BASE/product/shield/etcd/v3.5.2/conf/etcd_config.shStarting to run etcd configuration setupPlease set HALO_BASE environment variables before proceedPress y/Y to continue, any other key to cancelyPlease input IP list where etcd cluster will be runninge.g. 192.168.1.1,192.168.1.2,192.168.1.3192.168.137.11,192.168.137.12,192.168.137.13192.168.137.11 will be used as node IPInitializing done.Following steps to be done manually.Run following commands as rootln -s /u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd.service /usr/lib/systemd/system/etcd.service
根据输出信息,在所有运行 etcd 服务的服务器上用 root 用户创建自启动服务连接.
ln -s u01/app/halo/product/shield/etcd/v3.5.2/conf/etcd.service usr/lib/systemd/system/etcd.service

三节点都运行。
5. patroni的配置。
确保 HALO_BASE、HALO_HOME、PGDATA 环境变量已设置,在所有主备服务器上用halo用户执行 patroni_config.sh,输入etcd 将要运行的所有服务器 IP 地址、输入当前服务器名和VIP信息。
export HALO_BASE=/u01/app/halo$HALO_BASE/product/shield/patroni/conf/patroni_config.shStarting to run patroni configuration setupPlease set HALO_BASE, HALO_HOME, PGDATA environment variables before proceedPress y/Y to continue, any other key to cancelyPlease input IP list where etcd cluster will be runninge.g. 192.168.1.1,192.168.1.2,192.168.1.3192.168.137.11,192.168.137.12,192.168.137.13Input current node nameDefault: halo1Input VIP for the HA cluster192.168.137.15192.168.137.15 will be used as VIPInput network interface to bind the VIPDefault: ens33ens33 will be used as network interfaceInput VIP netmaskDefault: 255.255.255.0255.255.255.0 will be used as VIP netmaskInput VIP broadcast addressDefault: 192.168.137.255192.168.137.255 will be used as VIP broadcast addressInitialize python ...Python initializing done.Initializing done.Following steps to be done manually.1. Add the following line into the end of .bash_profile of user haloexport PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATHexport PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml2. Run following commands as rootln -s /u01/app/halo/product/shield/patroni/conf/patroni.service /usr/lib/systemd/system/patroni.service3. Add the following line to /etc/sudoershalo ALL=(ALL) NOPASSWD: /usr/sbin/ip, /usr/bin/arping, /usr/sbin/iptables
根据输出信息,在所有主备服务器上执行以下步骤:
1.在 halo 用户的 .bash_profile 中加入
export PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATHexport PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml
2.用 root 用户创建自启动服务连接
ln -s /u01/app/halo/product/shield/patroni/conf/patroni.service /usr/lib/systemd/system/patroni.service
3.用 root 用户在 /etc/sudoers 中加入以下行,vim打开后使用:wq!保存。
halo ALL=(ALL) NOPASSWD: /usr/sbin/ip, /usr/bin/arping, /usr/sbin/iptables


6. 创建数据库管理用户
在主库上创建以下用户
psqlcreate user patroni SUPERUSER password 'patroni';
7. 创建watchdog服务(可选)
使用 root 执行以下命令
yum install -y watchdogmodprobe softdogchown halo /dev/watchdogsystemctl start watchdogsystemctl enable watchdog
8. 启动ETCD服务
在所有配置了etcd服务的服务器上用root启动服务
systemctl start etcd
确保至少同时在2台服务器上启动etcd服务,如果只在1台服务器上启动,etcd会因为找不到其他服务器而启动失败.
如需开机自启动etcd服务,用root执行以下命令
systemctl enable etcd
查询etcd运行状态
$HALO_BASE/product/shield/etcd/v3.5.2/etcdctlendpoint status --cluster=true -w table

9. 启动patroni服务
在所有主备服务器上用root启动patroni服务
systemctl start patroni
如需开机自启动patroni服务,用root执行以下命令
systemctl enable patroni
10. 主备节点查询,以halo用户执行。
patronictllist
11. 停止自动主备切换
patronictl pause

12. 手动主备切换
patronictl switchover

13. 恢复自动故障转移。
patronictl resume





