nginx的四层负载均衡实战
目录
1 环境准备
1.1 mysql 部署
1.2 nginx 部署
1.3 关闭防火墙和selinux
2 nginx配置
2.1 修改nginx主配置文件
2.2 创建stream配置文件
2.3 重启nginx
3 测试四层代理是否轮循成功
3.1 远程链接通过代理服务器访问
3.2 动图演示
4 四层反向代理算法介绍
4.1 轮询(Round Robin)
4.2 最少连接(Least Connections)
4.3 加权轮询(Weighted Round Robin)
4.4 IP Hash
利用Nginx进行四层负载均衡:MySQL数据库的高效管理
在高流量的应用场景中,单个数据库服务器往往无法承受巨大的并发请求压力。为了提高性能和可靠性,企业级应用通常采用负载均衡技术来分散请求,确保数据服务的稳定性和快速响应。Nginx,作为一款高性能的HTTP和反向代理服务器,自1.9.0版本起,也提供了TCP/UDP四层负载均衡功能,能够有效地为后端服务如数据库提供负载均衡。
四层负载均衡简介
四层负载均衡(也称为L4负载均衡)是指在网络模型的第四层(传输层)上进行负载均衡。它主要基于IP地址和端口号来分发流量,适用于TCP和UDP协议。四层负载均衡对于数据库服务器尤其有用,因为它能够直接处理和转发数据流,而无需关心应用层的协议细节。
配置Nginx进行四层负载均衡
1 环境准备

客户端 :192.168.239.133
代理服务器:192.168.239.138
两台mysql服务器 : 192.168.239.131 192.168.239.174
1.1 mysql 部署
客户端和两台mysql服务器均需要部署,以下演示一台
mysql官网 : https://www.mysql.com



复制下载链接

# 下载yum仓库
[root@client ~]# wget https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm
# 使用yum安装mysql需要的包
[root@client ~]# yum install mysql-community-client mysql-community-server mysql-community-client-plugins mysql-community-common mysql-community-libs mysql-community-icu-data-files

# 启动mysql
[root@client ~]# systemctl start mysqld
# 查看端口是否监听
[root@client ~]# netstat -tunlpt | grep mysql
tcp6 0 0 :::33060 :::* LISTEN 34029/mysqld
tcp6 0 0 :::3306 :::* LISTEN 34029/mysqld # mysql会生成初始密码在/var/log/mysqld.log 里
[root@client ~]# grep password /var/log/mysqld.log
2024-07-13T02:33:42.553668Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: i)-#G;kk?7r&# 输入密码登录
[root@client ~]# mysql -uroot -p
Enter password:
登录后mysql操作
# 修改mysql的root密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Openlab123!';
Query OK, 0 rows affected (0.00 sec)mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed# 将只允许本地登录改为通配符也就是允许所有人登录
mysql> UPDATE user SET host='%' WHERE user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0# 刷新权限
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql> exit
1.2 nginx 部署
在此实验中只需要部署与配置代理服务器的的nginx
为节省时间 此处就不使用源码安装了,直接使用yum安装
[root@forward ~]# yum install nginx
注意这个stream模块是实现四层负载均衡的模块

在官方文档上也可以找到使用的其使用说明
Module ngx_stream_upstream_module (nginx.org)

1.3 关闭防火墙和selinux
所有机子均关闭
[root@forward ~]# systemctl stop firewalld.service
[root@forward ~]# setenforce 0
2 nginx配置
[root@forward ~]# mkdir /etc/nginx/tcp
2.1 修改nginx主配置文件
[root@forward ~]# vim /etc/nginx/nginx.conf
添加以下行将tcp以下.conf结尾的文件读取,在tcp文件夹里面写stream块的配置

2.2 创建stream配置文件
[root@forward ~]# vim /etc/nginx/tcp/test.confstream {upstream mysql {# 默认为轮循算法,假如不加weight的情况下,加上weight就变成加权轮循了server 192.168.239.131:3306 weight=5;server 192.168.239.174:3306 weight=10;}server {listen 3306;proxy_pass mysql;}}
2.3 重启nginx
# 语法检查
[root@forward ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful# 重启nginx
[root@forward ~]# systemctl restart nginx# 检查端口是否监听
[root@forward ~]# netstat -tunlpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2818/nginx: master
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2818/nginx: master
tcp6 0 0 :::80 :::* LISTEN 2818/nginx: master
3 测试四层代理是否轮循成功
3.1 远程链接通过代理服务器访问
[root@client ~]# mysql -uroot -pOpenlab123! -h192.168.239.138 -e 'select @@HOSTNAME'

3.2 动图演示

4 四层反向代理算法介绍
在四层(TCP/UDP)负载均衡中,Nginx 的 stream 模块可以用来配置不同的负载均衡算法。下面我将给出使用不同算法配置的示例,这些配置适用于 TCP 层面的负载均衡,比如数据库服务器、邮件服务器等。
4.1 轮询(Round Robin)
这是最基本的算法,请求会被轮流分发到各个服务器。
stream {upstream mysql {server 192.168.239.131:3306;server 192.168.239.174:3306;}server {listen 3306;proxy_pass mysql;}
}
4.2 最少连接(Least Connections)
此算法会将新的连接发送到当前连接数最少的服务器。
stream {upstream mysql {least_conn;server 192.168.239.131:3306;server 192.168.239.174:3306;}server {listen 3306;proxy_pass mysql;}
}
4.3 加权轮询(Weighted Round Robin)
允许你根据服务器的性能分配不同的权重,权重高的服务器将接收更多连接。
stream {upstream mysql {server 192.168.239.131:3306 weight=5;server 192.168.239.174:3306 weight=10;}server {listen 3306;proxy_pass mysql;}
}
4.4 IP Hash
该算法确保来自同一 IP 地址的连接总是被发送到同一台服务器,这对于需要会话持久性的服务很有用。
stream {upstream mysql {ip_hash;server 192.168.239.131:3306;server 192.168.239.174:3306;}server {listen 3306;proxy_pass mysql;}
}
注意事项
- 在
stream模块中,proxy_pass语法略有不同,它后面直接跟的是上游服务器组的名字,而不是完整的 URL。 - 确保在你的 Nginx 版本中
stream模块是可用的,并且正确地配置了所有服务器和端口。 - 测试和监控负载均衡器的性能和行为至关重要,以确保配置符合预期。
以上配置示例展示了如何使用 Nginx 的 stream 模块进行四层负载均衡的不同算法配置。选择合适的算法需要考虑到服务的性质、服务器的性能差异以及会话管理的需求。
nginx-mod-stream
nginx-mod-stream 是 Nginx 的一个模块,专门用于处理 TCP 和 UDP 流,即第4层(传输层)的负载均衡。这个模块允许 Nginx 作为高性能的 TCP/UDP 代理和负载均衡器,可以用来为各种服务进行负载均衡,包括但不限于数据库服务(如 MySQL、PostgreSQL)、邮件服务(SMTP、IMAP、POP3)、DNS 服务、VoIP 服务等。
主要特点
- TCP/UDP 代理:
nginx-mod-stream可以代理 TCP 和 UDP 请求,这使得 Nginx 成为一个通用的网络负载均衡器。 - 负载均衡:支持多种负载均衡算法,如轮询、最少连接、IP 哈希等。
- 健康检查:可以配置健康检查机制,确保只有健康的服务器接收请求。
- 灵活的配置:类似于 HTTP 模块,
stream模块也支持丰富的配置选项,可以精细控制代理行为。 - 高可用性和性能:得益于 Nginx 的高性能架构,
nginx-mod-stream可以处理大量的并发连接,非常适合高负载环境。
配置示例
以下是一个使用 nginx-mod-stream 进行 TCP 负载均衡的简单配置示例:
stream {upstream mysql {server 192.168.239.131:3306;server 192.168.239.174:3306;}server {listen 3306;proxy_pass mysql;}
}
在这个示例中,Nginx 监听 3306 端口,并将接收到的连接代理到 backend 上游组中的服务器。上游组中定义了两台服务器,它们将根据轮询算法接收连接。
相关文章:
nginx的四层负载均衡实战
目录 1 环境准备 1.1 mysql 部署 1.2 nginx 部署 1.3 关闭防火墙和selinux 2 nginx配置 2.1 修改nginx主配置文件 2.2 创建stream配置文件 2.3 重启nginx 3 测试四层代理是否轮循成功 3.1 远程链接通过代理服务器访问 3.2 动图演示 4 四层反向代理算法介绍 4.1 轮询࿰…...
中职网络安全B模块Cenots6.8数据库
任务环境说明: ✓ 服务器场景:CentOS6.8(开放链接) ✓ 用户名:root;密码:123456 进入虚拟机操作系统:CentOS 6.8,登陆数据库(用户名:root&#x…...
BGP笔记的基本概要
技术背景: 在只有IGP(诸如OSPF、IS-IS、RIP等协议,因为最初是被设计在一个单域中进行一个路由操纵,因此被统一称为Interior Gateway Protocol,内部网关协议)的时代,域间路由无法实现一个全局路由…...
【Redis】复制(Replica)
文章目录 一、复制是什么?二、 基本命令三、 配置(分为配置文件和命令配置)3.1 配置文件3.2 命令配置3.3 嵌套连接3.4 关闭从属关系 四、 复制原理五、 缺点 以下是本篇文章正文内容 一、复制是什么? 主从复制 masterÿ…...
封装了一个仿照抖音效果的iOS评论弹窗
需求背景 开发一个类似抖音评论弹窗交互效果的弹窗,支持滑动消失, 滑动查看评论 效果如下图 思路 创建一个视图,该视图上面放置一个tableView, 该视图上添加一个滑动手势,同时设置代理,实现代理方法 (BOOL)gestur…...
【JavaWeb程序设计】Servlet(二)
目录 一、改进上一篇博客Servlet(一)的第一题 1. 运行截图 2. 建表 3. 实体类 4. JSP页面 4.1 login.jsp 4.2 loginSuccess.jsp 4.3 loginFail.jsp 5. mybatis-config.xml 6. 工具类:创建SqlSessionFactory实例,进行 My…...
php探针
php探针是用来探测空间、服务器运行状况和PHP信息用的,探针可以实时查看服务器硬盘资源、内存占用、网卡流量、系统负载、服务器时间等信息。 下面就分享下我是怎样利用php探针来探测服务器网站空间速度、性能、安全功能等。 具体步骤如下: 1.从网上下…...
泰勒级数 (Taylor Series) 动画展示 包括源码
泰勒级数 (Taylor Series) 动画展示 包括源码 flyfish 泰勒级数(英语:Taylor series)用无限项连加式 - 级数来表示一个函数,这些相加的项由函数在某一点的导数求得。 定义了一个函数f(x)表示要近似的函数 sin ( x ) \sin(x) …...
蔚来汽车:拥抱TiDB,实现数据库性能与稳定性的飞跃
作者: Billdi表弟 原文来源: https://tidb.net/blog/449c3f5b 演讲嘉宾:吴记 蔚来汽车Tidb爱好者 整理编辑:黄漫绅(表妹)、李仲舒、吴记 本文来自 TiDB 社区合肥站走进蔚来汽车——来自吴记老师的演讲…...
【Django+Vue3 线上教育平台项目实战】构建高效线上教育平台之首页模块
文章目录 前言一、导航功能实现a.效果图:b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…...
对比 UUIDv1 和 UUIDv6
UUIDv6是UUIDv1的字段兼容版本,重新排序以改善数据库局部性。UUIDv6主要在使用UUIDv1的上下文中实现。不涉及遗留UUIDv1的系统应该改用UUIDv7。 与 UUIDv1 将时间戳分割成低、中、高三个部分不同,UUIDv6 改变了这一序列,使时间戳字节从最重要…...
记一次饱经挫折的阿里云ROS部署经历
前言 最近在参加的几个项目测评里,我发现**“一键部署”这功能真心好用,省下了不少宝贵时间和力气,再加上看到阿里云现在有个开源上云**的活动。趁着这波热潮,今天就聊聊怎么从头开始,一步步搞定阿里云的资源编排服务…...
代码运行故障排除:PyCharm中的问题解决指南
代码运行故障排除:PyCharm中的问题解决指南 引言 PyCharm,作为一款流行的集成开发环境(IDE),提供了强大的工具来支持Python开发。然而,即使是最先进的IDE也可能遇到代码无法运行的问题。这些问题可能由多…...
css实现渐进中嵌套渐进的方法
这是我们想要的实现效果: 思路: 1.有一个底色的背景渐变 2.需要几个小的块级元素做绝对定位通过渐变filter模糊来实现 注意:这里的采用的定位方法,所以在内部的元素一律要使用绝对定位,否则会出现层级的问题&…...
JavaWeb后端学习
Web:全球局域网,万维网,能通过浏览器访问的网站 Maven Apache旗下的一个开源项目,是一款用于管理和构建Java项目的工具 作用: 依赖管理:方便快捷的管理项目以来的资源(jar包)&am…...
VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解决方法
错误信息 TypeError: Cannot convert a BigInt value to a number at Math.pow vue 或 react package.json添加 "browserslist": {"production": ["chrome > 67","edge > 79","firefox > 68","opera >…...
Linux下mysql数据库的导入与导出以及查看端口
一:Linux下导出数据库 1、基础导出 要在Linux系统中将MySQL数据库导出,通常使用mysqldump命令行工具。以下是一个基本的命令示例,用于导出整个数据库: mysqldump -u username -p database_name > export_filename.sql 其中&a…...
Open3d入门 一文读懂三维点云
三维点云技术的发展始于20世纪60年代,随着激光雷达和三维扫描技术的进步,在建筑、考古、地理信息系统和制造等领域得到了广泛应用。20世纪90年代,随着计算机处理能力的提升,点云数据的采集和处理变得更加高效,推动了自…...
pyinstaller系列教程(一)-基础介绍
1.介绍 PyInstaller是一个用于将Python应用程序打包为独立可执行文件的工具,它支持跨平台操作,包括Windows、Linux和MacOS等操作系统。特点如下: 跨平台支持:PyInstaller可以在多个操作系统上运行,并生成相应平台的可…...
echarts图表:类目轴
category 类目轴,适用于离散的类目数据。 例如商品名称、时间等。 类目轴上的每个刻度代表一个类目,刻度之间没有量的关系,只是简单的分类。 在类目轴上,数据点会对应到相应的类目上。...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
