4.1.1.1.3-PostgreSQL_XL高可用性
(1)GTM不可用导致整个Postgresql集群不可用。 (2)对于Coordinator,不一定需要需要实现高可用。 (3)对于DataNode,实现高可用的方式,外部使用统一IP访问,所以需要实现VIP。 (4)数据分库后,对于使用Postgresql单机进行存储的数据库,需要实现Postgresql服务高可用。 (5)防止出现脑裂,实现高可用的服务,在同一时刻仅有一台物理节点提供服务。对于开机自动重启的服务,需要在rc.local手动关闭。 (6)实现30s内自动主备切换,新修改数据不丢失,保证数据一致性。 (7)优点:只要两台GTM物理机器,便可实现无数次高可用。缺点:nfs成为单点,需要网络传输。
2. 软件准备
2.1 Keepalived
2.1.1 原理
安装了keepalived的节点,监听配置高可用服务的端口,服务可用的节点拥有虚拟IP,外部服务通过虚拟IP路由到该节点。
2.1.2 安装
本次测试是将数据节点存放在NFS上,同时只启动一个datanode。使用Keepalived对节点的健康程度进行监测,一旦发现节点死亡,启动备节点同时将虚拟ip进行漂移,在不重启postgres的情况下完成故障转移。 (1) keepalived配置 (2) 脚本编写
2.2 nfs(网络文件系统)
2.2.1 原理
启动了nfs服务的服务器中的某一目录,可在其他节点客户端被挂载,实现该目录在多节点间共享。
2.2.2 安装
客户端和服务器都安装rpcbind和nfs-utils,在服务器端的/etc/exports文件中写入要共享的文件夹如:/home/pgxl/postgres_test/data/dn *(rw,sync,no_root_squash),括号的配置意思是读写权限、同步在内存、无需root权限。在启动服务时要先启动rpcbind,再启动nfs。 systemctl start rpcbind systemctl start nfs mount -t nfs 192.168.1.149: /home/pgxl/postgres_test/data/dn dn
3. 高可用组件
3.1 GTM
3.1.1 基于共享存储的高可用方案
表1 GTM共享存储高可用架构服务列表 |IP|服务名| |------|------| |192.168.1.147|gtm1、keepalived| |192.168.1.149|gtm2、keepalived| |192.168.1.167|gtm_proxy1、coord1、dn1、nfs(共享存储)|
3.1.2 步骤:
(1)安装启动keepalived,参考本文2.1.2。 (2)安装启动nfs,参考本文2.2.2。 (3)安装Postgresql_XL集群,其中gtm1、gtm_proxy1、coord1和dn1,参考PostgreSQL集群部署。 (4)停止gtm1服务,观察gtm2是否能自动启动,并记录启动时间。
3.2 DataNode
表2 DataNode主从数据同步高可用架构服务列表 |IP|服务名| |192.168.1.147|Datanode2| |192.168.1.149|Datanode1、gtm、gtm_proxy、coord1|
参考资料
- 使用corosync+pacemaker构建高可用集群
- PGXC HA配置和切换
- Centos7上利用corosync+pacemaker+crmsh构建高可用集群
- HA cluster原理
- Linux 添加服务详解
- corosync + pacemaker + crmsh 配置文件及常用指令介绍
- CentOS 7下搭建高可用集群
- Postgres-XL添加datanode_slave节点及故障恢复测试
- Postgres-XL + Keepalived 数据库部署
- Postgres-XL添加datanode_slave节点及故障恢复测试(PS,PGXC性能)
- Postgresql-9.6 使用pg_rewind主备切换恢复(PS,是否实现postgresql多次主备切换)
附录
附录A:Keepalived配置文件
附录B:vrrp_script check_dn { # 自身状态检测 script "/etc/keepalived/chk_dn_master.sh" interval 3 weight 20 } 上面的配置是监测脚本的定义,script配置的是脚本的位置,interval是脚本执行的间隔,weight是根据脚本返回的结果对节点权重的加减的数值,(当weight>0时脚返回0则priority=priority+weight,返回1时不变;当weight<0时脚本返回0时不变,当脚本返回1时priority=priority-weight),weight的取值为1~255。 vrrp_instance VI_3 { # 使用单播通信,默认是组播通信 unicast_src_ip 192.168.1.149 #填写本地ip unicast_peer { 192.168.1.147 #填写对端ip } # 初始化状态 state MASTER # 虚拟 ip 绑定的网卡 interface eno1 # 此 ID 要与 Backup 配置一致 virtual_router_id 50 # 默认启动优先级,要比 Backup 大点,但要控制量,保证自身状态监测生效 priority 100 #主从切换的间隔 advert_int 1 #节点间的认证 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.185 # 虚拟 ip 地址 } #配置监测脚本 track_script { check_dn } }
附录B:高可用服务监听仲裁脚本#!/bin/bash active_49=` nmap 192.168.1.149 -p 8666|grep open | wc -l` if [ $active_49 = 1 ]; then exit 0 else { exit 1 } fi
附录C:PostgreSQL高可用服务监听仲裁脚本#!/bin/bash while true do { sleep 1 active=`nmap 192.168.1.191 -p 8666|grep open | wc -l` if [ $active -eq 0 ]; then { r=$[ $RANDOM % 2 ] if [ $r -eq 0 ]; then { ssh 192.168.1.147 "cd /home/gtm/postgres/data/gtm;./start.sh" } else { ssh 192.168.1.149 "cd /home/gtm/postgres/data/gtm;./start.sh" } fi } fi } done
#!/bin/bash active_47=` nmap 192.168.1.147 -p 7654 | grep open |wc -l` rec=`ls /var/lib/pgsql/9.5/data/ | grep recovery.conf | wc -l` active_49=` nmap 192.168.1.149 -p 7654 | grep open |wc -l` if [ $ active_49 -eq 1 -a $rec -eq 1 -a $active_47 -eq 0 ]; then touch /var/lib/pgsql/9.5/data/trigger fi if [ $active_49 -eq 1 ]; then exit 0 else { mv /var/lib/pgsql/9.5/data/recovery.done /var/lib/pgsql/9.5/data/recovery.conf exit 1 } fi