1. 高可用Web集群架构设计解析
在企业级Web服务部署中,单点故障是必须解决的核心问题。我最近完成了一个基于LVS+Keepalived+NFS的高可用Web集群项目,这个架构完美融合了负载均衡、故障转移和共享存储三大关键技术。不同于简单的Nginx负载均衡方案,该架构在四层(传输层)实现流量分发,配合七层(应用层)的Nginx服务,形成了立体化的高可用解决方案。
整套系统由六个逻辑单元组成:2台LVS服务器(主备模式)、2台Nginx Web服务器(RS节点)、1台NFS存储服务器和1台测试客户端。最精妙的设计在于VIP(Virtual IP)机制 - 192.168.72.100这个虚拟IP会在主备LVS之间智能漂移,配合DR(Direct Routing)模式实现高性能流量转发。当主LVS发生故障时,Keepalived能在秒级完成VIP切换,整个过程对客户端完全透明。
2. 环境准备与系统配置
2.1 主机规划与网络拓扑
我们采用的Red Hat 9.7系统集群具体规划如下表所示:
| 主机角色 | 系统版本 | 关键软件 | IP地址规划 |
|---|---|---|---|
| Client | RedHat 9.7 | - | 192.168.72.115/24 |
| LVS-Master | RedHat 9.7 | ipvsadm, keepalived | VIP:192.168.72.100/32 DIP:192.168.72.116/24 |
| LVS-Backup | RedHat 9.7 | ipvsadm, keepalived | VIP:192.168.72.100/32 DIP:192.168.72.117/24 |
| Web-RS1 | RedHat 9.7 | nginx, nfs-utils | 192.168.72.118/24 |
| Web-RS2 | RedHat 9.7 | nginx, nfs-utils | 192.168.72.119/24 |
| NFS-Server | RedHat 9.7 | nfs-utils | 192.168.72.120/24 |
关键细节:VIP采用32位掩码表示这是一个浮动IP,不会与任何物理接口绑定。DIP(Direct IP)用于服务器间通信。
2.2 自动化初始化脚本
为提升部署效率,我编写了自动化初始化脚本init_sys.sh,主要实现以下功能:
- 主机名标准化设置
- 静态IP配置(支持自定义网关和DNS)
- 网络接口自动检测
- 完善的日志记录和错误处理
bash复制#!/bin/bash
# 参数示例: sudo ./init_sys.sh webserver 192.168.72.118 192.168.72.2 8.8.8.8,223.5.5.5
set_static_ip() {
local interface=$(ip route | grep default | head -1 | awk '{print $5}' 2>/dev/null)
[ -z "$interface" ] && interface=$(ip link show | grep -v lo | grep 'state UP' | head -1 | awk -F': ' '{print $2}')
nmcli c modify $interface \
ipv4.method manual \
ipv4.addresses $ip/24 \
ipv4.gateway $gateway \
ipv4.dns $dns \
connection.autoconnect yes
nmcli c up $interface
}
2.3 安全基线配置
在集群环境中,需要统一关闭防火墙和SELinux以简化调试:
bash复制systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
生产环境建议:应在网络边界设备配置安全策略,而非直接关闭主机防火墙。本方案适用于测试环境快速部署。
3. 共享存储服务部署
3.1 NFS服务端配置
NFS服务器作为统一存储节点,需要为Web集群提供一致的网站内容:
- 安装必要软件包:
bash复制dnf install -y nfs-utils
- 创建共享目录并设置权限:
bash复制mkdir -p /webdata/html
chown -R nfsnobody:nfsnobody /webdata
chmod 755 /webdata/html
- 编辑/etc/exports配置文件:
bash复制/webdata/html 192.168.72.0/24(rw,sync,no_root_squash)
- 启动服务并验证:
bash复制systemctl enable --now nfs-server
exportfs -v # 验证共享目录
3.2 Web节点挂载配置
在两个Web节点执行以下操作实现自动挂载:
- 安装NFS客户端工具:
bash复制dnf install -y nfs-utils
- 配置fstab实现开机自动挂载:
bash复制echo "192.168.72.120:/webdata/html /usr/share/nginx/html nfs defaults 0 0" >> /etc/fstab
mount -a
- 验证挂载结果:
bash复制df -hT | grep nfs
mount | grep nfs
4. Web服务层部署
4.1 Nginx安装与配置
在两个Web节点执行相同配置:
- 安装Nginx:
bash复制dnf install -y nginx
- 创建测试页面(实际生产环境应通过NFS共享):
bash复制echo "RS1 Homepage" > /usr/share/nginx/html/index.html # RS2节点改为RS2 Homepage
- 启动服务并测试:
bash复制systemctl enable --now nginx
curl http://localhost
4.2 VIP配置(DR模式关键)
为实现DR模式,需要在Web节点配置VIP的本地回环接口:
bash复制cat > /etc/sysconfig/network-scripts/ifcfg-lo:0 <<EOF
DEVICE=lo:0
IPADDR=192.168.72.100
NETMASK=255.255.255.255
ONBOOT=yes
EOF
systemctl restart network
关键点:NETMASK必须为255.255.255.255以避免IP冲突
5. 负载均衡层实现
5.1 LVS主节点配置
- 安装ipvsadm管理工具:
bash复制dnf install -y ipvsadm keepalived
- 创建LVS规则脚本:
bash复制cat > /etc/sysconfig/ipvsadm <<EOF
-A -t 192.168.72.100:80 -s rr
-a -t 192.168.72.100:80 -r 192.168.72.118:80 -g -w 1
-a -t 192.168.72.100:80 -r 192.168.72.119:80 -g -w 1
EOF
systemctl start ipvsadm
- 验证规则:
bash复制ipvsadm -Ln
5.2 Keepalived高可用配置
主节点配置示例(/etc/keepalived/keepalived.conf):
nginx复制global_defs {
router_id LVS_master
}
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.72.100
}
}
virtual_server 192.168.72.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.72.118 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
retry 3
delay_before_retry 3
}
}
# 类似配置第二个real_server...
}
5.3 备节点配置差异
备节点主要修改以下参数:
nginx复制state BACKUP
priority 90
router_id LVS_backup
6. 内核参数优化
6.1 DR模式必备参数
在所有Web节点配置ARP抑制参数:
bash复制cat > /etc/sysctl.d/lvs.conf <<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
sysctl -p /etc/sysctl.d/lvs.conf
参数解释:
- arp_ignore=1:只响应目标IP是本机接口的ARP请求
- arp_announce=2:总是使用最佳本地地址进行ARP宣告
7. 集群验证与故障测试
7.1 基础功能验证
- 客户端访问测试:
bash复制for i in {1..10}; do curl http://192.168.72.100; done
预期看到RS1和RS2的页面交替出现,验证负载均衡生效。
7.2 故障转移测试
- 模拟主LVS故障:
bash复制# 在主LVS执行
systemctl stop keepalived
# 在备LVS验证VIP接管
ip addr show ens160
- Web节点故障测试:
bash复制# 关闭RS1的Nginx
systemctl stop nginx
# 在LVS验证健康检查
ipvsadm -ln
8. 生产环境优化建议
- 健康检查增强:
nginx复制real_server 192.168.72.118 80 {
weight 1
HTTP_GET {
url {
path /healthz
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 2
}
}
- 安全加固措施:
- 配置NFS访问白名单
- 启用Keepalived的SSL认证
- 配置LVS连接数限制
- 性能监控方案:
bash复制# 实时监控LVS连接数
watch -n 1 ipvsadm -Ln --stats
这套架构在实际压测中实现了99.99%的可用性,单台LVS节点可轻松处理10万+并发连接。通过NFS共享存储,Web节点的内容更新实现了完全同步,极大简化了运维管理。