一、Keepalived案例分析
企业应用中,单台服务器承担应用存在单点故障的危险
单点故障一旦发生,企业服务将发生中断,造成极大的危害
二、Keepalived工具介绍
-
专为LVS和HA设计的一款健康检查工具
- 支持故障自动切换(Failover)
- 支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其从新加入群集并且业务重新切换回master节点
- 官方网站:http://www.keepalived.org/
- 补充1:一个合格的群集应该具备的特点
负载均衡 用于提高群集的性能 LVS Nginx HAProxy SLB F5
健康检查(探针) 针对于调度器和节点服务器 Keepalived Heartbeat
故障转移 通过VIP漂移实现主备切换 VRRP 脚本
- 补充2:健康检查(探针)常用的工作方式
发送心跳消息 vrrp报文 ping/pong
TCP端口检查 向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
HTTP URL检查 向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET请求方法,如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常;如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常
三、Keepalived实现原理剖析
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性
- Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能
- VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方法
由多台路由器组成一个热备组,通过共用的虚拟IP对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
四、Keepalived体系主要模块及其作用
- core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
- vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
- check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)
五、Keepalived案例讲解
- Keepalived可实现多机热备,每个热备组可有多台服务器
- 双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
- 实现基于Web服务的双机热备
漂移地址:192.168.10.72
主、备服务器:192.168.10.73、192.168.10.74
提供的应用服务:Web
六、Keepalived安装与启动
- 在LVS群集环境中应用时,也需用到ipvsadm管理工具
- YUM安装Keepalived
- 启用Keepalived服务
-
源码编译安装
下载程序包
tar -zxf keepalived-2.2.8.tar.gz #解压缩
yum -y install openssl-devel
yum install libnl-devel #安装模块
./configure -prefix=/opt/keepalived #编译
make && make install #安装
七、部署Keepalived
实验前准备2台服务器
systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disable
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
- 主服务器
cd /etc/keepalived
ls
cp keepalived.conf keepalived.bak #配置文件进行备份
ls
修改配置文件
- 备服务器
操作相同,配置文件修改稍作更改如下
systemctl start keepalived.service
systemctl enable keepalived.service
主服务器
备服务器
- 小问题:Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP
Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。
优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。
八、keepalived的抢占与非抢占模式
抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
非抢占式俩节点state必须为bakcup,且必须配置nopreempt。
- 注意:
这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。
九、LVS+Keepalived高可用负载均衡
准备5台服务器
nfs服务器与节点服务器配置见案例:LVS DR模式-CSDN博客
- 负载调度器(均已安装keepalived服务,见上述部署操作)
yum install -y ipvsadm
modprobe ip_vs #加载模块
lsmod | grep ip_vs
touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm
systemctl status ipvsadm
vim /etc/keepalived/keepalived.conf
TCP端口检查方式
systemctl start keepalived.service
ip a
主服务器
备服务器
ipvsadm -ln #规则已自动生成
- 检验
刷新
将主服务器宕机后,备服务器启用,结果与以上情况相同
十、实现master/master双主架构
- 配置
#服务器1的配置keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
}
vrrp_instance VI_1 {
state MASTER # 在另一个主机上为BACKUP
interface ens33
virtual_router_id 51 # 每个vrrp_instance唯一
priority 100 # 在另一个主机上为50,保证能选出主
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.10 dev ens33 label ens33:0 # 指定vrrp_instance的VIP和label
}
}
vrrp_instance VI_2 { # 再定义一个虚拟路由器VI_2实例
state BACKUP # 在另一个主机上为MASTER
interface ens33
virtual_router_id 61 # 每个vrrp_instance唯一
priority 50 # 在另一个主机上为100,保证能选出主
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.50 dev ens33 label ens33:1 # 指定vrrp_instance的VIP和label
}
}
#服务器2的配置 keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
}
vrrp_instance VI_1 {
state BACKUP # 此行修改为BACKUP
interface ens33
virtual_router_id 51
priority 50 # 此行修改为50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.10 dev ens33 label ens33:0
}
}
vrrp_instance VI_2 {
state MASTER # 此行修改为MASTER
interface ens33
virtual_router_id 61
priority 100 # 此行修改为100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.50 dev ens33 label ens33:1
}
}
- 验证
# 重启keepalived服务:在两台设备上都执行:
systemctl restart keepalived
# 查看两个节点各自的VIP
[root@lb01 keepalived]# ip a | egrep "10.0.0.10|0.50"
inet 10.0.0.10/32 scope global ens33:0
[root@lb02 keepalived]# ip a | egrep "10.0.0.10|0.50"
inet 10.0.0.50/32 scope global ens33:1
十一、Nginx实现高可用
- yum方式安装的配置文件/etc/keepalived
#主服务器配置
vi keepalived.conf
keepalived.conf:
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔,单位是秒)
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.16.130 # 定义虚拟ip(VIP),可多设,每行一个
}
}
#备服务器配置
#检测脚本
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动
interval 2 #(检测脚本执行的间隔)
weight 2 #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 99 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.16.130 # 定义虚拟ip(VIP),可多设,每行一个
}
}
- 检测脚本
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #如果nginx没有启动就启动nginx
systemctl start nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
-
实验
实验环境同LVS+Keepalived高可用负载均衡,负载调度器配置不同
-
负载调度器配置(均已使用yum安装完nginx)
nginx -V
cd /etc/nginx
vim nginx.conf
nginx -t
systemctl enable --now nginx
- 测试
刷新
另一台配置同上测试结果相同
-
高可用操作
yum install -y keepalived
cd /etc/keepalived
touch check_nginx.sh
vim check_nginx.sh
#!/bin/bash
if !killall -0 nginx &> /dev/null
then
systemctl stop keepalived
fi
chmod +x check_nginx.sh
vim keepalived.conf
systemctl start keepalived
systemctl enable keepalived
ip a
主服务器
备服务器
- 测试
刷新
尝试故障转移测试(关闭主服务器nginx后keepalived也停止运行)
VIP转移到备服务器,且测试结果同上
若需要还原,则因为脚本的缘故,应先启动主服务器nginx服务再启动keepalived
十二、Keepalived脑裂故障
-
现象
主服务器和备服务器都同时拥有相同的VIP
-
原因
因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
-
解决
关闭主服务器或备服务器其中一个的keepalived服务
-
预防
如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
#主服务器脚本
#!/bin/bash
while true
do
ping -c4 -i 0.5 -W 2 备服务器IP
if 「 $? -ne 0 ]
then ssh 另一台主机IP ping -c 4 -i 0.5 -W2 -I 另一台主机IP 备服务器IP
if [ $? -eg 0 ]
then systemctl stop keepalived
fi
fi
sleep 20
done
利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务