基础环境
- CentOS Linux release 7.9.2009
- Keepalived v1.3.5 (03/19,2017)
- nginx version: nginx/1.26.1
技术方案
LVS-DR + Keepalived
方案 优点 缺点
LVS-DR + Keepalived 性能极高,扩展性好 配置复杂,需同网段
网络拓扑图

安装
# 换源
cd /etc/yum.repos.d/
mkdir back && mv CentOS-* back/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache fast
# 安装Keepalive
yum install -y keepalived
# 关闭SELinux
vim /etc/selinux/config
# 关闭防火墙
systemctl stop firewalld
systemct disabled firewalld
# 重启
配置Keepalive
vim /etc/keepalived/keepalived.conf
以下只是基本配置,具体详细配置参考官方文档
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL_02 # 当前 Keepalived 节点的标识符,通常用于日志和邮件通知中
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
# 节点类型,只是启动时标志,并不对应实际,有抢占时,当前可能是一个Master
state BACKUP # 初始角色
interface enp0s9 # 绑定的网卡,VRRP 报文和虚拟 IP 都在此接口上工作。
virtual_router_id 51 # 虚拟组ID,同一个组里面必需一样
priority 90 # 优先级,越高越能拿到VIP,所有节点不要设置为一样,否则会导致无法频繁的切换
advert_int 1 # VRRP 通告(心跳)间隔为 1 秒。主备节点必须一致。
authentication { # 验证
auth_type PASS
auth_pass 1111
}
# 抢占虚拟的IP
virtual_ipaddress {
# 虚拟IP 设备 设备别名标签
192.168.1.254/24 dev enp0s9 label enp0s9:0
}
# 抢占延迟,可以不填写,默认为0,即马上抢占,单位毫秒
preempt delay 60
}
# LVS 虚拟服务器配置(负载均衡 + 健康检查)
virtual_server 192.168.1.254 80 {
delay_loop 6
lb_algo rr # 轮询算法(rr, wrr, lc, wlc 等)
lb_kind DR # DR 模式(Direct Routing)
protocol TCP
nat_mask 255.255.255.0
# 后端真实服务器(2台)
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置,启动命令
systemctl start keepalived
查询抢点到的VIP情况
enp0s9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.8 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::5fbd:f0fe:2ed9:e8e9 prefixlen 64 scopeid 0x20 ether 08:00:27:68:02:3b txqueuelen 1000 (Ethernet)
RX packets 10351 bytes 830896 (811.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21199 bytes 1703249 (1.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0enp0s9:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.254 netmask 255.255.255.0 broadcast 0.0.0.0
ether 08:00:27:68:02:3b txqueuelen 1000 (Ethernet)[root@PXC01 keepalived]# ip add show enp0s9
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:68:02:3b brd ff:ff:ff:ff:ff:ff
inet 192.168.1.8/24 brd 192.168.1.255 scope global noprefixroute dynamic enp0s9
valid_lft 75297sec preferred_lft 75297sec
inet 192.168.1.254/24 scope global secondary enp0s9:0
valid_lft forever preferred_lft forever
inet6 fe80::5fbd:f0fe:2ed9:e8e9/64 scope link noprefixroute
valid_lft forever preferred_lft forever
后端服务配置
安装Nginx
wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx.x86_64
# 启动前,配置好nginx的监听地址,必需是0.0.0.0 或者 VIP地址
本地网卡绑定Vip地址
# 临时添加
ip addr add 192.168.1.254/32 dev lo
ip link set lo up
# 或永久添加(写入 /etc/rc.local 或 systemd 服务)
echo "ip addr add 172.16.42.100/32 dev lo" >> /etc/rc.local
# 查看绑定结果
ip add show lo
# 启用 ARP 抑制,不启用,可能会导致 脑裂 或 冲突
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
注意
防火墙和安全组允许 VRRP 协议
VRRP 使用协议号 112(IP protocol number),不是 TCP/UDP。
必须确保:
主备节点之间可以互相收发 VRRP 报文(组播地址 224.0.0.18)
防火墙(如 iptables/firewalld)、云平台安全组、硬件防火墙均放行协议 112
否则即使 IP 配置正确,也无法完成主备选举。交换机支持组播和 ARP 更新
VRRP 使用组播地址 224.0.0.18 发送通告报文。
若交换机禁用了组播或 IGMP Snooping 配置不当,可能导致主备无法通信。
切换后,新主节点会发送 Gratuitous ARP(免费 ARP) 来通知网络设备更新 MAC 映射。某些虚拟化环境(如 VMware、OpenStack)需开启 "Promiscuous Mode" 或允许 MAC 漂移。
VirtualBox 中安装时,要特殊配置
网卡上要启用 混杂模式(Promiscuous Mode)
操作路径:
- 打开 VirtualBox 管理器
- 选中你的虚拟机 → 右键 → Settings(设置)
- 进入 Network(网络) → 选择对应的网卡
- 在 Advanced(高级) 下拉找到 Promiscuous Mode(混杂模式)
- 将其设置为:✅ Allow All(允许全部)
防火墙放行VRRP协议
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload
查看VIP
# 抓包方式,查看组播是否正常
tcpdump -i enp0s9 proto 112
# 通过 ip addr show enp0s9 查询
# 通过 ifconfig 也可以看到
# 上面两个有看到相应的VIP里,即知道当前VIP在哪台机子
查看keepalived的日志
systemctl restart rsyslog
journalctl -u keepalived -f # 类似tail -f ,也可以用 -n 参数指定日志的行数
journalctl -u keepalived -b -1 # 查看上一次系统启动时的日志
接管
如果Master宕机,备份在 1~3 秒内接管 VIP,继续服务
后端服务增加节点
增加节点后,要修改keepalived.conf中的 real_server节点,并使用systemctl reload keepalived,来重新加载配置文件