当前位置: 首页 > news >正文

从零开始搭建 LVS 高性能集群 (DR模式)

从零开始搭建 LVS 高性能集群 (DR模式)

架构

lvs-dr

本设计方案采用三台服务器构建集群,使用Linux Virtual Server (LVS) 作为负载均衡器,运行在直接路由 (DR) 模式下。集群中的每一台服务器都将运行相同的服务,以实现 高可用性可扩展性LVS 将作为前端节点,接收所有进入的请求,并将它们分发到后端服务器。

流程

配置三台服务器,安装必要的操作系统和软件。

  • 关闭防火墙: systemctl disable firewalld
  • 系统支持 lvs
  • 安装 ipvsadm
  1. 在一台服务器上安装并配置 LVS,设置为直接路由模式。
  2. 在另外两台服务器上部署相同的应用服务。
  3. 配置 LVS 规则,将流量分发到后端服务器。
  4. 使用 ApacheBench (ab) 作为压测工具,对集群进行性能测试。

各服务功能

  • LVS 节点:作为集群的前端负载均衡器,负责接收客户端请求并分发到后端服务器。
  • 后端服务器:运行应用服务,处理来自 LVS 的请求。
  • ab 工具:用于生成高并发请求,测试集群的性能。

部署

在三台服务器上安装 Linux 操作系统,并确保网络配置正确。

  1. LVS 节点上安装 LVS 软件包。
  2. 在后端服务器上部署应用服务,并确保服务可以正常运行。
  3. 配置 LVS 规则,包括 虚拟IP 地址、后端服务器的IP地址和端口等。
  4. 配置网络,确保 LVS 节点和后端服务器之间可以正常通信。
  5. 使用 ab 工具在客户端机器上对集群进行压力测试。

文件目录

.
├── director-dr.sh
├── director-nat.sh
├── director-tunl.sh
├── README.en.md
├── README.md
└── realsever-dr.sh

Director 节点上运行director-dr.sh

#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forwardipv=/sbin/ipvsadmvip=192.168.152.131rs1=192.168.152.129
rs2=192.168.152.133ifconfig 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

查看部署结果

# 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 1000link/ether 00:0c:29:02:6a:99 brd ff:ff:ff:ff:ff:ffinet 192.168.152.128/24 brd 192.168.152.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.152.131/24 brd 192.168.152.131 scope global secondary ens33:0 # vip 创建成功valid_lft forever preferred_lft foreverinet6 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

#!/bin/bash
vip=192.168.152.131ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0echo "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

查看部署结果

[root@master lvs]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.152.131/32 brd 192.168.152.131 scope global lo:0 # vip 部署 lo:0 成功valid_lft forever preferred_lft foreverinet6 ::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

压测

使用 Jemterab 进行压力测试。

1. 监听Drector lvs负载

# 在 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模拟负载进行连接

# 非 lvs 集群的主机进行执行ab -n 50000 请求数 -c 20000 并发
ab -n 50000 -c 20000 http://192.168.152.131/

3. 统计RealServer负载

# rs1 统计nginx的负载数
[root@master lvs]# docker exec -it openui-nginx netstat -nat|grep :80|wc -l
2
# rs2 统计nginx的负载数
[root@master lvs]# docker exec -it openui-nginx netstat -nat|grep :80|wc -l
2

压测结果

# Director
Every 2.0s: ipvsadm -Ln                                                                                                                                         Fri Aug 16 02:06:02 2024IP 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 实现的负载均衡可以提高系统的可用性。
  • 可扩展性:可以轻松添加更多的后端服务器来扩展集群。
  • 性能LVSDR 模式提供了高性能的负载均衡能力。
  • 成本效益:使用开源软件,减少了成本。

劣势:

  • 复杂性:配置 LVS 和后端服务器可能相对复杂。
  • 单点故障LVS 节点作为单点,如果出现故障,可能会影响整个集群。
  • 资源消耗LVS 节点需要足够的资源来处理负载均衡任务。
  • 性能测试:使用 ab 工具可以模拟大量并发请求,帮助评估集群的性能。

监控和日志:集成监控系统来监控集群状态,并记录日志以便于问题排查。

通过综合考虑这些因素,可以设计并实现一个高效、可靠且易于维护的基于 LVS 的集群系统。通过使用 DR 模式,我们能够实现高性能的负载均衡,同时通过 ab 工具进行性能测试,确保系统满足预期的性能要求。

ISSUE

  1. Director 节点端口连接数不足
    永久修改端口范围 net.ipv4.ip_local_port_range = 1024 65535

  2. windows 执行ab,报错: 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作
    修改windows 端口范围

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

项目地址

gitee

参考博客

Jmeter性能测试
linux如何查看系统端口范围
Linux添加虚拟网卡的多种方法
LVS原理详解以及部署
就是要你懂负载均衡–lvs和转发模式
connect failed error 10055 由于系统缓冲区空间不足

http://www.lryc.cn/news/426102.html

相关文章:

  • Linux环境开发工具【yum与vim】
  • laravel GuzzleHttp Client 无法获取返回的错误信息
  • XMOS 多路音频解码器
  • XSS小游戏(题目+解析)
  • 《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?
  • NextJs - 服务端/客户端组件之架构多样性设计
  • 使用 Python 进行 PDF 文件加密
  • Spring Boot集成RabbitMQ
  • OLED屏幕制造工艺流程
  • knowLedge-VueCLI项目中环境变量的定义与使用
  • 【C#】 接口 继承
  • Self-Supervised Learning(李宏毅老师系列)
  • 8月16日笔记
  • 苹果Mac电脑——装macOS和Windows双系统的方法
  • 【C++ 面试 - 基础题】每日 3 题(十五)
  • 数学建模学习笔记
  • 个人可识别信息(PII) AI 去除 API 数据接口
  • 【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD
  • maven介绍与安装
  • 瑞友科技项目经理认证负责人杨文娟受邀为第四届中国项目经理大会演讲嘉宾︱PMO评论
  • Ubuntu基础使用
  • 知识图谱结构的提示
  • (计算机网络)网络层
  • [upload]-[GXYCTF2019]BabyUpload1-笔记
  • 2023卫星视频综述论文Recent Advances in Intelligent Processing of Satellite Video
  • Mysql的Binlog的数据样例
  • 基于VS2022+Qt5+C++的串口助手开发
  • Mysql之视图
  • 【开端】Java 分页工具类运用
  • leetcode每日一题48