一、概念与原理
1.Keepalived
基于 VRRP 协议实现高可用(HA)。初衷是为 LVS 负载均衡提供高可用方案,后来支持其他服务(如 Nginx、MySQL 等)。
功能:
LVS 集群管理
节点健康检查(Health Check)
Keepalive可以通过在自身的Keepalive.conf文件里配置LVS的节点IP和相关参数实现对LVS 的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务 时,Keepalive服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度 到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后, Keepalive服务又会自动地把它们加入到正常转发队列中,对客户提供服务。
故障自动切换(Failover)
Keepalive可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换, 这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,Nginx反向代理这样的服 务器。
Keepalive高可用功能实现的简单原理为,两台主机同时安装好Keepalive软件并启动服务,开 始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作 为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动 接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障 修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时 它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
高可用 VIP(虚拟 IP)接管
2.VRRP 工作原理
MASTER 节点发送心跳(通告)给 BACKUP 节点。BACKUP 节点收不到心跳时,接管 VIP。MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。默认多播地址:224.0.0.18
优先级决定 MASTER 节点(数值越大优先)。
3.Keepalived 主要模块
| 模块 | 功能 |
|---|---|
| core | 核心进程、配置文件加载解析 |
| vrrp | VRRP 协议实现,高可用 |
| check | 健康检查,支持 TCP/HTTP/脚本检查 |
二、脑裂问题与防护
1. 脑裂(Split Brain)
1.脑裂(Split Brain)
两个节点失去心跳连接,均认为对方挂掉。
后果:共享资源冲突。 数据损坏(如数据库)
在高可用(HA)系统中,当联系2个节点的"心跳线"断开时,本来为一整体、动作协调的HA系统,就分裂成为 2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像"裂脑人"一样,争抢 "共享资源"、争起"应用服务",就会发生严重后果------或者共享资源被瓜分、2边"服务"都起不来了;或者2边 "服务"都起来了,但同时读写"共享存储",导致数据损坏(常见如数据库轮询着的联机日志出错)。
2. 原因:
1.心跳线故障(断线、老化)。高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断开,老化)。
2.网卡/驱动故障
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
3.心跳网络设备故障
因心跳线间连接的设备故障(网卡及交换机)。
4.仲裁机器异常
因仲裁的机器出问题导致仲裁机器异常。
5.防火墙阻挡 VRRP
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
6.配置不一致(virtual_router_id、优先级、实例名)
Keepalive配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发 生。
7.vrrp实例名字不一致、优先级一致
3. 防护策略
双心跳线冗余
添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"裂脑"发生几率。
磁盘锁(锁定共享资源)
正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也 会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实 中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用 服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到 对端)时才启用磁盘锁。平时就不上锁了。仲裁机制(Ping 参考 IP)
仲裁机制(Ping 参考 IP)
例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明 断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服 务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通 参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
脚本监控报警
三、部署步骤
1.环境准备
主 DR:192.168.10.80(MASTER)
备 DR:192.168.10.23(BACKUP)
VIP:192.168.10.180
Web 节点: 192.168.10.16 & 192.168.10.17
客户端:192.168.10.100
2.安装与配置 LVS + Keepalived
DR 服务器操作
systemctl stop firewalld
setenforce 0
yum -y install ipvsadm keepalived
modprobe ip_vs
cat /proc/net/ip_vs # 检查模块
配置 Keepalived
文件: /etc/keepalived/keepalived.conf
关键配置:
global_defs {
router_id LVS_01
smtp_server 127.0.0.1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180
}
}
virtual_server 192.168.10.180 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.10.16 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.17 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
VIP 配置:
vim /etc/sysconfig/network-scripts/ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
重启网络
systemctl restart network
ifup ens33:0
启动服务
systemctl start keepalived
ip addr # 查看 VIP 是否生效
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
ipvsadm -ln # 查看 LVS 配置
内核参数优化
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
sysctl -p
配置web节点
systemctl stop firewalld
setenforce 0
yum -y install httpd
systemctl start httpd
echo 'this is kgc web!' > /var/www/html/index.html # 192.168.10.16
echo 'this is benet web!' > /var/www/html/index.html # 192.168.10.17
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
service network restart
ifup lo:0
route add -host 192.168.10.180 dev lo:0
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
sysctl -p
测试
客户端访问 VIP http://192.168.10.180/
停掉 MASTER Keepalived
systemctl stop keepalived
观察 BACKUP 节点接管 VIP 是否成功,再启动 MASTER,观察 VIP 是否回归(抢占或非抢占模式)。