TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议) 出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
Keepalived对服务器运行状态和故障隔离的工作原理:
Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):
网络层(3):Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层(4):Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
应用层(5):Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。
Keepalived 切换机制与心跳
Keepalived dirctors之间的故障切换转移,是通过VRRP协议来实现的。
在keepalived directors正常工作时,主Directors节点会不断的向备节点广播心跳信息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身的备用角色。
VRRP协议简单介绍
vrrp协议,英文名称:Virtual Router Redundancy Protocol,中文名称:虚拟路由器冗余协议。vrrp出现就是为了解决静态路由的单点故障,vrrp是通过一种竞选协议机制来将路由任务交给某台vrrp路由器。
keepalived配置文件详解
重点:抢占模型、权重、节点状态、通告间隔、认证模块
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。
global_defs区域
主要是配置故障发生时的通知对象以及机器标识
global_defs {
notification_email {
[email protected]
[email protected]
…
}
notification_email_from [email protected]
smtp_server smtp.abc.com
smtp_connect_timeout 30
enable_traps
router_id host163}
notification_email 故障发生时给谁发邮件通知。
notification_email_from 通知邮件从哪个地址发出。
smpt_server 通知邮件的smtp地址。
smtp_connect_timeout 连接smtp服务器的超时时间。
enable_traps 开启SNMP陷阱(Simple Network Management Protocol)。
router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
vrrp_script区域
用来做健康检查的,当时检查失败时会将vrrp_instance的priority减少相应的值。
vrrp_script chk_http_port {
script “ interval 1
weight -10}
以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。
vrrp_instance和vrrp_sync_group区域
vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。
vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:
两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。
vrrp_sync_group VG_1 {
group {
inside_network # name of vrrp_instance (below)
outside_network # One for each moveable IP.
…
}
notify_master /path/to_master.sh
notify_backup /path/to_backup.sh
notify_fault “/path/fault.sh VG_1”
notify /path/notify.sh
smtp_alert}
vrrp_instance VI_1 {
state MASTER
interface eth0
use_vmac
dont_track_primary
track_interface {
eth0
eth1
}
mcast_src_ip
lvs_sync_daemon_interface eth1
garp_master_delay 10
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
10.210.214.253/24 brd 10.210.214.255 dev eth0
192.168.1.11/24 brd 192.168.1.255 dev eth1
}
virtual_routes {
172.16.0.0/12 via 10.210.214.1
192.168.1.0/24 via 192.168.1.1 dev eth1
default via 202.102.152.1
}
track_script {
chk_http_port
}
nopreempt
preempt_delay 300
debug
notify_master |
notify_backup |
notify_fault |
notify |
smtp_alert}
notify_master/backup/fault 分别表示切换为主/备/出错时所执行的脚本。
notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = “GROUP”|“INSTANCE”,$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。
smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)。
state 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
interface 节点固有IP(非VIP)的网卡,用来发VRRP包。
use_vmac 是否使用VRRP的虚拟MAC地址。
dont_track_primary 忽略VRRP网卡错误。(默认未设置)
track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)
mcast_src_ip 修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的)
lvs_sync_daemon_interface 绑定lvs syncd的网卡。
garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒。
virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。
注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下。
Keepalived_vrrp[27120]: ip address associated with VRID not present in received packet :
one or more VIP associated with VRID mismatch actual MASTER advert
bogus VRRP packet received on eth1 !!!
receive an invalid ip number count associated with VRID!
VRRP_Instance(xxx) ignoring received advertisment…
可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8
priority 用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。
advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。
authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。
virtual_ipaddress vip,不解释了。
virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息。
virtual_ipaddress_excluded 发送的VRRP包里不包含的IP地址,为减少回应VRRP包的个数。在网卡上绑定的IP地址比较多的时候用。
nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。
首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。
当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。
preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。
ip | 配置 |
---|---|
192.168.153.142 | keepalived+apache |
192.168.153.143 | keepalived+apache |
两台机子都部署
1,关闭防火墙,selinux
systemctl stop firewalld && setenforce 0
2,下载keepalived和apache
yum install keepalived -y ; yum install httpd -y
3,修改主机名
hostnamectl set-hostname ka-master(192.168.153.142)
hostnamectl set-hostname ka-backup(192.168.153.143)
su - 回车
单节点部署
主节点ip 192.168.153.142
1,备份keepalived配置文件
cd /etc/keepalived/
mv keepalived.conf keepalived.conf.bar
2,修改keepalived配置文件
vi keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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.153.100/24 dev ens33 label ens33:1 #注意网卡名
}
}
3,修改apache配置文件
vi /etc/httpd/conf/httpd.conf
Listen 192.168.153.100:8080 #修改成keepalived的虚拟ip
echo "192.168.153.142.html" > /var/www/html/index.html
备节点ip 192.168.153.143
1,备份keepalived配置文件
cd /etc/keepalived/
mv keepalived.conf keepalived.conf.bar
2,修改keepalived配置文件
vi keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #注意状态是BACKUP
interface ens33
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.153.100/24 dev ens33 label ens33:1
}
}
3,修改apache配置文件
vi /etc/httpd/conf/httpd.conf
Listen 192.168.153.100:8080
echo "192.168.153.143.html" > /var/www/html/index.html
开启服务
systemctl start keepalived.service (主备都开)
[root@ka-master keepalived]# ps aux | grep keepalived
root 1791 0.0 0.1 122980 1412 ? Ss 15:48 0:00 /usr/sbin/keepalived -D
root 1792 0.0 0.3 131876 3316 ? S 15:48 0:00 /usr/sbin/keepalived -D
root 1793 0.0 0.2 131748 2652 ? S 15:48 0:00 /usr/sbin/keepalived -D
root 1809 0.0 0.0 112708 984 pts/0 S+ 15:48 0:00 grep --color=auto keepalived
(主)[root@ka-master keepalived]# ip a | grep 192.168.153.100
inet 192.168.153.100/24 scope global secondary ens33:1
(备)[root@ka-backup keepalived]# ip a | grep 192.168.153.100
You have new mail in /var/spool/mail/root
注:虚拟ip会在主节点生成备节点不会生成,如果生成那就是配置文件出现了错误。备节点和主节点争用IP资源,这个现象叫做“裂脑”。
主:[root@ka-master keepalived]# systemctl stop keepalived.service
[root@ka-master keepalived]# ip a | grep 192.168.153.100
[root@ka-master keepalived]#
[root@ka-backup keepalived]# ip a | grep 192.168.153.100
inet 192.168.153.100/24 scope global secondary ens33:1
当主节点停止服务,虚拟ip会切换到备节点,来实现高可用;
现在开始apache服务
[root@ka-master ~]# systemctl start httpd
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
[root@ka-backup ~]# systemctl start httpd
[root@ka-backup ~]#
注意:主节点起apache报错因为没有监听ip,在备节点上;
打开网页访问
http://192.168.153.100:8080
#注意我们将端口改了
再到主节点启动keepalived服务和重启apache服务
[root@ka-master ~]# systemctl start keepalived.service
[root@ka-master ~]# systemctl restart httpd
刷新网页:
再停止主节点keepalived服务刷新页面,会变成备节点页面。实现keepalived+apacheh高可用
扩展:keepalived源码安装+双主模式