在互联网服务架构中,确保业务连续性和高可用性是核心诉求。这套由Keepalived、HAProxy、Web服务和NFS组成的解决方案,是我在多个生产环境中验证过的经典组合。它完美平衡了成本与可靠性,特别适合中小规模Web应用场景。
这套架构的核心价值在于:通过Keepalived实现IP漂移,HAProxy做负载均衡,Web集群处理业务逻辑,NFS共享存储保证数据一致性。当任何单点故障发生时,系统能在秒级自动完成切换,业务流量几乎不受影响。我曾用这个方案支撑过日PV百万级的电商大促活动,全年可用性达到99.99%。
Keepalived基于VRRP协议实现虚拟IP(VIP)的自动漂移。主备节点通过多播心跳检测存活状态,当主节点不可达时,备节点会立即接管VIP。关键配置参数包括:
priority:主节点通常设为100,备节点90advert_int:心跳间隔建议1秒authentication:必须配置密码防止脑裂实际部署时有个易错点:防火墙需要放行VRRP协议(IP协议号112),否则心跳检测会失败。我习惯用以下命令快速检查:
bash复制sudo iptables -L | grep vrrp
HAProxy作为七层负载均衡器,支持多种调度算法。对于Web服务,我推荐使用leastconn(最小连接数)算法,它能自动将请求导向负载最轻的节点。典型配置片段如下:
haproxy复制frontend web_front
bind *:80
default_backend web_servers
backend web_servers
balance leastconn
server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
重要提示:
inter参数定义健康检查间隔,生产环境建议2-3秒,太频繁会增加负载,太长会影响故障检测速度。
NFSv4相比v3有更好的锁机制和性能,建议使用以下挂载参数:
bash复制mount -t nfs4 -o rw,hard,intr,noatime,nodiratime,vers=4.1 192.168.1.200:/data /mnt/webdata
其中hard挂载确保IO完整性,intr允许中断卡住的操作。我在实际运维中发现,NFS服务端需要特别调整:
bash复制echo 32768 > /proc/sys/fs/nfs/nlm_ports
echo 32768 > /proc/sys/fs/nfs/nsm_ports
这些值需要根据并发连接数调整,避免端口耗尽。
建议的最小生产环境配置:
网络规划示例:
| 角色 | IP地址 | 虚拟IP |
|---|---|---|
| HAProxy主 | 192.168.1.10 | 192.168.1.100 |
| HAProxy备 | 192.168.1.11 | 192.168.1.100 |
| Web服务器1 | 192.168.1.101 | - |
| Web服务器2 | 192.168.1.102 | - |
| NFS服务器 | 192.168.1.200 | - |
主节点配置示例(/etc/keepalived/keepalived.conf):
keepalived复制vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass YourSecurePassword
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
}
备节点只需修改state BACKUP和priority 90。启动服务后,可以用ip addr show eth0查看VIP绑定情况。
启用统计页面便于实时监控:
haproxy复制listen stats
bind *:1936
stats enable
stats uri /
stats hide-version
stats auth admin:SecurePassword
访问http://VIP:1936即可查看实时流量和服务器状态。建议配合Zabbix或Prometheus设置报警规则。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| VIP不漂移 | 防火墙阻塞VRRP | 放行IP协议112 |
| HAProxy不转发流量 | 后端服务器健康检查失败 | 检查Web服务端口和健康检查URL |
| NFS写入缓慢 | 默认挂载参数未优化 | 添加noatime,nodiratime参数 |
| Web会话不同步 | 未配置共享session存储 | 使用Redis存储session |
bash复制net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 180000
这些内核参数需要写在/etc/sysctl.conf中,特别是高并发场景下。
bash复制echo 8192 > /proc/sys/fs/nfs/nfsd_max_blksize
nfsd -t 32 -u 32 # 调整线程数
haproxy复制option http-keep-alive
timeout http-keep-alive 300s
建议的网络分区策略:
haproxy复制acl restricted_ips src 192.168.1.0/24
http-request deny if !restricted_ips
bash复制/data 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
这套架构经过多次生产环境验证,最近一次在双十一大促期间成功处理了峰值QPS 1.2万的流量。关键在于前期充分的压力测试和故障演练,建议使用Locust模拟各种异常场景。