1.什么是keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
2.工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。
3.keepalived+nginx实现高可用过程
4 准备
Linux下Nginx+keepalived实现高可用 - 仅此而已-远方 - 博客园
虚拟机两台,安装Nginx,安装 keepalived 可直接使用命令 yum -y install keepalived 。
keepalived 默认配置文件路径:/etc/keepalived/keepalived.conf
keepalived 默认日志存放路径:/var/log/messages
网格划分如下:
名称 | 操作系统 | IP | 虚拟IP | keepalived |
虚拟机1 | Centos7.6 | 192.168.20.12 | 192.168.20.100 | MASTER |
虚拟机2 | Centos7.6 | 192.168.20.16 | 192.168.20.100 | BACKUP |
5、keepalived抢占式配置
MASTER配置如下(默认配置文件:/etc/keepalived/keepalived.conf):
global_defs {
router_id keep12 ##路由id,通常为 hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 10 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
vrrp_instance VI_1 {
state MASTER ##主节点为 MASTER,备份节点为 BACKUP
interface ens32 ##绑定 VIP 的网络接口,与本机IP地址所在网络接口相同
virtual_router_id 100 ##虚拟路由id,主从节点必须保持一致
priority 100 ##节点优先级,直范围0-254,MASTER 要比 BACKUP 高
advert_int 1
authentication { ##设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx ##执行 Nginx 监控
}
virtual_ipaddress {
192.168.20.100 ##VIP,两个节点必须设置一样(可设置多个)
}
}
BACKUP配置如下(默认配置文件:/etc/keepalived/keepalived.conf):
global_defs {
router_id keep16 ##路由id,通常为 hostname
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 10 ## 检测时间间隔
weight -20 ## 如果条件成立,权重-20
}
vrrp_instance VI_1 {
state BACKUP ##主节点为 MASTER,备份节点为 BACKUP
interface ens32 ##绑定 VIP 的网络接口,与本机IP地址所在网络接口相同
virtual_router_id 100 ##虚拟路由id,主从节点必须保持一致
priority 90 ##节点优先级,直范围0-254,MASTER 要比 BACKUP 高
advert_int 1
authentication { ##设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 123456
}
track_script {
chk_nginx ##执行 Nginx 监控
}
virtual_ipaddress {
192.168.20.100 ##VIP,两个节点必须设置一样(可设置多个)
}
}
其中有几个配置需要注意:
a、router_id,最好配置成hostname(需要在 /etc/hosts 文件中,增加一行,比如:127.0.0.1 keep12)
b、interface,本机IP地址所在网络接口(可以通过 ifconfig 命令查看具体ip所对应的那个接口名称)
c. interval : 心跳检查间隔时间太短了,会报错.
脚本中的sleep时间是2s,那么interval至少 大于2秒. 我设置10秒
日志提示:/etc/keepalived/nginx_check.sh exited due to signal 15
原因:心跳检查间隔时间太短了
解决:interval设置大一点(一定要大于sleep时间)
6、增加检测心跳脚本
在 /etc/keepalived 目录下,新增文件 nginx_check.sh (和上面对应script中对应),然后添加内容
chmod 777 nginx_check.sh 授权
#!/bin/bash
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
/usr/sbin/nginx
fi
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi
7. 启动
[root@localhost /]# service keepalived start -- 启动
[root@localhost /]# service keepalived stop --关闭
[root@localhost /]# ps aux|grep keepalived --查看进程
我一般kill
7、测试
nginx的index.html 写上ip,来区分访问的页面
a、分别启动两台机器上的 Nginx 和 keepalived,然后访问虚拟ip:http://192.168.20.100 看到的A机器
b、停掉192.168.20.12上的Nginx服务,在 keepalived的日志文件中可以看到心跳脚本被执行了,最后杀掉了keepalived: (也可以直接停掉keeplived,模拟主机当机)
为了方便测试,最好先将上面心跳脚本文件中的重启nginx注释掉,不然手动停止Nginx后,又会被keepalived复活。
C. 然后访问虚拟ip:http://192.168.20.100 看到是B机器
D. 重启A机器上keeplive 或者nginx. 访问http://192.168.20.100 看到是B机器. 除非把B停掉才会切换回来
8. 遇到报错:
>>> 心跳脚本没有被执行
原因: 脚本写错了,所以编辑心跳脚本文件,可以通过sh nginx_check.sh 命令执行一下,看编写的脚本是否正确
>>> 心跳脚本执行报错,日志提示:WARNING - script '/etc/keepalived/nginx_check.sh' is not executable for uid:gid 0:0 - disabling.
原因:心跳脚本文件没有执行权限
解决:chmod +x /etc/keepalived/nginx_check.sh
>>> 心跳脚本执行报错,日志提示:/etc/keepalived/nginx_check.sh exited due to signal 15
原因:心跳检查间隔时间太短了
解决:interval设置大一点(一定要大于sleep时间)
9. Keepalived非抢占模式配置
Keepalived非抢占模式配置 - T-BARBARIANS - 博客园
下面直接展示keepalived的非抢占配置。
主机配置如下:
vrrp_instance VI_1
{
state BACKUP
nopreempt
priority 100
advert_int 1
virtual_router_id 1
interface eth0
authentication
{
auth_type PASS
auth_pass abcd@hehe
}
virtual_ipaddress
{
100.92.2.110
}
}
备机配置如下:
vrrp_instance VI_1
{
state BACKUP
nopreempt
priority 90
advert_int 1
virtual_router_id 1
interface eth0
authentication
{
auth_type PASS
auth_pass abcd@hehe
}
virtual_ipaddress
{
100.92.2.110
}
}
重点:
1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt
引用官方文档对nopreempt字段的说明:
"nopreempt" allows the lower priority machine to maintain the master role, even when a higher priority machine comes back online.
NOTE: For this to work, the initial state of this entry must be BACKUP.
根据上述描述,第一点提到的state必须配置为BACKUP就明白了。
3、其中一个节点的优先级必须要高于另外一个节点的优先级。
10. 配置keeplived日志文件
>> vi /etc/sysconfig/keepalived #修改配置文件
KEEPALIVED_OPTIONS=”-D -d -S 0”
>> vi /etc/rsyslog.conf #修改配置文件
local0.* /var/log/keepalived.log #日志保存位置
>> 重启服务
重启 rsyslog 服务:service rsyslog restart
重启 keepalived 服务:service keepalived restart
>> 日志可以在 /var/log/keepalived.log 看到
11 如何判断虚ip对应哪台机器
ip addr
表示再此机器上
表示不再此机器上
12 如果虚ip 在两台机器上就出问题
记一次keepalived和VIP导致的故障 - 腾讯云开发者社区-腾讯云
有2台服务器绑定相同的vip, 出现大面积的不能访问
问题的根源在于,keepalived为网卡停止后,keepalived为网卡绑定的VIP并没有移除,导致多台机器出现同样的ip。
解决方案, 通过ip addr delete
删除绑定的vip
ip addr delete 172.31.161.42/32 dev eno1
ip addr delete 172.31.161.41/32 dev eno1
ip addr delete 172.31.161.41/0 dev eno1
顺道介绍如何给网卡绑定vip
ip addr add 172.31.161.41/32 dev eno1
13 nginx 部署:
linux安装nginx_我家小宝_朱朱的博客-CSDN博客
14. haproxy 部署:
linux-rabbit集群部署+ha_我家小宝_朱朱的博客-CSDN博客
15 haproxy+nginx的脚本
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -D
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
/usr/sbin/nginx
fi
sleep 2
if [ $(ps -C nginx --no-header | wc -l) -eq 0 ]; then
killall keepalived
fi