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

26 篇文章 2 订阅

场景

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

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

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

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

注:

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

实现

1、测试环境搭建

Docker Compose中编排Nginx时yml的写法

  nginx:
    image: nginx:latest
    privileged: true
    ports:
      - 100:100
    volumes:
      - ./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 nginx

docker container rm nginx

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

chmod 777 nginx.conf

Docker Compose编排mysql时yml的写法

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

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

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

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

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

完整yml配置文件

version: "3.8"

services:
               
  mysql1:
    image: mysql:8.0
    command: --lower_case_table_names=1
    environment:
      MYSQL_DATABASE: test
      MYSQL_ROOT_PASSWORD: ABC@123!
      MYSQL_ROOT_HOST: '%'
      TZ: Asia/Shanghai
    ports:
      - "301:3306"
    volumes:
      - ./mysql1/data:/var/lib/mysql
    networks:
      balancenet:
        ipv4_address: 192.128.0.11
               
  mysql2:
    image: mysql:8.0
    command: --lower_case_table_names=1
    environment:
      MYSQL_DATABASE: test
      MYSQL_ROOT_PASSWORD: ABC@123!
      MYSQL_ROOT_HOST: '%'
      TZ: Asia/Shanghai
    ports:
      - "302:3306"
    volumes:
      - ./mysql2/data:/var/lib/mysql
    networks:
      balancenet:
        ipv4_address: 192.128.0.12

  nginx:
    image: nginx:latest
    privileged: true
    ports:
      - 100:100
    volumes:
      - ./nginx/etc/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx
      - ./nginx/etc/conf.d:/etc/nginx/conf.d
    networks:
      balancenet:
        ipv4_address: 192.128.0.13
         
networks:
  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 解析器、

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

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道流氓气质

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值