本期内容将介绍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.sh
Starting to run etcd configuration setup
Please set HALO_BASE environment variables before proceed
Press y/Y to continue, any other key to cancel
y
Please input IP list where etcd cluster will be running
e.g. 192.168.1.1,192.168.1.2,192.168.1.3
192.168.137.11,192.168.137.12,192.168.137.13
192.168.137.11 will be used as node IP
Initializing done.
Following steps to be done manually.
Run following commands as root
ln -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.sh
Starting to run patroni configuration setup
Please set HALO_BASE, HALO_HOME, PGDATA environment variables before proceed
Press y/Y to continue, any other key to cancel
y
Please input IP list where etcd cluster will be running
e.g. 192.168.1.1,192.168.1.2,192.168.1.3
192.168.137.11,192.168.137.12,192.168.137.13
Input current node name
Default: halo1
Input VIP for the HA cluster
192.168.137.15
192.168.137.15 will be used as VIP
Input network interface to bind the VIP
Default: ens33
ens33 will be used as network interface
Input VIP netmask
Default: 255.255.255.0
255.255.255.0 will be used as VIP netmask
Input VIP broadcast address
Default: 192.168.137.255
192.168.137.255 will be used as VIP broadcast address
Initialize 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 halo
export PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATH
export PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml
2. Run following commands as root
ln -s /u01/app/halo/product/shield/patroni/conf/patroni.service /usr/lib/systemd/system/patroni.service
3. Add the following line to /etc/sudoers
halo 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:$PATH
export 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. 创建数据库管理用户
在主库上创建以下用户
psql
create user patroni SUPERUSER password 'patroni';
复制
7. 创建watchdog服务(可选)
使用 root 执行以下命令
yum install -y watchdog
modprobe softdog
chown halo /dev/watchdog
systemctl start watchdog
systemctl 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