【Docker】基于实例项目的集群部署(六)数据库负载均衡 | Haproxy分发机制 | 监控负载状况

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 【Docker】基于实例项目的集群部署(六)数据库负载均衡 | Haproxy分发机制 | 监控负载状况


从上一篇中我们知道,PXC集群中任何一个节点都是可以读写的,但是,一旦PXC集群上线后,我们不能把所有的数据库请求全部发送给一个数据库节点,而是这个PXC集群中的数据库节点都应该参与到请求的处理。那么负载均衡的工作,就是让每个请求均匀的发送给每个数据库节点。

负载均衡的必要性

  • 虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,会造成负载高、性能差等问题。如图:
  • 使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好。如下图:

    你可能会问:为什么不用Nginx作负载均衡?
    原因:每个中间件的选择都是需要进行考量的,如下图所示,Nginx对TCP/IP协议的支持的比较晚,而Haproxy是一个老牌的中间件产品,虽然不支持插件,但其成熟性使得它很可靠。
    下面,我们列出负载均衡中间件的对比图:

安装Haproxy镜像

Docker仓库下载即可:docker pull haproxy

haproxy是这个镜像的缩写。

现在,我们下载好了haproxy镜像,但是别急,我们先把Haproxy的配置文件(haproxy.cfg)创建好,再去创建容器

创建Haproxy配置文件

touch /home/soft/haproxy.cfg

首先现在宿主机上通过touch指令创建一个配置文件haproxy.cfg,然后通过 目录映射技术把soft目录映射到haproxy容器里面。这样,资Haproxy容器就可以找到这个配置文件,然后启动Haproxy的服务,自然而然就会有配置文件。

关于详细的配置文件编写,请参考:https://zhangge.net/5125.html

我们重点来看下数据库负载均衡这块:

解释:

  • listen proxy-mysql :定义一个配置,名称叫 proxy-mysql
  • bing 0.0.0.0:3306 开放的端口为3306,0.0.0.0表示任何IP地址都能访问3306端口
  • mode tcp 表示3306支持的协议是tcp,例如有应用程序向3306端口发起数据库请求,它就会把请求转发给具体的PXC数据库实例。

同时,Haproxy自带了转发算法:

因为PXC容器里跑的数据库硬件配置都是相同的,所以不需要使用权重算法,只有当主机的硬件配置不同时,才需要采用权重算法。如,主机硬件配置高的,可以把它的权重设置的高些,这样它可以处理更多的数据库请求;硬件配置低的数据库节点,就分配低一些的权重。

balance roundrobin 这里采用的是轮询算法

  • 心跳检测:

    option mysql-check user haproxy //给数据库创建一个叫haproxy的账户,密码为空,不分配任何权限。Haproxy通过这个账户登录到Mysql上,发送心跳检测。这样它就知道Mysql是在运行,还是宕机。
    连接到数据库上 要发送心跳检测,那么要提供一个Haproxy能登录的账号user,后面跟的haproxy是你在PXC数据库上创建的用户,用户名可以随意取,如你叫abc,那么就是 user abc。

再往下,配置要进行负载均衡的数据库节点:

server MySQL_1(自定义名字) 172.18.0.2:3306(数据库节点的地址,容器的端口是3306)check(发送心跳检测,可以具体设置每隔几毫秒检测一次,具体设置可以在百度上搜下) weight 1(权重。如果采用的是轮询算法,即使写上权重,也不会生效)maxconn 2000 (最大连接数,这里为2000)

接下来,如果你已经配置好了Haproxy配置文件,我们就可以创建Haproxy容器:

这里给出一份参考的配置文件:

# 启动容器时使用目录映射技术使容器读取该配置文件
# $ touch /home/haproxy/haproxy.cfg
# haproxy.cfg
global
  #工作目录
  chroot /usr/local/etc/haproxy
  #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
  log 127.0.0.1 local5 info
  #守护进程运行
  daemon
defaults
  log global
  mode  http
  #日志格式
  option  httplog
  #日志中不记录负载均衡的心跳检测记录
  option  dontlognull
    #连接超时(毫秒)
  timeout connect 5000
    #客户端超时(毫秒)
  timeout client  50000
  #服务器超时(毫秒)
    timeout server  50000
#监控界面 
listen  admin_stats
  #监控界面的访问的IP和端口
  bind  0.0.0.0:8888
  #访问协议
    mode        http
  #URI相对地址
    stats uri   /dbs
  #统计报告格式
    stats realm     Global\ statistics
  #登陆帐户信息
    stats auth  admin:abc123456
#数据库负载均衡
listen  proxy-mysql
  #访问的IP和端口
  bind  0.0.0.0:3306  
    #网络协议
  mode  tcp
  #负载均衡算法(轮询算法)
  #轮询算法:roundrobin
  #权重算法:static-rr
  #最少连接算法:leastconn
  #请求源IP算法:source 
    balance  roundrobin
  #日志格式
    option  tcplog
  #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
  server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
  server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
  server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
  #使用keepalive检测死链
    option  tcpka  

创建Haproxy容器

docker run -it -d
-p 4001:888 -p 4002:3306
-v /home/soft/haproxy:/usr/local/etc/haproxy
--name haproxy --privileged --net=net1
haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

解释:

  • Haproxy提供了一个后台监控的画面(能查看数据库负载均衡的状况),这个画面在配置文件里定义的就是8888端口(可以在Haproxy的配置文件中查看)
  • -v /home/soft/happroxy:/usr/local/etc/haproxy 目录映射,把宿主机的haproxy映射到容器的/usr/local/etc/haproxy目录上。
  • --name h1 --privileged --net=net1 给容器起一个名字h1,权限,net1网段(跟数据库实例在同一个网段上)
  • 启动haproxy: haproxy -f /usr/local/etc/haproxy/haproxy.cfg

实际操作:

  • 首先,在服务器上新建一个soft/haproxy文件夹,并把haproxy.cfg配置文件放到haproxy文件夹下:

  • 然后使用xshell 进入到/home/soft/haproxy文件夹下:
  • 然后,创建Haproxy容器,使用指令:
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.2(注:选择一个适合的子网地址) haproxy

我是根据我这边的网段进行设置的,如图:

执行指令,运行后:

  • 由于创建的容器在后台运行,我必须要进入到后台的容器,执行指令:
    docker exec -it (注:有交互界面) h1(注:容器名字) bash(注:交互指令类型)

    此时,我们就进入到刚才启动的Haproxy容器里面。
  • 执行启动Haproxy的指令:
    haproxy -f(表示加载配置文件) /usr/local/etc/haproxy/haproxy.cfg(配置文件的路径)

这样,我们就启动了haproxy。一会我们切换到浏览器上查看监控画面,我们就会知道数据库的负载均衡是否已经运行起来了。

现在我们需要在Mysql数据库上创建一个名叫 haproxy的账号,因为Haproxy中间件要用这个账号登录数据库,然后发送心跳检测。

  • 在浏览器中输入:宿主机地址:监控端口/dbs ,然后回车,如下图我的宿主机IP是这样的:(你要输入你自己宿主机的地址

    注:这些可以在haproxy.cfg配置文件中定义:

  • 输入用户名和密码后,我们就可以进入到监控画面:

  • 从上图监控画面中我们可以看到,里面有5个数据库节点。我们把node1 关掉,再看看:docker stop node1
  • 最后我们在主机上新建一个Haproxy数据库,并连接到CentOS中的宿主机IP,端口号也是宿主机映射的端口:

  • 然后,我们可以在H1中对test表进行增删操作,此时H1会把这条操作转发给D1至D5的其中一个节点(实际上H1是不存储任何真实数据的,它只是进行分发操作),这个节点就会进行更新,然后由于这个节点具备PXC同步机制,它会把这次操作同步给其他4个节点。

由此可见,这样就完成了负载均衡的操作。

下一篇中,我们将探索负载均衡高可用方案

参考

深入理解负载均衡的点点滴滴



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
8月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
11月前
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
327 7
深入理解Docker:为你的爬虫项目提供隔离环境
|
10月前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
1999 82
|
8月前
|
缓存 NoSQL 算法
Redis数据库的键值过期和删除机制
我们需要注意的是,虽然Redis提供了这么多高级的缓存机制,但在使用过程中,必须理解应用的特性,选择合适的缓存策略,才能最大化Redis的性能。因此,在设计和实施应用程序时,理解应用的数据访问模式,以及这些模式如何与Redis的缓存机制相互作用,尤为重要。
286 24
|
9月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
10月前
|
SQL 数据库 Docker
【赵渝强老师】在Docker中运行达梦数据库
本文介绍了在Docker容器中部署达梦数据库(DM 8)的具体步骤,包括创建文件夹、下载安装包、导入镜像、启动容器、登录数据库及查看状态等操作。同时,通过视频讲解辅助理解。文中还分析了将数据库服务容器化的潜在问题,如数据安全性、硬件资源争用、网络带宽占用和额外隔离带来的挑战,指出数据库服务在生产环境中可能不适合容器化的原因。
1051 4
【赵渝强老师】在Docker中运行达梦数据库
|
10月前
|
存储 缓存 Oracle
崖山数据库YashanDB的共享集群机制初探
YashanDB共享集群是崖山数据库系统的核心特性,支持单库多实例并发读写,确保强一致性与高可用性。基于Shared-Disk架构和Cohesive Memory技术,实现数据页协同访问及资源控制。其核心组件包括YCK、YCS和YFS,提供金融级RPO=0、RTO<10秒的高可用能力。通过自研“七种武器”(如页内锁、去中心化事务管理等),优化性能并解决读写冲突。相比Oracle RAC,YashanDB在TPC-C测试中性能高出30%,适用于金融、电信等关键领域,推动国产化替代进程。
崖山数据库YashanDB的共享集群机制初探
|
11月前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
1036 42
|
11月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
348 19
|
10月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
1338 1

热门文章

最新文章