三、配置文件详解
Keeaplived的配置包含三部分:
1)全局配置,配置邮件等;
2)VRRPD配置,配置VRRP实例;
3)LVS配置,配置LVS的应用服务器;
若只是单独使用keepalived,通过IP漂移实现服务的高可用,则只需要配置前两部分就可以,若结合LVS使用,实现LVS负载均衡层的高可用、应用服务层的状态监控,则还需要配置第三部分。
具体配置参考Keepalived权威指南中文
四、Keepalived监控端口
keepalived监控类型有三种,最常见的两种就是主服务器网络不通和主服务器keepalived服务down掉,备份机能够自动接管。 还有一种类型是监控应用程序的服务状态,可以用vrrp_script实现,例如监控postgreSQL端口5432。
主服务器配置
vim /etc/keepalived/keepalived.conf global_defs { router_id HA_1 } vrrp_script chk_postgreSQL_port { script "/tcp/127.0.0.1/5432" interval 1 weight -30 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 1 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.8.254 tob_id_5794 } track_script { chk_postgreSQL_port } }
|
备用服务器配置
vim /etc/keepalived/keepalived.conf global_defs { router_id HA_1 } vrrp_script chk_postgreSQL_port { script "/tcp/127.0.0.1/5432" interval 1 weight -30 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 1 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.8.254 } track_script { chk_postgreSQL_port } } |
注:主备的参数state都是MASTER,根据priority的值大小竞争来决定谁是真正的MASTER。脚本检测也是在失败的时候会把权重减去相应的值,比如主服务器原来的priority=100,如果脚本检测到端口5432无法连接,就会priority-30=70,备用服务器的priority=90,此时备用服务器将竞争成为master,这样就实现了postgreSQL应用的热备。
五、keepalived运行时遇到的问题
5.1 IP漂移
1、主keepalived被杀掉,备keepalived竞争成Master;
2、主keepalived网络不通,备keepalived接收不到主组播的信息,备keepalived竞争成Master;
3、在各个keepalived中配置vrrp_script,这种情况由vrrp_script中shell脚本中配置情况的不同,从而kill掉主keepalived或者降低权重,使其他keepalived竞争成Master。(这里在vrrp_script中可以配置端口监控,进程监控,以及其他任何监控)
4、自己写应用程序合理控制keepalived的启停,实现IP漂移
5.2 脑裂现象
脑裂现象是指出现两个Master都绑定VIP,这种情况会造成资源抢夺。
建议使用非抢占模式减少脑裂现象发生。当主备之间的通信发生故障时,很容易发生脑裂现象,需考虑脑裂现象的处理。
5.3 keepalived模式
Keepalived分为抢占模式和非抢占模式。抢占模式是指主被杀掉后,备成为Master,当主又被启动时,主就从备抢过Master。而非抢占模式是指主被杀掉后,备成为Master,当主又被启动时,主不会从备抢过Master。
抢占模式的配置如下
vrrp_instance VI_1 { state BACKUP …… } | vrrp_instance VI_1 { state MASTER …… } |
非抢占模式的配置如下
vrrp_instance VI_1 { state BACKUP nopreempt …… } | vrrp_instance VI_1 { state BACKUP nopreempt …… } |