1. 高可用集群架构设计解析
这个LVS+Keepalived+DNS+Web+NFS的高可用集群方案,本质上是一个面向生产环境的全栈式负载均衡解决方案。我在金融行业和电商平台的多个项目中实际部署过类似架构,它能有效解决单点故障问题,保证关键业务7x24小时不间断运行。
这套架构的核心思想是分层冗余:
- 前端:LVS+Keepalived实现四层负载均衡
- 中间层:Web服务器集群处理业务逻辑
- 后端:NFS提供统一存储
- 基础设施:DNS实现智能解析
重要提示:生产环境部署前务必进行网络分区测试,我曾遇到过因交换机配置不当导致脑裂的情况。
1.1 各组件选型考量
LVS选用DR模式而非NAT模式的原因:
- 性能更高(直接路由不修改IP包)
- 节省公网IP资源
- 后端服务器可隐藏在内网
- 但需要配置ARP抑制(后面会详细说明)
Keepalived版本选择:
- 建议使用1.3.5以上版本
- 老版本存在VRRP协议栈溢出漏洞
- 新版本支持更精细的健康检查策略
NFS协议版本:
- v4.1及以上支持并行访问
- 建议禁用v2/v3协议(安全考虑)
- 需要配合nfs-utils和rpcbind使用
2. 基础环境准备
2.1 服务器规划
典型生产环境需要:
- 2台LVS服务器(主备)
- 至少3台Web服务器
- 2台NFS服务器(主备)
- 1台DNS服务器(可多实例)
硬件配置建议:
# LVS节点(最小配置) CPU: 4核+ 内存: 8GB+ 网卡: 千兆双网卡(建议绑定bonding) # Web节点 CPU: 8核+ 内存: 16GB+ 磁盘: 100GB+(系统盘) # NFS节点 CPU: 4核+ 内存: 16GB+ 磁盘: 根据业务需求,建议RAID102.2 网络拓扑设计
关键网络配置要点:
- VIP(虚拟IP)需要单独规划
- 各节点间需要心跳线(直连或VLAN)
- Web节点需要配置lo:0接口
- 防火墙需放行以下端口:
- VRRP协议(112)
- HTTP/HTTPS(80/443)
- NFS(2049/tcp+udp)
- DNS(53/tcp+udp)
3. LVS+Keepalived部署实战
3.1 LVS核心配置
安装必要组件:
yum install ipvsadm keepalived -y # CentOS apt-get install ipvsadm keepalived # UbuntuDR模式关键配置:
# 在每台Web服务器上执行 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 # 添加VIP到lo:0 ifconfig lo:0 <VIP> netmask 255.255.255.255 up3.2 Keepalived配置详解
主节点配置示例(/etc/keepalived/keepalived.conf):
global_defs { router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { <VIP>/24 dev eth0 } } virtual_server <VIP> 80 { delay_loop 6 lb_algo wrr lb_kind DR persistence_timeout 50 protocol TCP real_server <Web1_IP> 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } # 更多real_server配置... }避坑指南:virtual_router_id必须相同,但不同集群间要区分开,否则会导致VRRP报文冲突。
4. Web集群与NFS集成
4.1 Web服务器标准化部署
建议使用自动化工具统一配置:
# 使用Ansible示例playbook - hosts: webservers tasks: - name: Install httpd yum: name=httpd state=latest - name: Configure virtual host template: src: templates/vhost.conf.j2 dest: /etc/httpd/conf.d/vhost.conf - name: Mount NFS share mount: path: /var/www/html src: <NFS_IP>:/webdata fstype: nfs opts: rw,hard,intr,noatime state: mounted4.2 NFS服务器高可用配置
NFS服务端配置(/etc/exports):
/webdata <Web1_IP>(rw,sync,no_root_squash) <Web2_IP>(rw,sync,no_root_squash)使用rsync+inotify实现NFS主备同步:
# 主NFS服务器上 inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' \ -e modify,delete,create,attrib /webdata | while read date time file do rsync -az --delete /webdata/ <Backup_NFS_IP>:/webdata/ done5. DNS智能解析配置
5.1 Bind9视图配置
根据客户端IP返回不同解析结果:
view "internal" { match-clients { 10.0.0.0/8; 192.168.0.0/16; }; zone "example.com" { type master; file "/etc/bind/internal/example.com.zone"; }; }; view "external" { match-clients { any; }; zone "example.com" { type master; file "/etc/bind/external/example.com.zone"; }; };5.2 健康检查集成
使用DNS轮询+健康检查脚本:
#!/bin/bash VIP=<VIP> if curl -s --connect-timeout 3 http://$VIP/healthcheck >/dev/null; then # 更新zone文件 sed -i "s/^www.*/www 60 IN A $VIP/" /etc/bind/zones/example.com.zone rndc reload example.com fi6. 全链路测试与监控
6.1 故障转移测试方案
模拟LVS主节点宕机:
systemctl stop keepalived观察备节点是否在3秒内接管VIP(可通过tcpdump抓VRRP包验证)
模拟Web节点故障:
iptables -A INPUT -p tcp --dport 80 -j DROP检查LVS是否自动剔除故障节点(ipvsadm -Ln查看)
6.2 监控指标配置
Prometheus关键监控项:
- job_name: 'lvs' static_configs: - targets: ['<LVS1_IP>:9100', '<LVS2_IP>:9100'] - job_name: 'web' static_configs: - targets: ['<Web1_IP>:9117', '<Web2_IP>:9117'] - job_name: 'nfs' static_configs: - targets: ['<NFS1_IP>:9100', '<NFS2_IP>:9100']Grafana监控看板应包含:
- LVS连接数/吞吐量
- Web节点响应时间
- NFS IO延迟
- DNS查询量
7. 生产环境优化经验
7.1 性能调优参数
内核参数优化(/etc/sysctl.conf):
# LVS节点 net.ipv4.ip_forward = 1 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # Web节点 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 vm.swappiness = 107.2 安全加固措施
LVS节点:
iptables -A INPUT -p vrrp -j ACCEPT iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j DROPNFS访问控制:
# /etc/hosts.allow portmap: <Web1_IP>, <Web2_IP> lockd: <Web1_IP>, <Web2_IP> rquotad: <Web1_IP>, <Web2_IP> mountd: <Web1_IP>, <Web2_IP>Keepalived安全:
vrrp_script chk_nginx { script "killall -0 nginx" interval 2 weight -5 fall 2 rise 1 }
这套架构在笔者参与的大型电商平台中,成功支撑了单日3000万PV的流量,故障转移时间控制在5秒内。关键是要做好容量规划和定期演练,建议每季度进行一次全链路故障演练。