Keepalived是一款高可用软件,一开始的定位是和LVS负载均衡配合,依靠Keepalived的配置文件自动创建LVS所需要的ipvsadm规则。但现在Keepalived已经基本用于为其它服务提供高可用,它除了提供VIP自动漂移,还支持对后端后端进行健康检查,当主服务器工作出现故障时会将其剔除,并将备用服务器上线;当主服务器修复后,又会自动将备用服务器下线,让主服务器上线。这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障服务器。
一、Keepalived编译安装
1、Keepalived的下载在官方网站http://www.keepalived.org/。Keepalived1.2和1.4版本对环境要求有略微区别,由于1.4版本开始需要对IPV6进行支持,所以在编译安装Keepalived之前要先安装如下环境:
yum install -y libnl-devel libnl3-devel libnfnetlink-devel
2、在需要进行高可用配置的节点上都编译安装Keepalived。编译安装完成后注意看是否有如图出现几个yes的标记,这个是代表安装Keepalived所支持的功能
./configure --prefix=/usr/local/keepalived make make install /usr/local/keepalived/sbin/keepalived -v #查看版本
如果编译时出现!!! OpenSSL is not properly installed on your system. !!! Can not include OpenSSL headers files.!!! 这样的报错需要先安装openssl-devel这个软件包
yum install openssl-devel -y
二、Keepalived配置
1、通过编译安装的Keepalived可以在keepalived/etc目录中获取到配置模板文件,如果使用yum安装的则是/etc/keepalived/keepalived.conf,在启动Keepalived时服务会默认读取/etc/keepalived/keepalived.conf,或者通过-f选项指定配置文件路径
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
2、下面是Keepalived配置文件示例,如果服务启动异常可以通过/var/log/message查找Keepalived的日志
global_defs { # 全局设置,主要是主备切换时发送邮件通知,可以直接注释 # notification_email { # acassen@firewall.loc # failover@firewall.loc # sysadmin@firewall.loc # } # notification_email_from Alexandre.Cassen@firewall.loc # smtp_server 192.168.145.1 # smtp_connect_timeout 30 # router_id LVS_DEVEL #Keepalived服务器标识,用于邮件主题 # vrrp_skip_check_adv_addr # vrrp_strict # vrrp_garp_interval 0 # vrrp_gna_interval 0 } vrrp_instance test_nginx { #实例名称随便取 state MASTER #标记该节点是master还是backup,但并不起实际作用,为了防止脑裂抢占IP建议设置backup并且配置非抢占模式 interface eth0 #配置VIP绑定的网卡,这里使用和外网通信的网卡 virtual_router_id 51 #取1-255之间的值,主备需要相同,这样才能成为一个组 priority 100 #权重,数值高的主机是master,这是影响主备的关键 # nopreempt #非抢占模式,如果打开注释那state必须为backup advert_int 1 #主备之间通讯的间隔秒数,用于判断主节点是否存活 authentication { auth_type PASS #进行安全认证的方式,PASS或者AH方式,推荐PASS auth_pass 1111 #PASS的密码 } virtual_ipaddress { 192.168.145.200 #VIP地址,最多可以写20个,keepalive服务启动后会在interface选项所配置的网卡上新增该VIP } #下面的内容其实就是代替了LVS命令行的配置 virtual_server 192.168.145.200 80 { #设置虚拟服务的访问地址与端口,访问该地址的请求会转发到后端real_server delay_loop 6 protocol TCP lb_algo rr lb_kind DR real_server 192.168.145.101 80{ #后端节点1 weight 1 } real_server 192.168.145.102 80{ #后端节点2 weight 1 } } }
4、由于上面配置的是nginx服务,所以在后端节点上都配置好Nginx,这里可以故意为2个不同的节点配置不同的页面用于验证。看看最开始请求VIP的页面以及将主节点关机或者杀掉keepalived后的页面是否不同,如果不同说明VIP已经自动跳到另一台节点。由于上面配置了非抢占模式,所以第一个节点挂掉再恢复也不会重新把VIP抢占回来。除此还需要注意使用负载均衡后的session问题。如果keepalived在使用中被强行杀死或者网络出现脑裂问题,VIP会同时出现在主备节点上,只能通过重启网络解决
#两种导致脑裂的操作 pkill -9 keepalived iptables -A OUTPUT -p vrrp -j DROP #恢复办法 systemctl restart network
三、Keepalived健康检查与高可用
在Keepalived的实际运用中需要对后端服务(比如Nginx)做一个健康检查来判断服务是否正常,否则Keepalived检查的对象是Keepalived自身服务而不是其他应用服务。所以存在后端Nginx服务挂了但是Keepalived还在正常工作,这个时候就不会切换VIP到正常的服务器上去。Keepalived健康检查功能支持TCP_CHECK、HTTP_GET、MISC_CHECK、VRRP_SCRIPT方式。
1、TCP_CHECK、HTTP_GET配置示例:
real_server 192.168.145.101 80 { #在real server段进行配置 weight 1 TCP_CHECK { connect_port 80 connect_timeout 6 nb_get_retry 3 delay_before_retry 3 } HTTP_GET { url { path /index.html status_code 200 } connect_timeout 6 nb_get_retry 3 delay_before_retry 3 } }
2、vrrp_script脚本检查,该选项配合track_script使用。使用自定义脚本来判断后端服务是否异常,如果出现异常就应该移除掉VIP,也就是主动来停止Keepalived服务
global_defs { #全局部分设置,全部注释都可以,主要是邮件信息
notification_email {
tanglu@qq.com #主从切换时发送邮件通知,这里是收件人地址
}
notification_email_from tanglu@postfix.com #发件人地址
smtp_server 192.168.200.1 #邮件服务器地址
smtp_connect_timeout 30 #发送邮件超时时间
router_id LVS_DEVEL
}
vrrp_script check_nginx { #定义循环检测
script "/scripts/check_nginx.sh"
interval 5 #5秒运行一次检测脚本
}
vrrp_instance VI_1 {
interface ens33
nopreempt
priority 100
advert_int 1
virtual_ipaddress {
192.168.68.250 #VIP,最多设置20个
}
track_script { #调用循环检测
check_nginx
}
}
check_nginx.sh脚本代码参考:
#!/bin/bash
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
/usr/local/nginx/sbin/nginx
sleep 5
if [ "$(ps -ef | grep "nginx: master process"| grep -v grep )" == "" ]
then
killall keepalived
fi
fi
3、Keepalived本身要实现高可用的话只需要再准备一台节点部署Keepalived,然后将两台Keepalived做成双主模式。双主的实现只需要配置一段新的vrrp_instance规则,在主Keepalived上面加配置一个从的实例规则,再到从Keepalived上面配置一个主的实例规则
· 主节点配置如下
global_defs {
notification_email {
381347268@qq.com
}
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.110/24 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.1.210/24 dev ens33 label ens33:2
}
}
· 从节点配置如下
global_defs {
notification_email {
381347268@qq.com
}
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.110/24 dev ens33 label ens33:1
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 52
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.1.210/24 dev ens33 label ens33:2
}
}
发表评论: