Keepalived是什么?
Keepalived是Linux下一个轻量级别的高可用解决方案,通过虚拟路由冗余协议来实现服务或者网络的高可用
起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态
如果某个服务器节点出现故障,Keepalived将检测到后自动将节点从集群系统中剔除
而在故障节点恢复正常后,Keepalived又可以自动将此节点重新加入集群中
这些工作自动完成,不需要人工干预,需要人工完成的只是修复出现故障的节点
特点
部署简单,只需要配置一个配置文件即可
加入了虚拟路由冗余协议,可以保证业务或网络不间断稳定运行
核心功能
健康检查
采用tcp三次握手,icmp请求,http请求,udp 、echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活
故障切换
主要应用在配置了主备的服务器上,使用虚拟路由冗余协议维持主备之间的心跳
当主服务器出现问题时,由备服务器承载对应的业务,从而在最大限度上减少损失,并提供服务的稳定性
Keepalived的工作流程
Keepalived高可用之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。


VRRP协议是什么?
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)来完成的
而主机之间的路由器一旦出现故障,就会通信失败
因此在这种通信模式下,路由器就会有单点瓶颈问题,为了解决这个问题,引入了VRRP 协议(虚拟路由冗余协议)
通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信
VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,VRRP角色如下:
角色
虚拟路由器:VRRP组中所有的路由器,拥有虚拟的IP+MAC(00-00-5e-00-01-VRID)地址
主路由器(master):虚拟路由器内部通常只有一台物理路由器对外提供服务,主路由器是由选举算法产生,对外提供各种网络功能
备份路由器(backup):VRRP组中除主路由器之外的所有路由器,不对外提供任何服务,只接受主路由的通告,当主路由器挂掉之后,重新进行选举算法接替master路由器
master路由器由选举算法产生,它拥有对外服务的VIP,提供各种网络服务,如ARP请求、数据转发、ICMP等等,而backup路由器不拥有VIP,也不对外提供网络服务
当master发生故障时,backup将重新进行选举,产生一个新的master继续对外提供服务

VRRP有三种工作状态,分别是:
Initialize状态
Master状态
Backup状态
选举机制:
优先级
抢占模式下,一旦有优先级高的路由器加入,立即成为Master
Keepalived的安装与配置
作用 | IP | 角色 |
|---|---|---|
node1 | 10.0.0.5 | Master |
node2 | 10.0.0.6 | Backup |
两台节点都安装keepalived
yum install -y keepalived编辑主节点和备用节点的配置文件
配置文件中每个配置的含义
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
}具体配置
keepalived配置抢占式
什么是抢占式?
抢占式含义:node1为master,node2位backup,且master优先级大于backup。keepalived启动后node1获得master,node2为backup。当node1宕机后, node2接管服务。当node1恢复后,node1重新接管服务变为master,而node2变为backup。属于抢占式
Master配置
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
slave配置
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}主节点和备用节点都启用keepalived服务
#启动keepalived
systemctl start keepalived
#设置为开机自启
systemctl enable keepalivedmaster查看网络信息是否存在10.0.0.3的虚拟网络,如果存在则说明配置成功

keepalived配置非抢占式
什么是非抢占式?
非抢占式含义:node1获得master权限,node2为backup。此时node1宕机后,node2接管服务升级为master。当node1恢复后权限将为backup,不会争抢 node2的master权限,node2将会继续master权限。属于非抢占式
1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。Master配置
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 150
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}slave配置
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
测试:master节点关闭keepalived服务,查看10.0.0.3虚拟IP是否已经自动配置到slave节点
keepalives可以配合Nginx实现高可用
常见问题,如果nginx宕机了怎么办?
编写健康检查脚本,判断nginx是否遇意外情况导致关闭 关闭则启动,如果不是这个问题就告诉keepalived实现高可用使用备用代理。
vim /root/check_keep.sh
#!/usr/bin/bash
nf=`netstat -tnulp | grep nginx | wc -l` # 过滤nginx进程
if [ $nf -eq 0 ]; then # 代表Nginx未正常启动
systemctl restart nginx $> /dev/null # 未启动则启动
sleep 3
nf1=`netstat -tnulp | grep nginx | wc -l` # 再次查看进程
if [ $nf1 -eq 0 ]; then # 如果还是未启动
systemctl stop keepalived # 则关闭keepalived实现跳转备用代理
fi
fikeepalived配置
master
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/root/check_keep.sh"
interval 10
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}
slave
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
keepalived脑裂现象
指两台高可用服务器在指定时间内,无法互相检查到对方的心跳而各自启动故障转移功能。各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。(都认为自己是master)
出现脑裂现象的原因
网线松动,网络故障
服务器硬件故障
服务器之间开启了防火墙
评论区