高可用解决方案

本期内容将介绍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的服务。

 

  1. 虚拟机的准备

准备三台虚拟机,内存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数据库软件的安装和主库的初始化。

注意特别要关闭防火墙和开机不自启动防火墙,并关闭selinux。halo1主机初始化数据库集群,halo2和halo3仅安装数据库软件,不进行初始化。

3. 构建两个从库的流复制环境。

注意将三台主机的主机名和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 cancely
Please 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.13
192.168.137.11 will be used as node IP
Initializing 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.sh
Starting to run patroni configuration setupPlease set HALO_BASE, HALO_HOME, PGDATA environment variables before proceedPress y/Y to continue, any other key to cancely
Please 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.13
Input current node nameDefault: halo1 

Input VIP for the HA cluster192.168.137.15192.168.137.15 will be used as VIP
Input network interface to bind the VIPDefault: ens33 
ens33 will be used as network interface
Input VIP netmaskDefault: 255.255.255.0 
255.255.255.0 will be used as VIP netmask
Input VIP broadcast addressDefault: 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 haloexport PATH=/u01/app/halo/product/shield/patroni/python/bin:$PATHexport PATRONICTL_CONFIG_FILE=/u01/app/halo/product/shield/patroni/conf/patroni_halo.yml
2. Run following commands as rootln -s /u01/app/halo/product/shield/patroni/conf/patroni.service /usr/lib/systemd/system/patroni.service
3. 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