keepalived配置
global_defs { notification_email { xxxxxx@sina.com #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。 } notification_email_from keepalived@localhost #设置邮件的发送地址 smtp_server 127.0.0.1 #设置SMTP Server地址 smtp_connect_timeout 30 #设置SMTP Server的超时时间 router_id LVS_DEVEL #表示运行Keepalived服务器的一个标识。发邮件时显示大邮件主题中的信息 } vrrp_script chk_lvs { script "/etc/keepalived/scripts/check.py" ###监控脚本 interval 1 ###监控时间设置为1s } vrrp_sync_group VG_1{ #监控多个实例 一个vrrp组中有一个vrrp实例failover,那么这个组中所有的vrrp实例都会发生切换 group { VI_1 #实例名 VI_2 } notify_master /etc/keepalived/scripts/lvs_master.sh #指定当切换到master时,执行的脚本 notify_backup /etc/keepalived/scripts/lvs_backup.sh #指定当切换到backup时,执行的脚本 smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知 } vrrp_instance VI_1 { #vrrp 实例定义部分 state MASTER #指定Keepalived的角色,MASTER表示主机是主服务器。BACKUP表示此主机是备用服务器 interface eth1 #指定HA监测网络的接口(服务器的网卡) virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下MASTER与BACKUP必须是一致的 priority 50 #定义优先级,数字越大,优先级越高 #nopreempt #设置为不抢占,说明:这个配置只能在BACKUP主机上面设置 #preempt_delay #backup抢占为master的延迟,默认无延迟,说明:这个配置只能在BACKUP主机上面设置 #unicast_src_ip @src_ip #如果两台主机不在同一网段,则需要指定单播模式原地址 #unicast_peer { # @peer_ip #单播模式目的地址 #} authentication { auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信 auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个,只有主机在同一网段才生效 192.168.100.250 192.168.100.160/24 dev eth0 label eth0:1 } track_script { chk_lvs ###调用上面定义的chk_lvs } notify_master /etc/keepalived/scripts/lvs_master.sh #指定当切换到master时,执行的脚本 notify_backup /etc/keepalived/scripts/lvs_backup.sh #指定当切换到backup时,执行的脚本 } #lvs配置,如果只是做高可用则只需要上面的即可 virtual_server 192.168.100.250 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开 delay_loop 6 #设置第一次检查启动延迟 lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法 lib_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR三个模式可选 persistence_timeout 600 #会话保持单位时间,单位是秒,默认6分钟 protocol TCP #指定转发协议类型,有TCP和UDP两种 real_server 192.168.100.60 80 { #配置服务节点1,需要指定real server的真实IP地址和端口 weight 1 #配置服务节点的权值,权值数字越大,权值越高 TCP_CHECK { #relserve的状态检测设置部分,单位是秒 connect_timeout 10 #表示10秒无响应超时 nb_get_retry 3 #表示重试次数 dealy_before_retry 3 #表示重试间隔 } } real_server 192.168.100.80 80 { weight 1 TCP_CHECK { connect_timeout 10 #表示10秒无响应超时 nb_get_retry 3 #表示重试次数 dealy_before_retry 3 #表示重试间隔 } } }
在使用keepalived过程中的一些坑:
1.两台主备机器不在一个网段,导致vrrp组播消息无法发送,此时使用 unicast_src_ip 和 unicast_peer 字段,通过单播的方式发送消息, 同时由于不在一个网段,所以主备机无法使用arp协议切换vip,所以禁用keepalived的virtual_ipaddress字段并通过nginx的tcp模块做数据转发。
2.关于notify_master 和 notify_backup 脚本被调用的时机 以及 keepalived选举机制:
2.1当keepalived启动时会首先调用notify_backup使节点状态变为 BACKUP(无论在conf文件中state是什么),然后开始对外发送vrrp数据包,此时所有节点都会对外发送以及收到其他节点发送过来的vrrp数据包,然后每个节点会判断接收到的vrrp数据包中priority的值,如果该值大于自身的priority,那么该节点会停止对外发送vrrp数据包,并且保持状态为BACKUP不变,一段时间后网络内只会有一台机器在对外持续发送vrrp数据包,此时该节点就成为主节点,主节点调用notify_master脚本将自己的状态改为MASTER,其他节点状态不变。
2.2当主节点状态异常(track_script退出状态码非零或者机器出现故障),此时其他节点就不在会收到主节点发送vrrp数据包,此时开始新的一轮选举(参考2.1),新的主节点会调用notify_master将自己的状态改为MASTER。(这里有一个误区,我原以为当主节点track_script退出状态码非零时,调用notify_backup脚本改变状态,但实际上并不会,仅仅只是停止发送vrrp数据包)
2.3当主节点服务恢复的时候(track_script退出状态码为零或者机器恢复),会首先调用notify_backup使节点状态变为 BACKUP(无论在conf文件中state是什么),然后开始对外发送vrrp数据包开始新的一轮选举(同2.1),在为被选举成为主节点后调用notify_master脚本将自己的状态改为MASTER。
一句话概括:当节点启动或者恢复的时候keepalived会先调用notify_backup脚本,然后开始新的一轮选举,而当节点故障时,keepalived不会执行任何notify脚本。
3.在实际运行中发现一个问题,就是我的notify_master脚本的运行时间远远长过notify_backup,此时如果BACKUP节点先启动,由于没有其他节点,它执行notify_master脚本,在执行的过程中MASTER节点启动了,该节点会执行notify_backup脚本将状态切换为BACKUP,但是notify_backup执行很快,导致notify_master在notify_backup之后才执行完,这时会出现就会出现两个主节点导致严重问题。 解决方案:1.尽量缩短脚本执行时间 2.保证MASTER节点先启动。
在使用keepalived给lvs做高可用是注意事项:
1.会话保持 (ipvsadm -A -t [ip:port] -s wrr -p [timeout]) 对于tcp长连接,如果客户端每次tcp请求都被lvs分配到不同的real server上,那就会出现严重问题。所以会话保持设定在同一个tcp长链接中,tcp请求都被分配到同一台real server。
2.链接信息同步 当开启会话保持时,由于LVS负载均衡器需要保存大量的连接信息,记录每个TCP连接由哪台真实服务器处理,当主负载均衡器宕机以后,备机提升为主,但备机缺省没有这些连接信息,会导致客户端的连接失效,为了解决这一问题,LVS在Linux内核实现了同步连接信息的功能.
查看连接信息 ipvsadm -Ln -c
查看同步进程信息 ipvsadm -L --daemon
开启同步 ipvsadm --start-daemon [master|backup] --mcast-interface=[网卡名称] --syncid [编号,主备需要一致]
关闭同步 ipvsadm --stop-daemon [master|backup]
lvs_master.sh
#!/bin/bash echo $(date "+%Y-%m-%d %H:%M:%S") "The keepalived service is master." >> /home/keepshell/gexin.txt ipvsadm --stop-daemon backup ipvsadm --start-daemon master --mcast-interface=eth0 --syncid 1
lvs_backup.sh
#!/bin/bash echo $(date "+%Y-%m-%d %H:%M:%S") "The keepalived service is backup." >> /home/keepshell/gexin.txt ipvsadm --stop-daemon master ipvsadm --start-daemon backup --mcast-interface=eth0 --syncid 1
参考资料:https://www.keepalived.org/manpage.html