一.项目背景:

单台Nginx存在单点故障风险,并且无法应对高并发场景

这个项目设计了一套四+七层混合负载均衡架构:

                四层(LVS):抗住高并发,分发流量给多态Nginx

                七层(Nginx):做反向代理路由转发和负载均衡

                高可用(keepalived):LVS主备切换,保证服务不会被中断

二.架构图

三、环境准备

IP 角色
10.0.0.12LVS主节点+Nginx
10.0.0.13LVS备节点+Nginx
10.0.0.16Nginx+后端服务器集群
VIP10.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       提升
QPS7551088+44%
平均响应时间13.2ms9.32ms-30%
总耗时1.324秒0.919秒-31%

中度压力测试

重度压力测试

测测极限

50万个请求没有失败,并且QPS稳定在1513,说明系统长时间高负载下非常稳定

并发数100

平均响应时长66ms

更多推荐