您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

使用 Nginx 作为 MySQL 的 TCP 负载均衡器

时间:2023-04-13 15:32:13  来源:今日头条  作者:实战Java

 

Overview

随着应用程序的膨胀,我们往往需要扩展程序的基础架构。这篇文章是使用 Nginx 作为 MySQL 的 TCP 负载均衡器的实践。

 

使用 TCP 负载均衡器的好处:

 

  • 对数据库进行负载均衡,避免数据库过载。
  • 应用程序可以使用同样的 IP 或者主机名访问集群中的所有数据库
  • 如果一个节点崩溃,可以绕过该节点并保持应用持续运行
  • 横向扩展比纵向扩展更简单

Let's Do It

我将使用 Docker Compose 在 linux 系统中部署多个 MySQL 节点和一个 NGINX 节点。Docker Compose 启动文件docker-compose.yml如下:

 

version: '3.8'


networks: 
  nginx_mariadb:


services:
  load_balancer:
    image: nginx:stable-alpine
    contAIner_name: nginx-load-balancer
    ports: 
      - "3306:3306"
      - "33060:33060"
    volumes: 
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - mariadb-master
      - mariadb-slave
   .NETworks:
      - nginx_mariadb


  mariadb-master:
    image: 'bitnami/mariadb:latest'
    hostname: "master.janwee.ubuntu"
    container_name: mariadb_master
    volumes:
      - ./mariadb:/var/lib/mysql
    restart: unless-stopped
    tty: true
    environment:
      MARIADB_REPLICATION_MODE: master
      MARIADB_DATABASE: nerddb
      MARIADB_USER: janwee
      MARIADB_PASSword: janwee
      MARIADB_ROOT_PASSWORD: janwee
      MARIADB_REPLICATION_USER: rplusr
      MARIADB_REPLICATION_PASSWORD: janwee
    networks:
      - nginx_mariadb


  mariadb-slave:
    image: 'bitnami/mariadb:latest'
    hostname: "slave.janwee.ubuntu"
    container_name: mariadb_slave
    restart: unless-stopped
    tty: true
    environment:
      MARIADB_REPLICATION_MODE: slave
      MARIADB_REPLICATION_USER: rplusr
      MARIADB_REPLICATION_PASSWORD: janwee
      MARIADB_MASTER_HOST: "master.janwee.ubuntu"
      MARIADB_MASTER_PORT_NUMBER: 3306
      MARIADB_MASTER_ROOT_PASSWORD: janwee
    networks:
      - nginx_mariadb
    depends_on:
      - mariadb-master

 

这里使用 bitnami 的镜像是因为更容易部署 MySQL 主从复制架构。主节点的主机名是 master.janwee.ubuntu,从节点的主机名是 slave.janwee.ubuntu。将三个节点都放在同一个网络下,在 NGINX 负载均衡器中暴露 3306 和 33060 端口。

 

NGINX 节点中的 volumes 选项将配置文件 nginx/nginx.conf 挂载到容器内部:

 

worker_processes 1;


# Configuration of connection processing
events {
    worker_connections 1024;
}


# Configuration specific to TCP/UDP and affecting all virtual servers
stream {
    log_format log_stream '$remote_addr - [$time_local] $protocol $status $bytes_sent $bytes_received $session_time "$upstream_addr"';
    access_log /var/log/nginx/mysql.log log_stream;


    upstream mariadb_read {
        server master.janwee.ubuntu:3306; 
        server slave.janwee.ubuntu:3306;
    }
    
    # Configuration of a TCP virtual server
    server {
        listen 3306;
    # Specify the several addresse
        proxy_pass mariadb_read; 
        proxy_connect_timeout 1s;
        error_log /var/log/nginx/mysql_error.log;
    }


    upstream mariadb_write {
        server master.janwee.ubuntu:3306;
    }


    server {
        listen 33060;
        proxy_pass mariadb_write;
        proxy_connect_timeout 1s;
        error_log /var/log/nginx/mysql_error.log;
    }
}

 

这里设置了两个输入流:mariadb_read 和 mariadb_write。read 同时指向主节点和从节点,write 指向主节点。

 

然后将 nginx 主机名 janwee.ubuntu 加入本地 DNS 配置文件 /etc/hosts中,在 Linux 终端中使用如下命令:

 

echo "127.0.0.1 db.janwee.ubuntu" >> /etc/hosts

 

在docker-compose.yml所在目录下运行如下命令启动容器组:

 

docker compose up -d

 

测试连接到 3306 端口并使用 SELECT @@hostname;查询当前主机名:

 

$ mysql -h janwee.ubuntu -P 3306 -u root -pjanwee -e "select @@hostname";
+---------------------+
| @@hostname          |
+---------------------+
| slave.janwee.ubuntu |
+---------------------+


$ mysql -h janwee.ubuntu -P 3306 -u root -pjanwee -e "select @@hostname";
+----------------------+
| @@hostname           |
+----------------------+
| master.janwee.ubuntu |
+----------------------+

 

测试连接到 33060 端口并使用 SELECT @@hostname; 查询当前主机名:

 

$ mysql -h janwee.ubuntu -P 33060 -u root -pjanwee -e "select @@hostname";
+---------------------+
| @@hostname          |
+---------------------+
| master.janwee.ubuntu |
+---------------------+


$ mysql -h janwee.ubuntu -P 33060 -u root -pjanwee -e "select @@hostname";
+----------------------+
| @@hostname           |
+----------------------+
| master.janwee.ubuntu |
+----------------------+

 

测试结果表明,当连接 3306 端口时 NGINX 会在主节点和从节点之间变更,而连接33060时只会连接到主节点。

 

原文链接;
https://xie.infoq.cn/article/7a6044de8f0e058e5e0fa4295



Tags:Nginx   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
为什么Nginx被称为“反向”代理呢?
Nginx(发音为"engine-x")是一款高性能、轻量级的开源Web服务器软件,也可用作反向代理服务器、负载均衡器和HTTP缓存。Nginx之所以有被称为“反向”代理,是因为它充当客户端设备...【详细内容】
2024-02-01  Search: Nginx  点击:(60)  评论:(0)  加入收藏
如何在Java环境中安装Nginx?
1. 下载Nginx:首先,前往Nginx官方网站(https://nginx.org/en/download.html)下载新版本的Nginx。选择适合您操作系统的版本,通常有Windows、Linux和Mac等不同操作系统的版本可供...【详细内容】
2024-01-22  Search: Nginx  点击:(61)  评论:(0)  加入收藏
一文教你学会使用Nginx
前段时间,了不起给大家说过如果使用 Docker 发布自己的后端项目,也就不再使用 Jar 包进行项目的发版操作,但是这其中就又涉及到了前端如何发版,为什么这么说,因为资深前端开发,可...【详细内容】
2023-12-27  Search: Nginx  点击:(88)  评论:(0)  加入收藏
Nginx 反向代理为什么叫做“反向”?
今天我们来聊聊正向代理和反向代理。01 正向代理(Forward Proxy)正向代理是位于用户设备和互联网之间的服务器。它代理的是客户端,是站在用户一方的。其真实客户端对于服务器不...【详细内容】
2023-12-06  Search: Nginx  点击:(90)  评论:(0)  加入收藏
Nginx的负载均衡实现,你学会了吗?
环境 主机 ip 用途 软件 web1 192.168.50.60 nginx-1 httpd web2 192.168.50.61 nginx-2 httpd proxy 192.168.50.62 负载...【详细内容】
2023-12-06  Search: Nginx  点击:(145)  评论:(0)  加入收藏
Nginx如何开启GZIP文件压缩,你学会了吗?
简介GZip 是一种改进web应用程序性能的技术,文件压缩后再传输可以减少传输数据,提升传输速度。在Nginx服务器上开启Gzip压缩可以有效减少网络传输流量,提升网站的访问速度和性...【详细内容】
2023-11-30  Search: Nginx  点击:(122)  评论:(0)  加入收藏
Nginx配置文件中的关键字是什么?
Nginx 是一款高性能的 Web 服务器软件,同时也是一款反向代理服务器软件。Nginx 的配置文件通常是 /etc/nginx/nginx.conf,以下是一个典型的配置文件,并对其中的关键字进行详细...【详细内容】
2023-11-22  Search: Nginx  点击:(148)  评论:(0)  加入收藏
Nginx 大揭秘:读写分离助力您轻松征服高并发
引言在构建高性能、高可用的 Web 应用时,如何有效地处理数据库的读写负担已成为一个十分重要的考虑因素。Nginx 作为一款强大的反向代理服务器,提供了简单而灵活的负载均衡配...【详细内容】
2023-11-14  Search: Nginx  点击:(53)  评论:(0)  加入收藏
Kubernetes 部署应用(Nginx)的两种方式,你更喜欢哪一种?
k8s发布应用的两种方式: kubernetes-dashboard kubectl命令行一、Dashboard方式配置部署:包含应用名称、容器镒、pod数量、Service非常的方便,不想设置配置yaml的可以很方便的...【详细内容】
2023-11-06  Search: Nginx  点击:(369)  评论:(0)  加入收藏
掌握Nginx的高级用法,构建高性能Web应用
Nginx是一款高性能的Web服务器和反向代理服务器,它广泛用于构建高性能、可靠和安全的Web应用程序。除了基本的用法外,Nginx还提供了一些高级功能和配置选项,可以进一步优化性能...【详细内容】
2023-10-26  Search: Nginx  点击:(220)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(6)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(11)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(10)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(24)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(6)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(28)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(45)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(53)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(54)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条