十万QPS网关接入层:LVS+Keepalived(DR模式)架构
当业务量达到 10Wqps 时,单个 Nginx 已经很难稳定承接全部流量。接入层通常采用 LVS 作为前置四层负载均衡,Nginx 或其他网关作为后端 Real Server。这样既利用 LVS 的高吞吐能力,又保留 Nginx 对七层请求的处理能力。
接入层要同时解决三件事:负载均衡、故障隔离、失败切换。LVS 负责转发,ldirectord 或 Keepalived 负责健康检查和主备切换。
一、为什么需要 LVS
LVS 工作在内核态四层,请求只经过转发,不需要完整解析应用层协议,因此吞吐远高于 Nginx。Nginx 集群规模变大后,不能再让一个 Nginx 作为所有 Nginx 的前置调度器,否则它自己会成为瓶颈。
LVS 的三种工作模式:
| 模式 | 特点 | 适用场景 |
|---|---|---|
| NAT | 请求与响应都经过调度器 | 小规模、内外网隔离 |
| TUN | 隧道封装,响应不经过调度器 | 跨机房、节点要求网卡 |
| DR | 直接路由,修改 MAC 不修改 IP,响应直接回客户端 | 生产环境最常用 |
二、LVS DR 的数据流
DR 模式下,Director Server 与 Real Server 必须处于同一物理网络。请求报文由调度器改写 MAC 地址后转发给 Real Server,响应报文则直接从 Real Server 回到客户端。
这里会带来两个典型问题:
- Director 和 Real Server 同时配置 VIP,ARP 广播可能被多个节点响应;
- Real Server 使用 VIP 发出 ARP 请求时,路由器可能把 VIP 的 MAC 更新到 Real Server,导致后续请求绕过 Director。
解决办法是:
- 将 VIP 配置在
lo:0上,对外隐藏; - 设置
arp_ignore = 1; - 设置
arp_announce = 2。
net.ipv4.conf.all.arp_ignore=1net.ipv4.conf.all.arp_announce=2net.ipv4.conf.default.arp_ignore=1net.ipv4.conf.default.arp_announce=2net.ipv4.conf.lo.arp_ignore=1net.ipv4.conf.lo.arp_announce=2三、配置负载调度器
实验环境如下:
| 主机 | IP |
|---|---|
| Director Server | 192.168.61.44 |
| Web Server 1 | 192.168.61.22 |
| Web Server 2 | 192.168.61.33 |
| VIP | 192.168.61.45 |
Director 上的核心配置:
# 关闭防火墙systemctl stop firewalld.service setenforce0# 安装 ipvsadmyuminstallipvsadm.x86_64-y# 配置虚拟 IPcd/etc/sysconfig/network-scripts/cpifcfg-ens33 ifcfg-ens33:0vimifcfg-ens33:0# 删除 UUID、DNS 与网关,注意子网NAME=ens33:0DEVICE=ens33:0IPADDR=192.168.61.45NETMASK=255.255.255.255# 重启网络systemctl restart networkifupifcfg-ens33:0# 关闭重定向vi/etc/sysctl.conf net.ipv4.ip_forward=0net.ipv4.conf.all.send_redirects=0net.ipv4.conf.default.send_redirects=0net.ipv4.conf.ens33.send_redirects=0sysctl-pmodprobe ip_vs# 配置轮询调度ipvsadm-Cipvsadm-A-t192.168.61.45:80-srr ipvsadm-a-t192.168.61.45:80-r192.168.61.22:80-gipvsadm-a-t192.168.61.45:80-r192.168.61.33:80-gipvsadm-save>/etc/sysconfig/ipvsadm四、配置 Real Server
Real Server 上安装 Web 服务,并将 VIP 配置到回环接口:
# 关闭防火墙systemctl stop firewalld.service setenforce0# 安装并启动 httpdyuminstallhttpd-ysystemctl start httpd# 创建测试页面vim/var/www/html/index.html this is192.168.61.22# 配置回环 VIPcd/etc/sysconfig/network-scripts/cpifcfg-lo ifcfg-lo:0vimifcfg-lo:0DEVICE=lo:0IPADDR=192.168.61.45NETMASK=255.255.255.255NETWORK=127.0.0.0 systemctl restart network# 添加主机路由routeadd-host192.168.61.45 dev lo:0# 调整 ARP 行为vim/etc/sysctl.conf net.ipv4.conf.all.arp_ignore=1net.ipv4.conf.all.arp_announce=2net.ipv4.conf.default.arp_ignore=1net.ipv4.conf.default.arp_announce=2net.ipv4.conf.lo.arp_ignore=1net.ipv4.conf.lo.arp_announce=2sysctl-p第二台 Real Server 只改测试页内容和真实 IP 即可。
五、故障隔离:ldirectord
纯 LVS 不会主动探测 Real Server 是否存活。ldirectord 通过周期性请求检测节点状态,节点异常时从 IPVS 表中移除,恢复后重新加入。
checktimeout=20 checkinterval=10 fallback=127.0.0.1:80 autoreload=yes logfile="/var/log/ldirectord.log" quiescent=no virtual=192.168.60.200:80 real=192.168.60.132:80 gate real=192.168.60.144:80 gate fallback=127.0.0.1:80 gate service=http request="index.html" receive="Test Page" scheduler=rr protocol=tcp checktype=negotiate checkport=80 persistence=360 virtualhost=www.gaojf.comquiescent=no表示节点失效时直接删除;quiescent=yes则把权重设为 0,保留连接跟踪记录。
六、失败切换:Keepalived + LVS
Keepalived 通过 VRRP 在主备 Director 之间切换 VIP,同时可以直接管理 LVS 的节点健康检查。
Master 配置:
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 { 10.10.10.100 } } virtual_server 10.10.10.100 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 10.10.10.12 80 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 connect_port 80 } } }Backup 配置只需将state改为BACKUP,priority降低,router_id修改为不同名称。
七、总结
高可用接入层的核心不是某个单一软件,而是职责组合:LVS 负责高速四层转发,ARP 参数保证 DR 模式正确工作,ldirectord 或 Keepalived 负责节点健康检查,VRRP 负责 Director 主备切换。理解 DR 的 MAC 改写和 ARP 抑制,是排查这类架构问题的基础。