从零开始搭建 LVS 高性能集群 (DR模式)
从零开始搭建 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 工具在客户端机器上对集群进行压力测试。
文件目录
.
├── 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
压测
使用 Jemter 或 ab 进行压力测试。
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实现的负载均衡可以提高系统的可用性。
- 可扩展性:可以轻松添加更多的后端服务器来扩展集群。
- 性能:LVS的DR模式提供了高性能的负载均衡能力。
- 成本效益:使用开源软件,减少了成本。
劣势:
- 复杂性:配置 LVS和后端服务器可能相对复杂。
- 单点故障:LVS节点作为单点,如果出现故障,可能会影响整个集群。
- 资源消耗:LVS节点需要足够的资源来处理负载均衡任务。
- 性能测试:使用 ab工具可以模拟大量并发请求,帮助评估集群的性能。
监控和日志:集成监控系统来监控集群状态,并记录日志以便于问题排查。
通过综合考虑这些因素,可以设计并实现一个高效、可靠且易于维护的基于 LVS 的集群系统。通过使用 DR 模式,我们能够实现高性能的负载均衡,同时通过 ab 工具进行性能测试,确保系统满足预期的性能要求。
ISSUE
-  Director 节点端口连接数不足 
 永久修改端口范围net.ipv4.ip_local_port_range = 1024 65535
-  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 由于系统缓冲区空间不足
相关文章:
 
从零开始搭建 LVS 高性能集群 (DR模式)
从零开始搭建 LVS 高性能集群 (DR模式) 架构 本设计方案采用三台服务器构建集群,使用Linux Virtual Server (LVS) 作为负载均衡器,运行在直接路由 (DR) 模式下。集群中的每一台服务器都将运行相同的服务,以实现 高可用…...
 
Linux环境开发工具【yum与vim】
🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.Linux软件包管理器yum1.1 快速使用yum 2. Linux编辑器-vim的使用2.1 vim的基本…...
laravel GuzzleHttp Client 无法获取返回的错误信息
Client发送一些请求,当返回状态不是200的时候,无法获取完整错误信息 $client new Client([base_uri > $this->getUri()./order/aaaaaa,timeout > 30,verify > false]);try {$response $client->request(POST, , [headers > [Lang&g…...
XMOS 多路音频解码器
当谈及高性能音频解码器,XMOS 是一个不容忽视的名字。作为音频解决方案领域的领军者,XMOS 的多路音频解码器在音频处理技术中扮演着至关重要的角色。下面我们一起深入探讨 XMOS 多路音频解码器去了解这一技术的魅力。 设计背景:追求音频极致…...
 
XSS小游戏(题目+解析)
xss题目练习地址: xss小游戏 游戏界面 一、Ma Spaghet! 我将题目要求进行翻译: 题目的主要要求就是:弹出一个(1337)的弹窗 开始解题: Let’s Go! 首先,传个参数看看 发现参数直接显示在了 < h2 >…...
 
《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?
文章目录 AOF 日志是如何实现的?三种写回策略 日志文件太大了怎么办?AOF 重写会阻塞吗?小结 大家好,我是大白。 如果有人问你:“你会把 Redis 用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使…...
 
NextJs - 服务端/客户端组件之架构多样性设计
NextJs - 服务端/客户端组件之架构多样性设计 前言一. 架构设计1.1 SSR流式渲染常见错误设计之 - 根页面同步阻塞1.2 架构设计之 - 客户端组件依赖于服务端组件数据① 使用 Redux 完成数据共享 1.3 架构设计之 - 单页内的分步骤跳转① 如何做到服务端组件和客户端组件之间的切换…...
使用 Python 进行 PDF 文件加密
使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数,该函数接受三个参数:输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…...
 
Spring Boot集成RabbitMQ
目录 1.RabbitMQ简介2.添加依赖3.配置RabbitMQ连接4.DirectExchange4.1 消费者4.2 生产者4.3 测试4.4 一个交换机对多个队列4.5 一个队列对多个消费者 5.FanoutExchange5.1 消费者5.2 生产者5.3 测试 6.TopicExchange6.1 消费者6.2 生产者 1.RabbitMQ简介 RabbitMQ是一个由Erl…...
 
OLED屏幕制造工艺流程
OLED屏幕制造工艺流程是一个复杂且精细的过程,涉及多个关键步骤以确保最终的显示效果和性能。以下是OLED屏幕制造工艺流程的主要步骤: 1. 衬底制作与准备 材料选择:OLED器件需要一个透明的导电衬底,通常使用玻璃或塑料材料。 清…...
knowLedge-VueCLI项目中环境变量的定义与使用
1. env 1.1简介 在 Vue CLI 创建的项目中,你可以通过 .env 文件来定义环境变量。Vue CLI 支持多种 .env 文件,它们根据文件名中的前缀来决定何时加载和使用这些环境变量。 以下是一些常见的 .env 文件及其用途: .env:在任何环境…...
 
【C#】 接口 继承
简介 继承是面向对象编程的核心特性之一,它允许我们创建一个类(称为子类)来继承另一个类(称为基类)的属性和方法。 作用 这样,我们可以重用代码,减少重复,并使我们的代码更加模块…...
 
Self-Supervised Learning(李宏毅老师系列)
自学参考: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding BERT 论文逐段精读 视频课 课件资料 笔记 一、概述 自监督学习模型与芝麻街~ 参数量 ELMO:94MBERT:340MGPT-2:1542MMegatron&…...
 
8月16日笔记
只有DNS协议出网场景 DNS 协议是一种请求、应答协议,也是一种可用于应用层的隧道技术。DNS 隧道的工作原理很简单,在进行 DNS 查询时,如果查询的域名不在 DNS 服务器本机缓存中,就会访问互联网进行查询,然后返回结果。…...
苹果Mac电脑——装macOS和Windows双系统的方法
一、实验环境 在Windows系统电脑上制作MacOS启动U盘。准备一个大于16G的U盘。 二、实验步骤 2.1 在Windows系统电脑上制作MacOS启动U盘 MacOS镜像下载 在Windows系统电脑上制作MacOS启动U盘的方法 2.2 U盘插上苹果电脑,安装macOS系统 U盘插上苹果电脑…...
 
【C++ 面试 - 基础题】每日 3 题(十五)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
 
数学建模学习笔记
数学建模学习笔记 现学现卖,随缘更新QwQ 主要根据b站大师兄的视频整理而成,有不懂的可以去看原视频 List 数学建模学习笔记一、 层次分析法1.1 矩阵的一致性及其检验1.2 权重计算1.3 具体流程 二、模糊综合评测2.1 隶属函数2.2 隶属函数的确定方法2.3 模…...
 
个人可识别信息(PII) AI 去除 API 数据接口
个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息(PII) 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 /…...
【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD
欢迎来到"花花 Show Python",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。 自我介绍: 我热衷于将复杂的技术概念以简单易懂…...
 
maven介绍与安装
一. maven概述 1. 关于项目依赖的jar包管理 问题描述: 直接在每个项目的lib文件夹中复制jar包会导致多个问题,包括jar包的重复存放、版本冲突以及手动管理带来的不便和错误。 问题分析: 重复存放:每个项目都保存一份相同的jar…...
 
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
 
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
 
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
 
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
 
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
 
C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
 
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
 
【多线程初阶】单例模式 指令重排序问题
文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...
