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 上游组中的服务器。上游组中定义了两台服务器,它们将根据轮询算法接收连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/376496.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据基础:Hadoop之MapReduce重点架构原理

文章目录 Hadoop之MapReduce重点架构原理 一、MapReduce概念 二、MapReduce 编程思想 2.1、Map阶段 2.2、Reduce阶段 三、MapReduce处理数据流程 四、MapReduce Shuffle 五、MapReduce注意点 六、MapReduce的三次排序 Hadoop之MapReduce重点架构原理 一、MapReduce概…

在word中删除endnote参考文献之间的空行

如图,在References中,每个文献之间都有空行。不建议手动删除。打开Endnote。 打开style manager 删除layout中的换行符。保存,在word中更新参考文献即可。

初阶数据结构—排序

第一章:排序的概念及其运用 1.1 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有…

宝塔:如何开启面板ssl并更新过期ssl

1、登录宝塔面板 > 前往面板设置 > 最上方的安全设置 > 面板SSL > 面板SSL配置 打开后先查看自签证书的时间,如果时间是已经过期的,就前往这个目录,将该目录下所有文件都删掉 重新回到面板SSL配置的位置,打开后会看到…

复现ORB3-YOLO8项目记录

文章目录 1.编译错误1.1 错误11.2 错误21.3 错误31.4 错误4 1.编译错误 首先ORB-SLAM相关项目已经写过很多篇博客了,从ORB-SLAM2怎么运行,再到现在的项目。关于环境已经不想多说了 1.1 错误1 – DEPENDENCY_LIBS : /home/lvslam/ORB3-YOLO8/Thirdparty…

【web】-sql注入-login

根据网址提示打开如图: 查看源代码前台并没有过滤限制、扫描后台也没有发现特殊文件。看到标题显示flag is in database,尝试sql注入。 由于post,bp抓包如下: 运行python sqlmap.py -r 1.txt --dump 获取flag 42f4ebc342b6ed4af4aadc1ea75f…

Python打开Excel文档并读取数据

Python 版本 目前 Python 3 版本为主流版本,这里测试的版本是:Python 3.10.5。 常用库说明 Python 操作 Excel 的常用库有:xlrd、xlwt、xlutils、openpyxl、pandas。这里主要说明下 Excel 文档 .xls 格式和 .xlsx 格式的文档打开和读取。 …

实现多层感知机

目录 多层感知机: 介绍: 代码实现: 运行结果: 问题答疑: 线性变换与非线性变换 参数含义 为什么清除梯度? 反向传播的作用 为什么更新权重? 多层感知机: 介绍:…

【C++】———— 继承

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年7月5日 一、什么是继承? 继承的概念 定义: 继承机制就是面向对象设计中使代码可以复用的重要手段,它允许在程序员保持原有类特性的基础上进行扩展…

uniapp+vue3嵌入Markdown格式

使用的库是towxml 第一步:下载源文件,那么可以git clone,也可以直接下载压缩包 git clone https://github.com/sbfkcel/towxml.git 第二步:设置文件夹内的config.js,可以选择自己需要的格式 第三步:安装…

redisTemplate报错为nil,通过redis-cli查看前缀有乱码

public void set(String key, String value, long timeout) {redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);} 改完之后 public void set(String key, String value, long timeout) {redisTemplate.setKeySerializer(new StringRedisSerializer()…

以太网中的各种帧结构

帧结构(Ethernet Frame Structure)介绍 以太网信号帧结构(Ethernet Signal Frame Structure),有被称为以太网帧结构,一般可以分为两类 —— 数据帧和管理帧。 按照 IEEE 802.3,ISO/IEC8803-3 …

跨域解决方案

跨域 当发起请求的协议号、域名、端口号中有一个不一样时就会导致跨域 跨域解决方案 分为两个方面,是否可以修改服务器端。 可以修改服务器端:cors方案、jsonp方案 不可以修改服务器端: 使用代理: 因为跨域主要是针对浏览器…

springboot+vue 开发记录(九)后端打包部署运行

本篇文章主要内容是后端项目写好了,怎么打包部署到服务器上运行。 文章目录 1. 在服务器上安装Docker2. 在Docker中装MySQL3. 在Docker中设置网桥,实现容器间的网络通信4. 修改后端配置文件5. 修改pom.xml文件6. 打包7. 编写DockerFile文件8. 上传文件到…

Qt MV架构-视图类

一、基本概念 在MV架构中,视图包含了模型中的数据项,并将它们呈现给用户。数据项的表示方法,可能和数据项在存储时用的数据结构完全不同。 这种内容与表现分离之所以能够实现,是因为使用了 QAbstractItemModel提供的一个标准模…

Learning vtkjs之hello vtk

学习vtkjs 最近由于工作需要,开始学习vtkjs的相关内容,发现其实在医疗和工业领域,这个vtk的库的example还是非常有帮助,但是实际用的一些开发工具,或者研发生态却没有three的好,也就是能抄写的东西不多&am…

Java常用排序算法

冒泡排序(Bubble Sort) arr[0] 与 arr[1]比较,如果前面元素大就交换,如果后边元素大就不交换。然后依次arr[1]与arr[2]比较,第一轮将最大值排到最后一位。 第二轮arr.length-1个元素进行比较,将第二大元素…

数据处理-Matplotlib 绘图展示

文章目录 1. Matplotlib 简介2. 安装3. Matplotlib Pyplot4. 绘制图表1. 折线图2. 散点图3. 柱状图4. 饼图5. 直方图 5. 中文显示 1. Matplotlib 简介 Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。 Ma…

C++ | Leetcode C++题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue { private:stack<int> inStack, outStack;void in2out() {while (!inStack.empty()) {outStack.push(inStack.top());inStack.pop();}}public:MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if (outStac…

Linux 下 redis 集群部署

目录 1. redis下载 2. 环境准备 3. redis部署 3.1 修改系统配置文件 3.2 开放端口 3.3 安装 redis 3.4 验证 本文将以三台服务器为例&#xff0c;介绍在 linux 系统下redis的部署方式。 1. redis下载 下载地址&#xff1a;Index of /releases/ 选择需要的介质下载&am…