keepalived最初是为LVS负载均衡设计的,用来管理并监控LVS集群中各个节点的状态,后加入了实现高可用的VRRP功能。VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,是为了解决静态路由中的单点故障问题,VRRP是一种基于优先级的竞选机制来完成处理,竞选出的主节点会一直发送广播包,备用节点一直监听这些广播包,当备用节点无法接受到主节点发出的广播包时就会再次竞选出一个新的主节点来提供服务,保证服务的高可用。
主机A: 192.168.1.72 (MASTER)
主机B: 192.168.1.73 (BACKUP)
虚拟IP: 192.168.1.100
需求:通过keepalived 实现主机A宕机后,主机B自动接管业务
1、两台机器需要安装 keepalived nginx
yum install keepalived -y
2、启动 keepalived
systemctl start keepalived
# keepalived正常运行后,会启动3个进程,其中一个是父进程,一个子进程,一个是vrrp子进程
ps -ef | grep keepalived
root 3039 1 0 10:27 ? 00:00:00 /usr/sbin/keepalived -D
root 3040 3039 0 10:27 ? 00:00:00 /usr/sbin/keepalived -D
root 3041 3039 0 10:27 ? 00:00:00 /usr/sbin/keepalived -D
3、MASTER 配置
vi /etc/keepalived/keepalived.conf
global_defs {
router_id vm72 # 定义路由器标识信息,标识本节点的字符串,通常为hostname
}
# keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" # 检测 nginx 状态的脚本路径
interval 2 # 检测时间间隔
weight -20 # 权重
}
vrrp_instance VI_1 { # 定义实例
state MASTER # 状态参数 master/backup 仅表示说明,主节点为 MASTER
interface ens33 # 与本机 IP 地址所在的网络接口相同
virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样
priority 100 # 优先级决定是主还是备 --> 越大越优先,值范围 0-254
advert_int 1 # 主备心跳通讯时间间隔,组播信息发送间隔,两个节点设置必须一样, 默认 1s
authentication { # 认证授权,设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
# 将 track_script 块加入 instance 配置块
track_script {
chk_nginx # 执行 Nginx 监控的服务
}
virtual_ipaddress {
192.168.1.100 # 虚拟VIP地址,允许多个
}
}
4、BACKUP 配置
global_defs {
router_id vm73
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.1.100
}
}
(1)查看虚拟 ip
# 查看IP
[root@vm73 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:86:cf:b9 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global ens33 # 出现虚拟地址
valid_lft forever preferred_lft forever
inet6 fe80::408a:3209:e8a5:2f1a/64 scope link
valid_lft forever preferred_lft foreve
5、配置脚本
(1)vrrp_script中节点权重改变算法
在Keepalived集群中,其实并没有严格意义上的主、备节点,虽然可以在 Keepalived 配置文件中设置state选项为MASTER状态,但是这并不意味着此节点一直就是Master角色。控制节点角色的是Keepalived配置文件中的priority值,但并它并不控制所有节点的角色,另一个能改变节点角色的是在vrrp_script模块中设置的weight值,这两个选项对应的都是一个整数值,其中weight值可以是个负整数,一个节点在集群中的角色就是通过这两个值的大小决定的。
(2)不设置weight
在vrrp_script模块中,如果不设置weight选项值,那么集群优先级的选择将由Keepalived配置文件中的priority值决定,而在需要对集群中优先级进行灵活控制时,可以通过在vrrp_script模块中设置weight值来实现。
(3)设置 weight,本例设置的是负数,采用第二种
vrrp_script 里的script返回值为0时认为检测成功,其它值都会当成检测失败
1、weight 为正时,脚本检测成功时此weight会加到priority上,检测失败时不加
主失败:
主 priority < 从 priority + weight 时会切换
主成功:
主 priority + weight > 从 priority + weight 时,主依然为主
2、weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)
主失败:
主 priority – abs(weight) < 从priority 时会切换主从
主成功:
主 priority > 从priority 主依然为主
(4)主节点nginx宕机后,要想实现自动切换备节点,必须要先停止主节点的 keepalived 服务后,才会成功,所以通过脚本来实现一旦主节点 nginx 关闭后,keepalived 也自动关闭。
vim /etc/keepalived/nginx_check.sh
# 内容
#!/bin/bash
count = `ps -C nginx --no-header | wc -l`
if [ $count -eq 0 ];then
echo `date`': nginx is not healthy, try to killall keepalived' >> /etc/keepalived/keepalived.log
systemctl stop keepalived
exit 1
else
exit 0
fi
6、两台机器开启防火墙
# 增加nat表链
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -d 192.168.1.100/32 --dport 80 -j REDIRECT
COMMIT
7、测试
(1)访问虚拟IP 192.168.1.100,默认路由跳转到 主服务器192.168.1.72
(2)此时尝试 192.168.1.72上面的nginx停止服务
# 关闭nginx
[root@vm72 keepalived]# systemctl stop nginx
# 此时查看keepalived进程,也全部关闭了,说明脚本生效了
[root@vm72 keepalived]# ps -ef | grep keepalived
root 6580 2230 0 11:33 pts/0 00:00:00 grep --color=auto keepalived
(3)再次访问 192.168.1.100 此时自动切换到 192.168.1.73,至此,keepalived nginx 高可用成功