Keepalived高可用
# Keepalived介绍
# Keepalived简介
Keepalived是一个开源的网络高可用性软件,主要用于在Linux系统上实现IP负载均衡和故障转移,可以避免WEB服务、应用服务等关键服务出现单点故障、服务不可用等问题,能够有效地提升系统的稳定性和可用性。
Keepalived的高可用架构是主备架构,使用VRRP协议进行实现,该协议允许多个服务器共享一个虚拟IP地址。在主服务器正常工作时,由主服务器绑定该虚拟IP地址提供服务。而备用服务器会一直监视主服务器的服务状态,一但主服务器无法正常提供服务,备用服务器就会立马抢占该虚拟IP地址以接手工作。
# VRRP协议简介
VRRP是一种网络协议,用于提高路由器的可用性和可靠性。它允许多个路由器共享一个虚拟IP地址,其中一个路由器被选为主(Master)路由器,其余的路由器作为备份(Backup)路由器。主路由器负责处理数据包的转发,而备份路由器处于待命状态,当主路由器不可用时,备份路由器会接管虚拟IP地址并继续处理数据包,从而实现无缝的故障转移。
Keepalived利用了VRRP协议的这一特性,通过在多个服务器上运行Keepalived实例来共享同一个虚拟IP地址,从而提供了高可用性的服务。Keepalived中的每个实例都可以通过VRRP协议来通信,选举出一个主服务器并在主服务器不可用时自动切换到备份服务器,保证了服务的连续性和稳定性。
# Keepalived工作过程
配置Keepalived
管理员在每台服务器上配置Keepalived,定义虚拟IP地址、监控服务、健康检查参数以及其他相关设置。这些配置信息通常包含在Keepalived的配置文件中。
VRRP选举
当Keepalived实例启动时,各个实例会根据配置参与VRRP协议的通信。并且各个实例会周期性发送VRRP组播包,其中包含了自己的虚拟路由器ID和优先级等信息。
主备之间的通讯可以进行加密传输,但为了通讯效率,建议不要使用加密传输。
接收到其他实例发送的VRRP广播包后,各个实例会比较自己的优先级与其他实例的优先级,以决定自己是否应该成为主服务器。优先级高的实例将被选为主服务器(Master),其余服务器作为备份服务器(Backup)。
主服务器将会接管虚拟IP,客户端可以通过该地址访问主服务器的服务。
周期性更新
主服务器会一直以组播方式发送VRRP协议心跳包给其他所有备服务器,如果备服务器在一定时间内没有收到心跳包,就代表主服务器不可用,备服务器之间会再次进行选举,选出新的主服务器来接管虚拟IP地址,继续提供服务。
同时Keepalived还支持用户自定义健康检查脚本,通过脚本来检测特定服务或者资源的状态。例如,可以编写一个脚本来ping某个IP地址、检查TCP端口是否打开等。一旦脚本返回非零状态,Keepalived可以根据配置减小该节点在VRRP组中的优先级,以让其他备服务器来接管虚拟IP。
当最初的主服务器恢复上线后,如果他的优先级更高,就它会抢占回虚拟IP地址继续提供服务。但如果优先级值都一样,则会保持不变。
# Keepalived部署
# 1.规划高可用架构
虚拟IP:192.168.10.30
主机 | IP | 优先级 |
---|---|---|
lb_01 | 192.168.10.31 | 100 |
lb_02 | 192.168.10.32 | 90 |
# 2.安装部署服务
# 高可用集群内主机都要安装
yum install -y keepalived
2
# 3.编写配置文件
# 查看配置文件路径
rpm -ql keepalived | grep "conf$"
# 编写配置文件
vim /etc/keepalived/keepalived.conf
2
3
4
配置文件说明:
# 全局配置,其中的配置也可以配置到局部
global_defs {
## 邮箱告警配置,一般不使用
# notification_email {
# helloworld@email.com
# }
# notification_email_from robot@email.com
# smtp_server 192.168.200.1
# 路由器ID,用于VRRP通信中标识不同的路由器
# 在同一VRRP集群中不能重复,一般可以使用主机名
router_id LB_01
}
# VRRP集群实例配置,可以给不同服务配置集群,在同一集群中实例名需要一致
vrrp_instance WEB_LB {
# 标识该服务器的角色(MASTER/BACKUP),仅做标识使用
state MASTER
# 指定虚拟IP地址使用的网卡
interface eth0
# 设置虚拟路由器ID,用于区分不同的VRRP集群实例,同一集群中该值需要一致
virtual_router_id 51
# 设置优先级,用于选举主服务器,值越高越有可能成为主
priority 100
# 定义VRRP组播包发送的间隔时间(秒),同一集群中该值需要一致
advert_int 1
# 设置通讯时安全认证配置
authentication {
# 指定认证类型,PASS为密码认证
auth_type PASS
# 认证密码
auth_pass 1111
}
# 虚拟IP地址配置,用于配置主备服务器共享的虚拟IP地址,同一集群中该值需要一致
virtual_ipaddress {
192.168.10.30
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 4.防火墙放行
# 允许VRRP协议
firewall-cmd --add-protocol=VRRP --permanent
# 重新加载firewalld规则使之生效
firewall-cmd --reload
2
3
4
5
# 5.启动keepalived服务
systemctl start keepalived && systemctl enable keepalived
# 6.检查主服务器虚拟网卡信息
# 检查网卡信息中是否存在虚拟IP
ip a s
2
# 脑裂问题
# 介绍
备服务器由于意外,接收不到主服务器发送的组播包,于是备服务器会抢占虚拟IP。
物理层面上,可能是高可用集群之间的通讯线路出现问题。逻辑层面上,可能是安全策略阻止组播包的发送或接受,如:防火墙没有正常配置等。
# 监控方法
使用脚本对其进行监控,一旦出现脑裂问题,就发送邮件通知运维人员。脚本中判断如果网卡上出现虚拟IP地址,就发送邮件告警,因为无论是否脑裂,切换了说明某个节点出问题,则需要进行告警。
运维人员收到后,先关掉其中一个节点,然后分析问题进行解决。
ip a s ens33 | grep "192.168.10.30" > /dev/null
if [ $? -eq 0 ]
then
echo "告警信息" > mail -s [标题] [邮箱]
if
2
3
4
5
# 自定义健康检查脚本
Keepalived支持使用自定义脚本(track_script)来进行健康检查,如果脚本返回非0则表示检查失败,权重值会变为priority值加上weight值(可为负数)。
# 例子
实现nginx停止运行,keepalived进行主备切换。
- 编写脚本
mkdir -p /data/scripts/lb
cat>/data/scripts/lb/lb_nginx_check.sh<<EOF
#!/bin/bash
# 判断nginx worker进程数是否少于1
worker_num=\`ps -ef | grep -c "nginx: worke[r]"\`
if [ \$worker_num -lt 1 ]
then
exit 1
fi
EOF
2
3
4
5
6
7
8
9
10
11
- 在keepalived配置中定义与引用脚本
# 脚本定义在顶级配置中,也就是与vrrp_instance同级
vrrp_script lb_nginx_check {
# 指定脚本的绝对路径
script "/data/scripts/lb/lb_nginx_check.sh"
# 执行脚本的间隔时间(秒)
interval 2
# 权重值参数,介绍见下方
weight -10
# 检测连续多少次失败,确定是真失败
fall 2
# 检测连续多少次成功,确定是真成功
# rise 1
}
# 调用脚本
vrrp_instance WEB_LB {
...
# 调用脚本,指定上面定义的脚本标识名即可
track_script {
lb_nginx_check
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# weight参数
权重值参数,主要用于与priority优先级值进行运算,得出最终权重值。
它用于根据监控脚本执行情况,来调整优先级,以达到释放虚拟IP资源的目录。
当权重值为正数,一般用于提升当前服务器为主服务器。
- 脚本运行后返回结果为0时,最终优先级进行求和运算,real_priority = priority + weight
- 脚本运行后返回结果为非0时,表示无需升级,使用默认优先级。
当权重值为负数,一般用于降级当前服务器为备服务器。
- 脚本运行后返回结果为0时,表示无需降级,使用默认优先级。
- 脚本运行后返回结果为非0时,最终优先级进行求差运算,real_priority = priority - weight
# 双主配置
# 介绍
实际就是在两台服务器上,配置两个不同的VRRP集群实例,然后集群A由服务器A作为主服务器,服务器B作为备服务器。集群B由服务器B作为主服务器,服务器A作为备服务器。
这样将访问资源分开,可以减轻单主的压力,也可以防止单点问题。
# 配置方法
两个服务器state互设为主备。
两个服务器priority设置为互为主备的数值。
两个集群实例名不能相同。
两个集群virtual_router_id不能相同。
两个集群的virtual_ipaddress不能相同。
lb01配置
vrrp_instance www {
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/24
}
}
vrrp_instance bbs {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4/24
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
lb02配置
vrrp_instance www {
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/24
}
}
vrrp_instance bbs {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.4/24
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29