keepalived实现PostgreSQL流复制故障自动迁移HA
keepalived是一个路由软件,主要用于linux系统上的负载均衡(load balancing)和高可用(high availability)。
keepalived基于IPVS(IP Virtual Server)提供四层负载均衡功能,Keepalived提供一组checker根据服务器的健康状况来动态维护负载均衡资源池。
另一方面,keepalived基于VRRP协议提供高可用功能。可以由多台服务器组成一个热备组,一个热备组使用一个或一组虚拟ip对外提供服务。一个组内只有一台服务器接管虚拟ip对外提供服务,成为master,其余服务器为backup服务器。当master出现问题时,会执行一次选举(election)选出一台新的master服务器来接管虚拟ip对外提供服务。master服务器负责对虚拟ip请求的相应,并定时发出VRRP通告,backup服务器则待时而动。
keepalived的配置文件中由vrrp_sync_group和vrrp_instance提供高可用配置,由virtual_server_group和virtual_server提供负载均衡配置。
负载均衡配置提供HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK,ICMP_CHECK等检查器,其中ICMP_CHECK工作在三层,TCP_CHECK工作在四层,而HTTP_GET则工作在七层。
高可用配置时,keepalive可以检测网络故障和自身运行状态,还可以设定用户脚本来检测服务器状态,从而当master出现故障时,可以通过重新选举来进行主备切换。
高可用配置
此处主要讲述高可用配置,下面是由两个服务器组成一个热备组用于PostgreSQL数据库高可用服务的配置:
1 | # Configuration File for keepalived |
MASTER和BACKUP节点的优先级如何调整?
首先,每个节点有一个初始优先级,由配置文件中的priority配置项指定,MASTER节点的priority应比BAKCUP高。运行过程中keepalived根据vrrp_script的weight设定,增加或减小节点优先级。
规则如下:
- 当weight > 0时,vrrp_script script脚本执行返回0(成功)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
- 当weight < 0时,vrrp_script script脚本执行返回非0(失败)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。
- 当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER。
- 优先级并不会不断的提高或降低,只会根据脚本返回结果计算一次。
什么时候会发生主从切换?
当监测的网络接口发生故障、keepalived实例关闭或者主备优先级发生变化时,会重新选择新的master服务器来接管服务。
防止脑裂(brain split)
将主备服务器都设置为BACKUP状态,并且将master服务器(初始优先级高的服务器)配置为nopreempt,当master因为各种可能原因下线,然后重新恢复上线时,虽然恢复上线的master优先级高于当前master的优先级,但不会去抢夺控制权。
这样会造成一个问题,除非当前的master网络故障或keepalived实例停止,其优先级就算降低后低于原来的master服务器,因为设置了nopreempt,也不会切换到原来的master。所以原master恢复上线之前,应该降低其优先级,并且要低于当前master的优先级,然后去掉nopreempt,而当前master添加nopreempt。
如果没有设置nopreempt,当master因为网络原因短暂下线后,backup服务器接管vip,并且PostgreSQL备库升级为主库。当原来的master网络恢复,重新上线时,会重新成为master,而此时就有了两个主库,发生了分裂。
通知脚本
可以在通知脚本中处理PostgeSQL备库提升,主库停止,发送通知等各种事务。
查看VRRP通告
可以使用tcpdump命令监测VRRP通告,可以看到当前的master服务器为192.168.0.3
1 | $ sudo tcpdump -vvv -n -i eth0 host 224.0.0.18 |
如果热备组内的服务器跨越子网,则交换路由设备必须开启VRRP多播报文转发。
References:
[1]man keepalived.conf
[2]Keepalived在PostgreSQL高可用中的运用
[3]Linux集群实现–Keepalived-1.2.7
[4]PostgreSQL+pgpooll+Keepalived双机HA方案
[5]keepalived vip漂移基本原理及选举算法
[6]Note on using VRRP with Virtual MAC address
[7]Keepalived 集群软件高级使用(工作原理和状态通知)
[8]keepalived
===
[erq]