一、keepalive相关知识
1.1 keepalive介绍
keepalive即LVS集群当中的高可用架构,只是针对调度器的高可用。是高可用的HA架构。
keepalive就是基于VRRP协议来实现LVS高可用的方案。
-
组播地址
224.0.0.18,根据组播地址进行通信,主备之间发送报文,确定对方是否存活
-
根据优先级判定主和备的位置
-
故障切换,主挂了,备来接替工作;主恢复了,备继续等待。
-
主备之间的切换是VIP地址的切换。
keepalive 是专门为了LVS而出现的,但是不是LVS专用的。
1.2 主、备 调度器
主调度器和备调度器(备可以是多台,一般一主一备)
在主调度器正常工作的时候,备完全处于冗余状态(待命)。备不参与集群的运转,只有当主调度器出现故障时,备才会承担主调度器的工作。一般主调度器恢复功能之后,主会继续作为集群的入口,备回到冗余状态,这个取决于优先级。
keepalive就是调度器的高可用。
VIP地址主备之间的切换,主在工作时,VIP地址只在主上,主停止工作,VIP漂移到备服务器。
在主备优先级不变的情况下,主恢复工作,VIP会飘回到主服务器。
注意事项:
- 配优先级
- 配置VIP和真实服务器
- 主备的virtual_router_id要一致
- 主备的router_id要区分
1.3 脑裂
问:脑裂是什么?
HA架构(高可用架构)中的一个特殊现象,只要使用VIP地址代理的冗余模式的高可用,都有可能出现脑裂的问题。即主和备同时都有VIP地址。
主和备无法确定各自的身份,同时出现了VIP地址,两边都起来了,但两边都无法使用。
可能原因:
- keepalive的配置文件问题,IP地址配置冲突等
- 硬件问题:网卡,网线等故障
- 防火墙的策略,iptables的策略屏蔽了组播地址的广播,屏蔽了VRRP协议的报文
- 两台服务器的时间不同步,也可能导致这个问题
- 其他服务配置对keepalive的心跳线检测造成了干扰
怎么解决脑裂?
- 检查硬件,网卡,网线等
- 查看主备节点的keepalived日志,查看具体报错信息,定位问题
- 检查端口冲突和监听设置,确保其他服务没有占用keepalived使用的VIP或者监控端口。
- 查看配置文件,检查IP地址配置、心跳线检测的间隔和超时时间等配置是否合理
- 查看防火墙策略,确定心跳线检测消息没有被屏蔽
- 查看服务器网络状态,以及时间是否同步
二、keepalive相关配置
安装keepalive服务:
yum -y install ipvsadm keepalived
2.1 keepalive模块
-
core 模块:keepalive的核心模块,负责主进程的启动、维护以及全局配置文件的加载
-
vrrp 模块:实现vrrp协议的模块,也就是主功能模块
-
check 模块:负责健康检查。也可以检查后台真实服务器的情况。
2.2 keepalive的配置文件
cd /etc/keepalived
#编辑前先备份
cp keepalived.conf keepalived.conf.bak.current_date
vim keepalived.conf
#在global_defs中
smtp_server 127.0.0.1
router_id lvs_01
#主备的的id不能一样
vrrp_strict
#(取消注释,新版默认应该是取消的)
vrrp_iptables
#添加这一行,否则重启keepalive会添加防火墙规则drop所有keepalive的请求vrrp_instance VI_1 中
state MASTER
#备的state是 BACKUP
interface ens33
virtual_router_id 10
#下面是VIP地址
virtual_ipaddress{20.0.0.100
}virtual_server 20.0.0.100 80 {
#在VIP模块中设置后台真实服务器real_server 20.0.0.21 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}real_server 20.0.0.21 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 4}}
}
#下面的删除systemctl restart keepalived
keepalive是专门为LVS打造的,但不是只能为LVS服务。
keepalive也可以和Nginx、Haproxy配合使用
2.3 keepalive+Nginx实现高可用
例:
nginx1 :主 20.0.0.21 keepalive
nginx2 :备 20.0.0.22 keepalive
nginx1是主服务器,监控nginx1的服务状态,如果nginx1的服务停止,需要自动停止nginx1的keepalive,这样VIP才会漂移到nginx2上。可用脚本实现自动关闭keepalive。如果主的nginx服务恢复,VIP再漂移到nginx1上。
nginx1,主的配置
编辑检查nginx状态的脚本
vim /opt/check_nginx.sh
#内容如下
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
#指定curl命令的路径调用curl命令
#curl -I 仅查看http响应头部信息,而不用下载页面内容,常用于状态检查
if [ $? -ne 0 ]
thensystemctl stop keepalived
fi
配置keepalived
vim /etc/keepalived/keepalived.confvrrp_script check_nginx {
#定义了一个名为 check_nginx 的 VRRP 脚本script "/opt/check_nginx.sh"#指定脚本位置interval 5#间隔5秒
}
在vrrp_instance VI_1 中添加 追踪脚本组 track_script ,vrrp会跟踪和监控脚本check_nginx
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 10track_script {check_nginx}
}
因为要求只要实现主备切换,后台不存在真实服务器,所以下面的模块都可以删除。只保留到vrrp_instance模块就可以了。
验证:
在nginx1 上 ip addr
查看,可以看到VIP20.0.0.100在主服务器上
客户机访问VIP地址,获得nginx1的web服务
关闭nginx1的nginx服务,过5秒,客户机访问VIP地址,获得nginx2的web服务,VIP地址漂移到nginx2上。