文章目录
- 前言
- 一、keepalived概念和原理
- 二、脑裂问题和解决方案
- 三、LVS+keepalived部署
-
- 1、环境准备
- 2、通用操作(所有节点)
- 3、配置节点(DR)-keepalived
- 4、节点配置
-
- [4.1、配置 VIP 到 lo 接口](#4.1、配置 VIP 到 lo 接口)
- [4.2、ARP 参数调整,避免MAC冲突](#4.2、ARP 参数调整,避免MAC冲突)
- 5、启动服务
- 6、测试
- 7、小结
- 总结
前言
上一章节介绍了LVS的部署,本文主要介绍keepalived和部署keepalived在LVS上的内容。
本文围绕 LVS+Keepalived 高可用负载均衡集群展开,先解析核心概念与 VRRP 原理,再阐述脑裂问题解决方案,最后提供从环境配置到测试验证的完整部署实操指南。
一、keepalived概念和原理
1、keepalived介绍
- 基于 VRRP 协议实现高可用(HA)
- 初衷是为 LVS 负载均衡提供高可用方案,后来支持其他服务(如 Nginx、MySQL 等)
- 具体实现功能:
1、LVS集群管理
2、节点健康检查
3、故障自动切换
4、高可用vip接管
2、vrrp工作原理
- MASTER 节点发送心跳(通告)给 BACKUP 节点。
- BACKUP 节点收不到心跳时,接管 VIP。
- MASTER 恢复时,可抢回 VIP(抢占模式)或不抢回(非抢占模式)。
- 默认多播地址:224.0.0.18
- 优先级决定 MASTER 节点(数值越大优先)。
3、keepalived主要模块
core : 核心进程、配置文件加载解析
vrrp : VRRP 协议实现,高可用
check : 健康检查,支持 TCP/HTTP/脚本检查
二、脑裂问题和解决方案
1、什么是脑裂
两个节点失去心跳连接,均认为对方挂掉
结果:
1、共享资源冲突
2、数据损坏(如数据库)
2、原因
- 心跳线故障(断线、老化)
高可用服务器对之间心跳线链路发生故障,导致无法正常通信。如心跳线坏了(包括断了,老化)。 - 网卡/驱动故障
因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。 - 心跳网络设备故障
因心跳线间连接的设备故障(网卡及交换机)。 - 仲裁机器异常
因仲裁的机器出问题 - 防火墙阻挡 VRRP
高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。 - 配置不一致(virtual_router_id、优先级、实例名)
Keepalive配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。 - vrrp实例名字不一致、优先级一致。
解决策略
1、双心跳线冗余
添加冗余的心跳线,例如:双线条线(心跳线也HA),尽量减少"裂脑"发生几率。
2、磁盘锁(锁定共享资源)
正在服务一方锁住共享磁盘,"裂脑"发生时,让对方完全"抢不走"共享磁盘资源。但使用锁磁盘也会有一个不小的问题,如果占用共享盘的一方不主动"解锁",另一方就永远得不到共享磁盘。现实中假如服务节点突然死机或崩溃,就不可能执行解锁命令。后备节点也就接管不了共享资源和应用服务。于是有人在HA中设计了"智能"锁。即:正在服务的一方只在发现心跳线全部断开(察觉不到对端)时才启用磁盘锁。平时就不上锁了。
3、仲裁机制(Ping 参考 IP)
例如设置参考IP(如网关IP),当心跳线完全断开时,2个节点都各自ping一下参考IP,不通则表明断点就出在本端。不仅"心跳"、还兼对外"服务"的本端网络链路断了,即使启动(或继续)应用服务也没有用了,那就主动放弃竞争,让能够ping通参考IP的一端去起服务。更保险一些,ping不通参考IP的一方干脆就自我重启,以彻底释放有可能还占用着的那些共享资源。
4、脚本监控报警
三、LVS+keepalived部署
1、环境准备
主 DR:192.168.10.103(MASTER)
备 DR:192.168.10.104(BACKUP)
VIP:192.168.10.180
Web 节点:
192.168.10.101
192.168.10.102
客户端:192.168.10.2
2、通用操作(所有节点)
2.1、关闭防火墙和selinux
bash
# 关闭防火墙和增强服务
systemctl stop firewalld
setenforce 0
# 永久关闭SELinux(需重启)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.2、安装依赖包
主 / 备 LVS 节点:安装 keepalived、ipvsadm和加载ip_vs
bash
# 下载安装keepalived
yum -y install ipvsadm keepalived
# 加载lvs模块
modprobe ip_vs
cat /proc/net/ip_vs # 检查模块
后端 RealServer:安装 httpd或nginx(用于测试负载均衡)
bash
yum install -y httpd && systemctl enable httpd
如果需要使用nginx可以看之前的nginx编译安装流程。当然也可以yum install -y nginx(不推荐,更新、模块、安装路径无法控制)
3、配置节点(DR)-keepalived
3.1、配置主节点-keepalived
vim /etc/keepalived/keepalived.conf
bash
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_01
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
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/32
}
}
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.101 80 {
weight 1 # 服务器的权重
# 对后端服务器的TCP 层健康检查.(检测 80 端口是否存活)
TCP_CHECK {
connect_port 80 # 检查的端口(后端 HTTP 服务端口)
connect_timeout 3 # 连接超时时间(3 秒)
nb_get_retry 3 # 连接失败时的重试次数(3 次)
delay_before_retry 3 # 重试间隔(3 秒)
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3.2、配置备用节点-keepalived
vim /etc/keepalived/keepalived.conf
bash
global_defs {
router_id LVS_02 # MASTER 为 LVS_01,BACKUP 为 LVS_02
smtp_server 127.0.0.1
}
vrrp_instance VI_1 {
state BACKUP # BACKUP 节点写 BACKUP
interface ens33
virtual_router_id 10
priority 90 # MASTER 高于 BACKUP
advert_int 1
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.10.180/32
}
}
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.101 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.10.102 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
3.3、主备节点参数优化
bash
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
4、节点配置
4.1、配置 VIP 到 lo 接口
bash
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
# 内容
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.10.180
NETMASK=255.255.255.255
ifup lo:0
ifconfig lo:0
route add -host 192.168.10.180 dev lo:0
4.2、ARP 参数调整,避免MAC冲突
bash
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
5、启动服务
测试页面写入内容
bash
# 192.168.10.101
echo 'this is 192.168.10.101 web01!' > /var/www/html/index.html
# 192.168.10.102
echo 'this is 192.168.10.102 web02!' > /var/www/html/index.html
启动服务
bash
systemctl restart httpd # rs节点
systemctl restart nginx # rs节点
systemctl restart keepalived # 主备节点
6、测试
主节点启动keepalived正常显示如下:

备节点启动keepalived正常显示如下:

7、小结
1、VIP
DR 节点配置 VIP 网卡 ens33:0,Web 节点配置 lo:0
2、抢占模式
MASTER 恢复会抢回 VIP,非抢占模式需配置 nopreempt
3、健康检查
Keepalived 支持 TCP/HTTP 检查,可防止故障节点被调度
4、防火墙
Firewalld 需关闭,确保 VRRP 心跳消息畅通
5、脑裂防护
双心跳线、磁盘锁、仲裁 IP、脚本监控
总结
本文通过标准化部署流程与参数优化,实现了 LVS+Keepalived 集群的负载均衡与故障自动切换,规避脑裂风险,为业务高可用提供可靠实操方案。