从零开始搭建 LVS 高性能集群 (DR模式)
架构
本设计方案采用三台服务器构建集群,使用Linux Virtual Server
(LVS) 作为负载均衡器,运行在直接路由 (DR)
模式下。集群中的每一台服务器都将运行相同的服务,以实现 高可用性 和 可扩展性 。LVS
将作为前端节点,接收所有进入的请求,并将它们分发到后端服务器。
流程
配置三台服务器,安装必要的操作系统和软件。
- 关闭防火墙:
systemctl disable firewalld
- 系统支持
lvs
- 安装
ipvsadm
- 在一台服务器上安装并配置
LVS
,设置为直接路由模式。 - 在另外两台服务器上部署相同的应用服务。
- 配置
LVS
规则,将流量分发到后端服务器。 - 使用
ApacheBench (ab)
作为压测工具,对集群进行性能测试。
各服务功能
LVS
节点:作为集群的前端负载均衡器,负责接收客户端请求并分发到后端服务器。- 后端服务器:运行应用服务,处理来自
LVS
的请求。 ab
工具:用于生成高并发请求,测试集群的性能。
部署
在三台服务器上安装 Linux 操作系统,并确保网络配置正确。
- 在
LVS
节点上安装LVS
软件包。 - 在后端服务器上部署应用服务,并确保服务可以正常运行。
- 配置
LVS
规则,包括虚拟IP
地址、后端服务器的IP地址和端口等。 - 配置网络,确保
LVS
节点和后端服务器之间可以正常通信。 - 使用 ab 工具在客户端机器上对集群进行压力测试。
文件目录
bash
.
├── director-dr.sh
├── director-nat.sh
├── director-tunl.sh
├── README.en.md
├── README.md
└── realsever-dr.sh
Director
节点上运行director-dr.sh
bash
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.152.131
rs1=192.168.152.129
rs2=192.168.152.133
ifconfig ens33:0 down
ifconfig ens33:0 $vip broadcast $vip netmask 255.255.255.0 up
route add -host $vip dev ens33:0
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -w 1 -g
$ipv -a -t $vip:80 -r $rs2:80 -w 1 -g
查看部署结果
bash
# vip ens33:0 是否成功创建成功
[root@localhost lvs]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:02:6a:99 brd ff:ff:ff:ff:ff:ff
inet 192.168.152.128/24 brd 192.168.152.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.152.131/24 brd 192.168.152.131 scope global secondary ens33:0 # vip 创建成功
valid_lft forever preferred_lft forever
inet6 fe80::c4cc:bc59:19a3:dc4c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
# 查看是否创建 lvs: dr 模式成功
[root@localhost lvs]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 rr
-> 192.168.152.129:80 Route 1 0 0
-> 192.168.152.133:80 Route 1 0 0
RealServer
上分别运行 realserver.sh
bash
#!/bin/bash
vip=192.168.152.131
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
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
查看部署结果
bash
[root@master lvs]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.152.131/32 brd 192.168.152.131 scope global lo:0 # vip 部署 lo:0 成功
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
# docker创建nginx nginx:1.23.0-alpine 自带netstat 容器统计 负载数
[root@master lvs]# docker run --name nginx -d -p 80:80 nginx:1.23.0-alpine
压测
使用 Jemter
或 ab
进行压力测试。
1. 监听Drector lvs负载
bash
# 在 director 上执行
[root@localhost lvs]# watch ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 rr
-> 192.168.152.129:80 Route 1 0 0
-> 192.168.152.133:80 Route 1 0 0
2. ab模拟负载进行连接
bash
# 非 lvs 集群的主机进行执行ab -n 50000 请求数 -c 20000 并发
ab -n 50000 -c 20000 http://192.168.152.131/
3. 统计RealServer负载
bash
# rs1 统计nginx的负载数
[root@master lvs]# docker exec -it openui-nginx netstat -nat|grep :80|wc -l
2
bash
# rs2 统计nginx的负载数
[root@master lvs]# docker exec -it openui-nginx netstat -nat|grep :80|wc -l
2
压测结果
bash
# Director
Every 2.0s: ipvsadm -Ln Fri Aug 16 02:06:02 2024
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.152.131:80 rr
-> 192.168.152.129:80 Route 1 10001 25000
-> 192.168.152.133:80 Route 1 9999 24992
# RS 1
[root@master lvs]# docker exec -it openui-nginx netstat -nat|grep :80|wc -l
25002
# RS 2
[root@master lvs]# docker exec -it openui-nginx netstat -nat|grep :80|wc -l
25002
优劣势
优势:
- 高可用性 :通过
LVS
实现的负载均衡可以提高系统的可用性。 - 可扩展性:可以轻松添加更多的后端服务器来扩展集群。
- 性能 :
LVS
的DR
模式提供了高性能的负载均衡能力。 - 成本效益:使用开源软件,减少了成本。
劣势:
- 复杂性 :配置
LVS
和后端服务器可能相对复杂。 - 单点故障 :
LVS
节点作为单点,如果出现故障,可能会影响整个集群。 - 资源消耗 :
LVS
节点需要足够的资源来处理负载均衡任务。 - 性能测试 :使用
ab
工具可以模拟大量并发请求,帮助评估集群的性能。
监控和日志:集成监控系统来监控集群状态,并记录日志以便于问题排查。
通过综合考虑这些因素,可以设计并实现一个高效、可靠且易于维护的基于 LVS
的集群系统。通过使用 DR
模式,我们能够实现高性能的负载均衡,同时通过 ab
工具进行性能测试,确保系统满足预期的性能要求。
ISSUE
-
Director 节点端口连接数不足
永久修改端口范围
net.ipv4.ip_local_port_range = 1024 65535
-
windows 执行ab,报错: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
修改windows 端口范围
bash
netsh int ipv4 set dynamicport tcp start=5001 num=60535
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "TcpTimedWaitDelay" /t REG_DWORD /d 30 /f
项目地址
参考博客
Jmeter性能测试
linux如何查看系统端口范围
Linux添加虚拟网卡的多种方法
LVS原理详解以及部署
就是要你懂负载均衡--lvs和转发模式
connect failed error 10055 由于系统缓冲区空间不足