概念
Keepalived用来监控集群系统中各个服务节点的状态,基于C语言编译,通过VRRP协议解决静态路由的单点故障,可保证网络的不间断、稳定的运行。
作用
1、健康检测
2、故障转移:当主(MASTER)失效或出现故障时,备份(BACKUP)将自动接管主负载均衡器的所有工作。实行抢占式
官方站点:http://www.keepalived.org
官方文档: http://www.keepalived.org/documentation.html
原理
Keepalived dirctors之间的故障切换转移,是通过VRRP协议来实现的。
当keepalived directors正常工作时,主节点会不断向备份节点发广播心跳信息,告诉备节点自己存在,(主-------广播包----->备)
当主节点故障,备节点检测不到心跳信息将接管主节点的VIP(虚拟IP)及服务。
当主节点恢复,备节点释放自己接管的资源与服务,恢复备用角色。
运行机制
Keepalived工作在TCP/IP参考模型的第三层、第四层和第五层,也就是网络层、传输层和应用层。Keepalived运行机制如下:
网络层,运行着四个协议:互连网协议(IP)、互连网控制报文协议(ICMP)、地址转换协议(ARP)以及反向地址转换协议(RARP)。
Keepalived在网络层采用的工作方式是通过ICMP向服务器集群中的每个节点发送一个ICMP的数据包(类似于 ping 实现的功能),如果某个节点没有返回响应数据包,那么就认为此节点发生了故障,Keepalived将报告此节点失效,并从服务器集群中剔除故障节点。
传输层,提供两个协议;传输控制协议(TCP)和用户数据协议(UDP)。
Keepalived在传输层就是利用TCP的端口连接和扫描技术来判断集群节点是否正常的。
Keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。
应用层,运行FTP、TELNET、SMTP、DNS 等各种不同类型的高层协议,
Keepalived将根据用户的设定监测各种程序或服务是否允许正常,
如果Keepalived 的监测结果与用户设定不一致时,Keepalived将把对应的服务从服务器中移除。
keepalived中master与backup的选举规则
master的角色主要由vrrp_script 模块中的“priority”与vrrp_script模块中的“weight”值决定,默认只由proority值决定。
由于vrrp_script 的weight值会根据检测的服务是否成功而改变,会产生角色选举失败的现象,以至于集群不产生故障转移和切换。
不论weight的值是否正负,当 |weight|>主的priority-备的priority 该服务才不会产生错误。
安装与应用
yum安装
1、下载
# yum install keepalived -y
2、相关文件
# rpm -qc keepalived
/etc/keepalived/keepalived.conf
/etc/sysconfig/keepalived
源码安装
1、下载keepalived源码包
[root@node1 ~]# wget -c https://www.keepalived.org/software/keepalived-2.1.0.tar.gz
2、解压到指定路径
[root@node1 ~]# tar xvf keepalived-2.1.0.tar.gz -C /usr/local/src/
3、下载编译环境的包
[root@node1 ~]# yum install gcc gcc-c++ make -y
4、查看帮助
[root@node1 keepalived-2.1.0]# # ./configure --help
--prefix=PREFIX #即将安装的位置,默认在/usr/local目录下
--bindir=DIR #命令放置的目录
--sbindir=DIR #管理员命令放置的目录
--sysconfdir=DIR #配置文件放置的目录
5、安装依赖包
[root@node1 ~]# yum install kernel-devel openssl-devel -y
6、编译安装;指定安装位置与配置文件位置
[root@node1 keepalived-2.1.0]# #./configure --prefix=/usr/local/keepalived --sysconfdir=/etc
[root@node1 keepalived-2.1.0]# #make
[root@node1 keepalived-2.1.0]# #make install
7、将命令做软连接
[root@node1 ~]# ln -vs /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@node1 ~]# ln -vs /usr/local/keepalived/bin/genhash /usr/sbin/
脚本文件: /usr/lib/systemd/system/keepalived.service
配置文件:/etc/keepalived/keepalived.conf
不抢占模式与抢占模式
不抢占模式说明:
在高可用(HA)集群中,当主节点宕机,备份节点接管资源与服务,当主节点恢复使用,备份节点继续服务。
抢占模式说明:
在集群中,当主节点宕机,备份节点接管资源与服务,当主节点恢复使用,备份节点回归备份角色,主节点重新接管资源与服务。
keepalived的抢占机制说明:
keepalived默认抢占机制
keepalived不抢占参数:nopreempt
keepalived不抢占机制中主备节点的状态必须都为BACKUP
示例配置
主备节点keepalived 尽量版本一致
本示例都以源码按装,版本keepalived-2.1.0
基础环境:关闭防火墙及SElinux
# systemctl stop firewalld.service
1、单实例双主模式的keepalived测试
主机名及地址 | 作用 |
---|---|
node01:192.168.16.11 | keepalived主节点 |
node02:192.168.16.12 | keepalived备节点 |
内核版本 | 3.10.0-1062.el7.x86_64 |
发行版本 | CentOS Linux release 7.7.1908 (Core) |
默认抢占模式
主节点:node1
[root@node1 ~]# vim /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_instance VI_1 {
state MASTER #主节点状态
interface ens33 #修改网卡名
virtual_router_id 51
priority 100 #主节点优先级
advert_int 1
authentication {
auth_type PASS #验证类型:明文
auth_pass 1111 #掩码;255.255.255.255
}
virtual_ipaddress {
192.168.16.100 #虚拟IP(VIP)
}
}
备节点:node2
[root@node1 ~]# vim /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
}
vrrp_instance VI_1 {
state BACKUP #修改状态名,为备节点
interface ens33 #修改网卡名,与自己本机匹配
virtual_router_id 51
priority 80 #修改优先级,比主节点小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.16.100 #配置虚拟ip
}
}
主备开启服务:
# systemctl start keepalived.service
测试:
1、主节点查看是否有虚拟IP
[root@node1 ~]# ip a | grep 192.168.16.100
inet 192.168.16.100/32 scope global ens33
2、跟踪主节点日志,关闭主节点keepalived服务,观察keepalived运行机制
[root@node1 ~]# systemctl stop keepalived.service
[root@node1 ~]# tail -f /etc/log
Mar 7 19:49:58 node1 Keepalived[35756]: Stopping
Mar 7 19:49:58 node1 systemd: Stopping LVS and VRRP High Availability Monitor...
Mar 7 19:49:58 node1 Keepalived_vrrp[35757]: (VI_1) sent 0 priority #设置优先级为0
Mar 7 19:49:58 node1 Keepalived_vrrp[35757]: (VI_1) removing VIPs. #移除VIP
Mar 7 19:49:59 node1 Keepalived_vrrp[35757]: Stopped - used 0.005873 user time, 0.200858 system time
Mar 7 19:49:59 node1 Keepalived[35756]: CPU usage (self/children) user: 0.000000/0.005888 system: 0.002349/0.202549
Mar 7 19:49:59 node1 Keepalived[35756]: Stopped Keepalived v2.1.0