一、简介
浮动IP、漂移IP地址又叫做VIP,也就是虚拟IP。
Keepalived 是一种高性能的服务器高可用或热备解决方案。
Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。
keepalived 提供健康检查,故障转移,提高系统的可用性!
二、方案规划
VIP | IP | Nginx端口 | 默认主从 |
192.168.111.250 | 192.168.111.201 | 80 | MASTER |
192.168.111.250 | 192.168.111.202 | 80 | BACKUP |
master正常的情况下
master宕机的情况下
三、安装Nginx
# 安装四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7
./configure --prefix=/usr/local/nginx
make && make install
修改 nginx 首页面内容为节点的ip地址,方便测试观察
vi /usr/local/nginx/html/index.html
<body>
<h1>192.168.111.201</h1>
</body>
<body>
<h1>192.168.111.202</h1>
</body>
启动nginx
cd /usr/local/nginx/sbin/
./nginx
防火墙开启80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
浏览器访问Nginx
http://192.168.111.201
http://192.168.111.202
四、安装 Keepalived
方式一:
如果能联网可以使用yum快速安装:
yum install -y keepalived
方式二:
可以去keepalived官网直接下载:https://www.keepalived.org/download.html
# 安装依赖
yum -y install gcc openssl openssl-devel libnl libnl-devel libnfnetlink-devel
# 下载
yum -y install wget
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/usr/local/keepalived
make && make installmkdir /etc/keepalived
cp -p /usr/local/keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
编辑配置文件
vi /etc/keepalived/keepalived.conf
(1)编辑 MASTER(主)节点配置文件(192.168.111.201)
! Configuration File for keepalived# 全局配置
global_defs {# 路由ID,不能重复,通常为 hostnamerouter_id 192.168.111.201
}# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {# 检测 nginx 状态的脚本路径script "/etc/keepalived/nginx_check.sh"# #每2秒运行一次上面的脚本interval 2# 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70# 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTERweight -20
}# 定义实例
vrrp_instance VI_1 {# 可选值为 MASTER 或者 BACKUPstate MASTER# 网卡名称,与本机 IP 地址所在的网卡名称相同interface ens32# 虚拟路由的ID,MASTER和BACKUP必须是一致的。virtual_router_id 51# 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级priority 100# 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒advert_int 1# 设置验证类型和密码,两个节点必须一致authentication {# 认证方式,此处PASS表示为密码auth_type PASS# 生产环境设置6位随机密码auth_pass 123456}# 设置虚拟IP地址virtual_ipaddress {192.168.111.250}# 执行脚本track_script {# 对应vrrp_script配置的脚本chk_nginx}
}
(2)编辑 BACKUP(备)节点配置文件(192.168.111.202)
! Configuration File for keepalivedglobal_defs {# 路由ID,不能重复,通常为 hostnamerouter_id 192.168.111.202
}vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2weight -20
}# 定义实例
vrrp_instance VI_1 {# 可选值为 MASTER 或者 BACKUPstate BACKUPinterface ens32virtual_router_id 51# 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级priority 99advert_int 1authentication {auth_type PASSauth_pass 123456}# 设置虚拟IP地址virtual_ipaddress {192.168.111.250}track_script {chk_nginx}
}
(3) 编写 Nginx 状态检测脚本
vi /etc/keepalived/nginx_check.sh
方式一:
如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then# 这里需要替换成自己的nginx安装路径# 尝试重新启动nginx/usr/local/nginx/sbin/nginx# 睡眠2秒sleep 2if [ $A -eq 0 ];then#启动失败,将keepalived服务杀死。killall keepalivedfi
fi
killall命令默认未安装,会报错 killall: 未找到命令。安装方式如下:
yum install -y psmisc
方式二:
如下,返回0或者1。我比较喜欢这种方式。
这里换成其他组件,比如mysql 修改为`pidof mysql` 即可。
#!/bin/bash
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi
给脚本添加执行权限
chmod +x /etc/keepalived/nginx_check.sh
(4) 开启组播防火墙
centos7放行组播地址224.0.0.18,协议vrrp
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens32 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
# 查看规则是否生效
firewall-cmd --permanent --direct --get-all-rules
--direct:指定将要使用直接规则
--permanent:表示永久生效 ,没有此参数重启后失效
--add-rule ipv4 filter:表示添加一个新的策略
设置一条IPV4规则,表为防火墙表 :filter, 处理输入数据包 INPUT ,0 代表在头部添加。后面就是常用的iptables语法
--in-interface ens32:设置网卡名,这里我的网卡名是ens32
--destination 224.0.0.18:设置目标ip地址,也就是设置放行组播地址224.0.0.18
--protocol vrrp:设置拦截的协议
-j ACCEPT:表示放行,-j DROP表示丢弃(不放行)
(5) 启动 Keepalived
# 启动
systemctl start keepalived.service
# 重启
systemctl restart keepalived.service
# 停止
systemctl stop keepalived.service
# 查看运行状态
systemctl status keepalived
# 查看运行进程
ps -ef|grep keepalived
MASTER(主)节点(192.168.111.201)成功标志
可以看到,192.168.111.201拿到了VIP 192.168.111.250。
BACKUP(备)节点(192.168.111.202)成功标志
BACKUP上只有192.168.111.202这个ip,正常。
注意:MASTER节点正常的情况下,BACKUP节点一定不会有浮动IP,也就是VIP只能同时在一个节点上。
(6) 验证VIP漂移
我们先关闭Master,验证VIP是否会漂移到BACKUP上。
关闭 MASTER(主)节点(192.168.111.201) 的 keepalived:
systemctl stop keepalived.service
VIP已经成功飘到BACKUP节点上了
五、Keepalived + Nginx 的高可用测试
访问浮动VIP
http://192.168.111.250
正常情况下,浮动ip飘到 MASTER(主)节点(192.168.111.201)上,所以访问后显示的主节点的nginx首页
如果杀掉 MASTER(主)节点(192.168.111.201)的 nginx
如果nginx进程不存在脚本返回1,nginx进程存在脚本返回0
脚本返回0,表示nginx进程存在,由于上面配置的weight为负数,priority 不会改变。
脚本返回1,表示nginx进程不存在,由于上面配置的weight为负数,priority 会减少,减少后的值 priority = priority+weight
失败一次,将自己的优先级-20,我这里MASTER的priority=100,BACKUP的priority=99
那么MASTER要失败1次后变为80,低于BACKUP的99,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
#!/bin/bash
# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi
杀掉 MASTER(主)节点(192.168.111.201)的 nginx 后,再次访问浮动VIP
http://192.168.111.250
六、常见错误
1、keepalived 配置了虚拟ip,发现无法ping 通这个虚拟ip。
解决方法,把配置文件中的 vrrp_strict 给注释掉,重启 keepalived 服务后再次ping就可以了。
2、启动失败、卡住
使用命令 journalctl -xe 查看日志,有这样一行:
Failed to parse PID from file /usr/local/keepalived/var/run/keepalived.pid: Invalid argument
这里因为源码安装的方式,pid文件找不到,使用命令 systemctl status keepalived 查看 load文件路径:loaded (/usr/lib/systemd/system/keepalived.service)
修改/usr/lib/systemd/system/keepalived.service该文件内容:PIDFile=/var/run/keepalived.pid
参考:
keepalived应用:漂移IP的实现_keepalived做ip漂移_Joy_B的博客-CSDN博客
keepalive实战_sending/queueing gratuitous arps_程序员柒叔的博客-CSDN博客
linux防火墙下允许keepalived组播_keepalived 防火墙_老帽爬新坡的博客-CSDN博客