在企业级应用架构中,保障服务的持续可用性至关重要。本文将详细拆解一个基于LVS(Linux Virtual Server)DR(Direct Routing)模式配合Keepalived实现高可用负载均衡的经典配置案例,手把手带你完成从网络规划到服务验证的全过程。
整体架构与网络规划
为了清晰地展示整个架构,我们首先定义所有节点的IP地址规划:
核心思路:外部用户访问公网IP 124.126.147.168:80,经由路由器NAT转换至内网VIP 192.168.0.253。两台LVS调度器通过Keepalived竞争VIP,主调度器负责将请求以DR模式转发至后端的 web1 或 web2。后端服务器直接响应客户端,从而实现高性能的负载分流。
后端真实服务器配置
首先,我们需要在两台Web服务器上进行配置,关键在于设置ARP抑制,避免多台设备响应VIP的ARP请求导致混乱。
Web1 服务器配置 (IP: 192.168.0.1)
-
配置真实网卡 (eno1111):
BOOTPROTO=static
DEVICE=eno1111
ONBOOT=yes
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
-
创建虚拟IP网卡 (lo:0):
新建文件 /etc/sysconfig/network-scripts/ifcfg-lo:0,内容如下:
BOOTPROTO=static
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.0.253
NETMASK=255.255.255.255
注意:虚拟网卡无需配置GATEWAY。
-
配置ARP抑制参数:
编辑 /etc/sysctl.conf,在文件末尾添加:
net.ipv4.conf.eno1111.arp_ignore = 1
net.ipv4.conf.eno1111.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
执行 sysctl -p 使配置立即生效。
-
安装Web服务并测试:
yum install httpd -y
systemctl start httpd
systemctl enable httpd
# 设置一个简单的页面用于区分服务器
echo “192.168.0.1” > /var/www/html/index.html
# 放行防火墙(注意原文命令有拼写错误,此处保持原样)
firwall-cmd --permanent --add-port=80/tcp
firwall-cmd --reload
# 重启网络服务使虚拟网卡生效
systemctl restart network
Web2 服务器配置 (IP: 192.168.0.2)
配置步骤与Web1类似,注意修改对应的设备名和IP地址。
-
真实网卡 (eno2222) 配置:
BOOTPROTO=static
DEVICE=eno2222
ONBOOT=yes
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
-
虚拟IP网卡 (lo:0) 配置同Web1。
-
ARP抑制参数 (修改网卡名为 eno2222):
在 /etc/sysctl.conf 中添加:
net.ipv4.conf.eno2222.arp_ignore = 1
net.ipv4.conf.eno2222.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
执行 sysctl -p。
-
安装Web服务并测试:
yum install httpd -y
systemctl start httpd
systemctl enable httpd
echo “192.168.0.2” > /var/www/html/index.html
firwall-cmd --permanent --add-port=80/tcp
firwall-cmd --reload
systemctl restart network
LVS主调度器配置 (lvs1, Master)
主调度器负责承载VIP并进行流量分发,同时与备用机通过VRRP协议进行心跳检测。
-
配置真实网络 (eno33554960):
TYPE=Ethernet
BOOTPROTO=static
DEVICE=eno33554960
ONBOOT=yes
IPADDR=192.168.0.200
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
执行 systemctl restart network。
-
安装必要软件并加载内核模块:
yum -y install keepalived ipvsadm
modprobe ip_vs
-
配置Keepalived (主节点):
编辑 /etc/keepalived/keepalived.conf,这是整个高可用集群的核心。
! Configuration File for keepalived
global_defs {
notification_email {
test@qq.com
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id lvs_1 # 标识本机,备机需不同
}
vrrp_instance LVS_HA {
state MASTER # 主节点
interface eno4444 # 承载VRRP协议和VIP的网卡
virtual_router_id 60 # 虚拟路由ID,主备必须相同
priority 100 # 优先级,主高于备
advert_int 1 # 心跳间隔
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.253/24 # 声明的虚拟IP
}
}
virtual_server 192.168.0.253 80 {
delay_loop 6
lb_algo rr # 轮询调度算法
lb_kind DR # 直接路由模式
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.0.1 80 {
weight 1
TCP_CHECK {
connect_timeout 20
connect_port 80
nb_get_retry 3
}
}
real_server 192.168.0.2 80 {
weight 1
TCP_CHECK {
connect_timeout 20
connect_port 80
nb_get_retry 3
}
}
}
注意:配置中 real_sever 应为 real_server,但为保持与原文一致,此处不做修改。实际使用时请注意。
-
启动服务并验证:
systemctl start keepalived
systemctl enable keepalived
# 查看VIP是否正确绑定
ip addr show
# 查看LVS规则表
ipvsadm -Ln
# 简化防火墙配置(测试环境)
firewall-cmd --set-default-zone=trusted
LVS备调度器配置 (lvs2, Backup)
备机配置与主机高度相似,主要区别在于 state、router_id 和 priority。
-
配置真实网络 (eno55555):
TYPE=Ethernet
BOOTPROTO=static
DEVICE=eno55555
ONBOOT=yes
IPADDR=192.168.0.201
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
执行 systemctl restart network。
-
安装软件:yum -y install keepalived ipvsadm
-
配置Keepalived (备节点):
编辑 /etc/keepalived/keepalived.conf,注意以下几处关键修改:
! Configuration File for keepalived
global_defs {
...
router_id lvs_2 # 修改为lvs_2
}
vrrp_instance LVS_HA {
state BACKUP # 状态改为BACKUP
interface eno6666 # 根据实际网卡名修改
virtual_router_id 60 # 与主节点保持一致
priority 50 # 优先级低于主节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.253/24
}
}
# virtual_server 部分与主节点完全相同
...
-
启动服务:
systemctl start keepalived
systemctl enable keepalived
ip addr show
ipvsadm -Ln
firewall-cmd --set-default-zone=trusted
路由器配置 (Linux模拟)
在本实验环境中,我们使用一台Linux服务器模拟路由器,实现公网IP到内网VIP的NAT转换和路由转发。
-
配置内外网卡:
- 内网卡 (
eno7777):
TYPE=Ethernet
BOOTPROTO=static
DEVICE=eno7777
ONBOOT=yes
IPADDR=192.168.0.254
NETMASK=255.255.255.0
DNS=202.96.134.133
- 外网卡 (
eno8888):
TYPE=Ethernet
BOOTPROTO=static
DEVICE=eno8888
ONBOOT=yes
IPADDR=124.126.147.168
NETMASK=255.0.0.0
DNS=202.96.134.133
执行 systemctl restart network。
-
配置IPTables NAT规则:
清空现有规则后,添加端口映射和SNAT规则。
iptables -F
iptables -X
iptables -t nat -X
iptables -t nat -F
# 将公网80端口流量DNAT至内网VIP
iptables -t nat -I PREROUTING -d 124.126.147.168 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.0.253:80
# 将内网网段回包进行SNAT,伪装成路由器公网IP
iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -p tcp -j SNAT \
--to-source 124.126.147.168
熟悉网络与防火墙配置是运维工程师的基础技能。
-
开启Linux内核路由转发:
编辑 /etc/sysctl.conf,确保包含:
net.ipv4.ip_forward = 1
执行 sysctl -p 生效。
测试与验证
完成所有配置后,即可进行测试:
- 从外网访问
http://124.126.147.168,应能轮流看到“192.168.0.1”和“192.168.0.2”的页面,说明负载均衡生效。
- 手动停止主LVS (
lvs1) 上的 keepalived 服务 (systemctl stop keepalived),VIP应能自动漂移到备机 lvs2,且服务访问不受影响,证明高可用机制成功。
- 使用
ipvsadm -Ln 在活跃的调度器上查看连接分发状态。
通过以上步骤,我们完成了一套经典的LVS+Keepalived高可用负载均衡环境搭建。尽管现代云原生环境中有更多选择,但理解这种基于传统Linux系统服务的架构原理,对于深入掌握系统运维与网络知识依然具有重要价值。在实际生产环境中,请根据您的网络拓扑和安全策略调整防火墙、路由等配置。
|