简介
Keepalived是Linux下的一个高可用解决方案,Keepalived 可以用来防止服务器单点故障的发生。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。
官网地址:https://www.keepalived.org
VRRP协议与工作原理
现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
VRRP协议是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器。
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。
每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。
Keepalived安装
master centos 7 192.168.91.129
slave centos 7 192.168.91.131
vip 192.168.91.181
用户访问的是VIP,由于VIP与真实服务器网卡绑定了(与网卡Mac地址绑定),当Master 宕机后Slave接受不到Master广播信息,Slave会通过ARP 协议广播VIP 和Slave的Mac地址,Slave就成为了Master对外提供服务,VIP也就漂移到Slave服务器。
1.Master和Slave都安装Nginx并测试通过
http://192.168.91.129/
http://192.168.91.131/
2.Master和Slave都是用 yum -y install keepalived 安装keepalived,并配置keepalived
Master 配置/etc/keepalived/keepalived.conf
! Configuration File for 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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
# 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。
vrrp_script nginx_check.sh {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -2
}
vrrp_instance VI_1 {
state MASTER
interface ens33 # 绑定的网卡,可通过ifconfig查看
virtual_router_id 51 # 拟路由的ID号,Master、Slave节点设置必须一样
priority 100 # 节点优先级,值范围 0-254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 虚拟ip配置,可配置多个
192.168.91.181
}
}
Slave 配置 /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script nginx_check.sh {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.91.181
}
}
3.Master 和 Slave节点 /etc/keepalived 目录放置检查脚本nginx_check.sh
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
echo `date "+%Y-%m-%d %H:%M:%S"` >> /etc/keepalived/log.txt
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
systemctl stop keepalived
fi
fi
echo "check finish ${A}" >> /etc/keepalived/log.txt
4.启动Maste 和Slave 节点的keepalived 并查看日志
systemctl start keepalived
tail -f /var/log/messages
查看VIP 与网卡绑定信息: ip a
从其他节点ping VIP,ping 192.168.91.181
注意: keepalived.conf配置文件中在golobal_defs 中注释了vrrp_strict,如没有注释会导致ping不通。官网信息如下:
5.通过浏览器访问VIP, http://192.168.91.181
6.停止Master 上的keepalived 和 nginx,再次使用浏览器刷新VIP
systemctl stop keepalived
/usr/local/nginx/sbin/nginx -s stop
浏览器刷新192.168.91.129 已经访问不到
ip a 查看Slave节点ip信息,VIP 已经漂移到了Slave
再次刷新192.168.91.181依然可以访问到nginx服务