LVS+Keepalived+Nginx+Docker:从零搭建高可用负载均衡集群
一.项目背景:
单台Nginx存在单点故障风险,并且无法应对高并发场景
这个项目设计了一套四+七层混合负载均衡架构:
四层(LVS):抗住高并发,分发流量给多态Nginx
七层(Nginx):做反向代理路由转发和负载均衡
高可用(keepalived):LVS主备切换,保证服务不会被中断
二.架构图

三、环境准备
| IP | 角色 | |
| 10.0.0.12 | LVS主节点+Nginx | |
| 10.0.0.13 | LVS备节点+Nginx | |
| 10.0.0.16 | Nginx+后端服务器集群 | |
| VIP | 10.0.0.100 |
在每个虚拟机上都要安装docker
在10.0.0.12和10.0.0.13上面安装keepalived
编写keepalived配置
LVS主节点的配置

LVS备节点的配置

配置解读
高可用配置:
interface eth0 写自己的网卡
virtual_router_id 51 虚拟的路由器ID,主备两台主机的ID必须一致
virtual_ipaddress 指定虚拟IP
虚拟服务器配置
virtual_server 10.0.0.100 80 对VIP(10.0.0.100)的80端口做负载均衡
lb_algo rr 调度算法为 rr 也就是轮询,按照请求顺序分配给服务器
lb_kind DR 工作模式为DR,回复客户端的时候可以直接返回
后端真实服务器
10.0.0.12
10.0.0.13
10.0.0.16
部署后端服务
在10.0.0.16上运行三个后端容器
docker run -d --name nginx1 -p 8081:80 nginx docker run -d --name nginx2 -p 8082:80 nginx docker run -d --name nginx3 -p 8083:80 nginx
查看运行是否正常

修改默认界面,用来区分三个后端
docker exec nginx1 sh -c 'echo "Backend 1 from 10.0.0.16" > /usr/share/nginx/html/index.html' docker exec nginx2 sh -c 'echo "Backend 2 from 10.0.0.16" > /usr/share/nginx/html/index.html' docker exec nginx3 sh -c 'echo "Backend 3 from 10.0.0.16" > /usr/share/nginx/html/index.html'
分别查看是否成功

创建一个挂载目录文件用于写Nginx的负载均衡和反向代理配置,每台虚拟机都要一样

在10.0.0.12上写好之后通过scp传递给10.0.0.13和10.0.0.16

在每个虚拟器上面开启容器
docker run -d \ --name nginx-gateway \ --restart unless-stopped \ --network host \ -v /data/nginx/conf.d:/etc/nginx/conf.d \ nginx
在每台虚拟上检验



解读启动命令结构:
--restart unless-stopped 容器如果挂了就能自动拉起
--network host DR模式的关键 共享网络命名空间,然宿主机能认领VIP
-v /data/nginx/conf.d:/etc/nginx/conf.d 挂载宿主机目录,在宿主机修改配置文件,容器内的Nginx也会生效
配置ARP抑制
cat >> /etc/sysctl.conf << 'EOF'
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
EOF
# 生效
sysctl -p
# 绑定 VIP 到 loopback
ifconfig lo:0 10.0.0.100 netmask 255.255.255.255 up
为什么要ARP抑制:
如果不进行ARP抑制那么都有可能认为自己是VIP,这样就会产生错乱
抑制后
后端Nginx的lo:0上有VIP
但是因为arp_ignore=1 ,所以他不会相应谁是10.0.0.100的ARP请求
检测效果:
在任意虚拟机上执行
curl http://10.0.0.100

压力测试:
每秒处理1000个请求

由图可见系统疫苗处理了1088个HTTP请求
总耗时0.919秒,没有失败请求
测试单台Nginx

对比分析
| 指标 | 直连 | 通过LVS | 提升 |
| QPS | 755 | 1088 | +44% |
| 平均响应时间 | 13.2ms | 9.32ms | -30% |
| 总耗时 | 1.324秒 | 0.919秒 | -31% |
中度压力测试

重度压力测试

测测极限

50万个请求没有失败,并且QPS稳定在1513,说明系统长时间高负载下非常稳定
并发数100
平均响应时长66ms
更多推荐
所有评论(0)