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、启动
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 # 如果条件成立,权重-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
}
}
查看 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、自动检测 nginx_check.sh
主节点nginx宕机后,要想实现自动切换备节点,必须要先停止主节点的 keepalived 服务后,才会成功,所以通过脚本来实现一旦主节点 nginx 关闭后,keepalived 也自动关闭。
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
echo `date`': nginx is not healthy, try to killall keepalived' >> /etc/keepalived/keepalived.log
systemctl stop keepalived
fi
6、两台机器开启防火墙
#增加ant表链
*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
测试
访问虚拟IP 192.168.1.100,默认路由跳转到 主服务器192.168.1.72
此时尝试 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
再次访问 192.168.1.100 此时自动切换到 192.168.1.73,至此,keepalived nginx 高可用成功