DockerCompose编排Nginx+Mysql并实现Nginx配置Mysql(TCP协议)负载均衡

场景

Nginx配置实例-负载均衡实例:平均访问多台服务器:

Nginx配置实例-负载均衡实例:平均访问多台服务器_我想访问五个服务器的信息用nginx怎么做-CSDN博客

以上实现Nginx的http协议的负载均衡,如果使用Nginx实现TCP协议的负载均衡比如配置Mysql的连接,可使用如下方式。

首先搭建两台mysql和一台nginx的测试环境。这里使用Docker Compose搭建。

注:

博客:
霸道流氓气质-CSDN博客

实现

1、测试环境搭建

Docker Compose中编排Nginx时yml的写法

  nginx:image: nginx:latestprivileged: trueports:- 100:100volumes:- ./nginx/etc/nginx.conf:/etc/nginx/nginx.conf- ./nginx/logs:/var/log/nginx- ./nginx/etc/conf.d:/etc/nginx/conf.d

注意这里在docker-compose.yml所在的路径下新建nginx目录,并在目录下新建etc和logs目录

另外注意nginx做数据卷映射时不要直接讲以上nginx的配置文件ngin.conf进行映射,另外两个目录logs和conf.d可以直接进行映射。

需要先手动将nginx.conf配置文件上传至宿主机目录下再启动容器。

原因是不支持直接挂载文件,只能挂载文件夹,想要挂载文件,必须宿主机也要有对应的同名文件。

如果强行直接挂载,则启动容器后会提示

mounting "/root/nginx.conf" to rootfs at "/etc/nginx/nginx.conf" caused: mount through procfd: not a directory: unknown:

Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

那么如何获取nginx.conf数据卷映射的配置文件?

先使用docker命令运行一个nginx容器,然后进入容器内部,将配置文件复制出来即可。

docker中拉取nginx镜像

docker pull nginx

docker中启动nginx容器

docker run -d --name nginx nginx

docker中复制nginx容器内配置文件到当前目录

docker cp nginx:/etc/nginx/nginx.conf $PWD/

执行效果

配置文件复制成功后就可以停掉并删除容器了。

docker中停掉并删除nginx容器

docker container stop nginxdocker container rm nginx

上面nginx.conf复制到nginx/etc目录下之后,需要授予权限

chmod 777 nginx.conf

Docker Compose编排mysql时yml的写法

  mysql1:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "301:3306"volumes:- ./mysql1/data:/var/lib/mysql

这里设置root密码,并允许远程连接,然后端口映射为301到容器内3306

同理再搭建一个mysql,映射端口302

  mysql2:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "302:3306"volumes:- ./mysql2/data:/var/lib/mysql

2、使nginx与两个mysql使用自定义网络方式互通

完整yml配置文件

version: "3.8"services:mysql1:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "301:3306"volumes:- ./mysql1/data:/var/lib/mysqlnetworks:balancenet:ipv4_address: 192.128.0.11mysql2:image: mysql:8.0command: --lower_case_table_names=1environment:MYSQL_DATABASE: testMYSQL_ROOT_PASSWORD: ABC@123!MYSQL_ROOT_HOST: '%'TZ: Asia/Shanghaiports:- "302:3306"volumes:- ./mysql2/data:/var/lib/mysqlnetworks:balancenet:ipv4_address: 192.128.0.12nginx:image: nginx:latestprivileged: trueports:- 100:100volumes:- ./nginx/etc/nginx.conf:/etc/nginx/nginx.conf- ./nginx/logs:/var/log/nginx- ./nginx/etc/conf.d:/etc/nginx/conf.dnetworks:balancenet:ipv4_address: 192.128.0.13networks:balancenet:ipam:config:- subnet: 192.128.0.0/24

3、启动测试环境

docker compose up

这里不添加-d,便于查看日志。

确保无报错,三个容器启动成功

4、nginx配置修改实现tcp协议负载均衡

分别连接上面启动的301和302的mysql,建立不同的数据库名称为301和302。

要实现连接nginx代理的100端口的mysql时,负载均衡的连接到两个数据库,可以通过查看数据库名称进行结果验证。

在 NGINX 的 stream 模块内使用 upstream 代码块对 TCP 服务器实施负载均衡。

上面容器内复制出来的nginx.conf的文件未修改之前为

添加如下配置

stream{upstream mysql{server 192.128.0.11:3306 weight=1;server 192.128.0.12:3306 weight=1;}  server {listen 100;server_name 192.128.0.13;proxy_pass mysql;}  
}

添加之后完整的nginx.conf文件

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;
}stream{upstream mysql{server 192.128.0.11:3306 weight=1;server 192.128.0.12:3306 weight=1;}  server {listen 100;server_name 192.128.0.13;proxy_pass mysql;}  
}

上面的配置的 server 代码块指示 NGINX 侦听 TCP 端口 100,并在两个 MySQL 数据库读取副本之间实施负载均衡。

上面两个mysql的root密码是一致,下面用mysql客户端工具比如Navicat等使用同样的密码连接和关闭数据库,验证是否显示不同

的数据库名称。

总结:

http 和 stream 上下文之间的主要区别在于它们在 OSI 模型的不同层上运行。

http 上下文在应用层(七层)运行,stream 在传输层(四层)运行。

这并不意味着 stream 上下文不能通过一些巧妙的脚本获得应用感知能力,

而是说 http 上下文是专门为了完全理解 HTTP 协议而设计的,

stream 上下文默认情况下只能对数据包进行路由和负载均衡。

TCP 负载均衡由 NGINX 的 stream 模块定义。

stream 模块与 HTTP 模块一样,允许您定义上游(upstream)服务器池并配置侦听服务器。

在配置服务器侦听给定端口时,您必须定义待侦听的端口或者地址加端口(可选)。

然后您必须配置目标服务,无论这是连接另一个地址的直接反向代理还是上游资源池。

配置中有许多选项可以改变 TCP 连接反向代理的属性,包括 SSL/TLS 验证限制、超时和 keepalive 等。

这些代理选项的一些值可以是(或者包含)变量,例如下载速率、验证 SSL/TLS 证书时使用的名称等。

TCP 与 HTTP 负载均衡中的 upstream 指令非常相似,它们均将上游资源定义为服务器,

配置格式同样为 Unix 套接字、IP 或 FQDN,此外服务器 weight 参数、最大连接数、DNS 解析器、

连接数缓增期以及判断服务器是激活状态、故障状态还是备用模式的参数也都相似。

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

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

相关文章

Java的JVM中的概念之——新生代和老年代

JVM新生代和老年代是JVM中非常重要的概念,那么他们在JVM中扮演者什么样的角色和含义呢? 在Java虚拟机(JVM)的垃圾回收(GC)中,内存被分为不同的区域,其中两个主要区域是新生代&#…

PHP餐厅点餐系统小程序源码

🍽️【餐厅点餐新纪元,点餐系统让用餐更便捷!】📱 🔍 一键浏览,菜单尽在掌握 📱 走进餐厅,无需再担心找不到服务员或菜单被抢光!餐厅点餐系统让你轻松扫描桌上的二维码…

HarmonyOS Developer之图片帧动画播放器

创建image-animator组件 在pages/index目录下的hml文件中创建一个image-animator组件,css文件中编写组件样式,js文件中引用图片。 设置image-animator组件属性 添加iteration(播放次数)、reverse(播放顺序&#xf…

LVS原理及实例

目录 LVS原理 LVS概念 lvs集群的类型 lvs-nat 解释 传输过程 lvs-dr 解释 传输过程 特点 lvs-tun LVS(Linux Virtual Server)常见的调度算法 防火墙标记(Firewall Marking)结合轮询调度 实战案例 lvs的nat模式配置 …

使用Linux实现FTP云盘1

关于FTP服务器 FTP(文件传输协议)服务器是在互联网上提供文件存储和访问服务的计算机,它们依照FTP 协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行,服务端不断接收客户端指令,服务 端可同时处…

提取含有特定字符的行和列grep函数(含有替换)

目录 ①grep提取含有特定字符的列 ②grep提取含有特定字符的行 R语言进行字符的替换和删减gsub,substr函数R语言进行字符的替换和删减gsub,substr函数_r语言数据框字符替换-CSDN博客 ①grep提取含有特定字符的列 在一个dataframe中,需要提…

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例,对列表数据的异步加载,并渲染展示。 ——>axios来发送异步请求 (1) (2)在vue当中安装axios (注意在当前的项目目录,并且安装完之后…

Xcode 在原生集成flutter项目

笔者公司有一个从2017年就开始开发的iOS和安卓原生项目,现在计划从外到内开始进行项目迁徙。 1》从gitee拉取flutter端的代码;(Android报错Exception: Podfile missing) 2》替换Xcode里的cocopods里Podfile的路径 然后报警 然后…

Linux从0到1——进程池

Linux从0到1——进程池 1. 进程池的概念2. 进程池实现思路3. 进程池的代码实现3.1 创建管道,创建子进程3.2 封装任务3.3 Work接口3.4 发送任务3.5 回收资源,关闭管道(重点)3.6 改造CreatChannels接口 4. 完整代码 1. 进程池的概念…

ECMAScript6模板字面量:反引号、${}占位符的使用

ECMAScript 6 中引入了模板字面量,主要通过多行字符串和字符串占位符对字符串进行增强操作。如下: //使用ECMAScript6模板字面量拼接字符串,例如:2024年8月12日 15:38:28 星期一 let dateRet ${Year}年${Month}月${Dates}日 ${H…

lvs、集群

1.集群和分布式 当多个用户当用户访问一个服务器时,服务器server1可能就会崩,假如这时候我们新加一个服务器server2来缓解server1的压力,那么就需要一个调度器lvs来分配,所以现在就是用户的访问就需要通过调度器之后到达服务器&a…

简述MYSQL聚簇索引、二级索引、索引下推

一丶聚簇索引 InnoDB的索引分为两种: 聚簇索引:一般创建表时的主键就会被mysql作为聚簇索引,如果没有主键则选择非空唯一索引作为聚簇索引,都没有则隐式创建一个索引作为聚簇索引;辅助索引:也就是非聚簇索…

KillWxapkg 自动化反编译微信小程序,小程序安全评估工具,发现小程序安全问题,自动解密,解包,可还原工程目录,支持修改Hook,小程序

纯Golang实现,一个用于自动化反编译微信小程序的工具,小程序安全利器,自动解密,解包,可还原工程目录,支持微信开发者工具运行 由于采用了UPX压缩的软件体积,工具运行时可能会出现错误报告&…

在等保测评中,如何平衡技术风险和非技术风险的评估?

在等保测评中平衡技术风险和非技术风险的评估,需要一个综合的方法来确保所有相关的风险都得到适当的考虑。以下是一些关键步骤: 1. 全面风险识别:首先识别所有可能影响组织的风险,包括技术风险(如系统漏洞、恶意软件&…

企业大模型落地从0到0.1

现在人工智能里的“大明星”——大模型,正在悄悄改变各行各业。这就像给企业装上了一颗聪明的大脑,能帮助解决各种棘手问题,提升工作效率。今天,我们就来分析下企业如何一步一步让这个“大脑”在自家地盘里真正派上用场&#xff0…

九、OpenCVSharp 中的图像形态学操作

文章目录 简介一、腐蚀1. 腐蚀的原理和数学定义2. 结构元素的形状和大小选择3. 腐蚀操作的代码实现和效果展示二、膨胀1. 膨胀的概念和作用2. 与腐蚀的对比和组合使用(如开运算、闭运算)三、开运算1. 开运算的定义和用途(去除小的明亮区域)2. 开运算在去除噪声和分离物体方…

数据结构--树与二叉树

数据结构分类 集合 线性结构(一对一) 树形结构(一对多) 图结构(多对多) 数据结构三要素 1、逻辑结构 2、数据的运算 3、存储结构(物理结构) 树的概念 树的分类 满二叉树和完全二叉树 二叉排序树 平衡二叉树 二叉树分类总结 二叉树的存储结构 …

Element-UI自学实践

概述 Element-UI 是由饿了么前端团队推出的一款基于 Vue.js 2.0 的桌面端 UI 组件库。它为开发者提供了一套完整、易用、美观的组件解决方案,极大地提升了前端开发的效率和质量。本文为自学实践记录,详细内容见 📚 ElementUI官网 1. 基础组…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求,需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡,搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头,拉取1920x108…

在等保测评中,如何平衡资产识别的全面性和准确性,避免过度关注某些资产而忽视其他潜在风险?

在等保测评中平衡资产识别的全面性和准确性,避免过度关注某些资产而忽视其他潜在风险,可以通过以下策略实现: 1. 全面审计:确保进行一次全面的审计,包括所有类型的资产,避免遗漏任何关键组件。 2. 风险导…