百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

数据库负载均衡

wptr33 2025-01-13 18:26 27 浏览

数据库负载均衡

在PXC集群中,任何一个数据节点都是可以读写的,一旦PXC集群上线之后,我们不能把所有的数据库请求全部发送给一个数据库节点,PXC集群里那么多数据节点,都应该去参加数据请求的处理,如果要实现数据请求均匀的发送给每一个数据节点,这个技术就叫做数据库的负载均衡。

为什么要负载均衡(必要性)

  • 虽然搭建了集群,但是不使用数据库负载均衡,单节点处理所有请求,负载高,性能差



如果不使用负载均衡,应用程序会把所有的请求都发送给一个PXC节点,这个节点负载特别高,所以很容易出现崩溃,而集群里其他的节点又特别空闲,这种情况就特别不好,所以在结构上要做一些调整。

  • 使用Haproxy做负载均衡,请求被均匀分发给每个节点,单节点负载低,性能好

经过调整之后,引入了新的技术,这个技术叫 Haproxy,它是一个老牌的中间件产品,’Haproxy’ 不是数据库,它只是一个转发器而已。

应用程序发送请求,把这个请求发送给Haproxy,由Haproxy把这些请求转发给具体数据库节点上,这样就可以把大量的请求均匀地发送给每一个PXC节点,这样就不会让某一个PXC处理大量的请求,而是我们集群中的每一个节点去共同承担共同处理数据的请求,这样每一个节点的负载都比较低,这样的架构才是比较合理的架构。

下载镜像

  • Docker仓库中保存了 Haproxy 的镜像,只需要下载即可

docker pull haproxy

  • 我们查看一下镜像 docker images

docker images

创建Haproxy配置文件

安装了 Haproxy 镜像先不要着急去创建容器,Haproxy 里面是不包含配置文件的,需要在宿主机上创建一个 haproxy.cfg 的配置文件,存放目录可以自己去指定,然后我需要使用目录映射技术把 soft 目录映射到 haproxy 容器里面,那么在haproxy 容器就可以知道这个配置文件,然后启动 Haproxy 的服务。

touch /home/soft/haproxy/haproxy.cfg

配置文件强请参考 https://zhangge.net/5125.html

我这里提供的配置文件内容:

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:8888 -p 4002:3306 
-v /home/soft/haproxy:/user/local/etc/haproxy
--name haproxy --privileged --net=net1
haproxy
  • 端口 3306:haproxy对外提供的数据库负载均衡的服务公开的端口就是3306,我需要将端口映射到宿主机,宿主机上的3306端口已经被占用了,所以这里选择4002端口;
  • 端口 8888:haproxy提供了一个后台监控的画面,这个监控的画面在配置文件里面定义的就是8888,然后8888映射到宿主机上的端口这里选择的是4001端口,所以将来通过4001宿主机端口就可以进入到haproxy提供的监控画面上,就可以看到数据库负载均衡的状态;
  • -v /home/soft/haproxy:/user/local/etc/haproxy:目录的映射,把宿主机 /home/soft/haproxy 映射到容器 /user/local/etc/haproxy 目录中,将来在宿主机上的目录中放置配置文件,容器中的目录中也就可以看到这个配置文件了;
  • –name haproxy:给容器起的名字;
  • –privileged:权限;
  • –net=net1:网段;
  • haproxy:镜像的名字;


  • 上面指令执行完后就代表容器成功启动了,进入容器中执行下面指令
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

然后进入监控画面就可以看到数据库运行状态了.

  • 将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.7 haproxy

创建的容器在后台运行,我必须进入后台运行的容器,执行命令,把haproxy中间件启动起来,然后才能实现数据库的负载均衡

  • 下面指令表示进入后台运行的容器
docker exec -it h1 bash
  • -it:交互方式,有界面
  • bash: 运行指令为bash
  • 启动haproxy指令
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  • -f:加载配置文件
  • /usr/local/etc/haproxy/haproxy.cfg: 配置文件位置

在DB数据库中创建一个haproxy的账号密码为空,随便是DB1,还是其他的DB几。因为是haproxy中间件,要用这个账号登录数据库然后发送消息检测,% 表示任何 ip 都可以以这个账号登录数据库,该语句我是在DB1数据库中执行的

CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

打开浏览器,地址IP是宿主机的IP,端口是 4001,相对路径是 dbs,回车之后需要数据账号密码,账号密码配置文件里面都有配置,这里账号是 admin,密码是 abc123456

http://IP:4001/dbs

登录用户名和密码在配置文件中有写

下图可以看到一共是5个数据库节点,分别是MYSQL_1,MYSQL_2,MYSQL_3,MYSQL_4,MYSQL_5,现在5个节点都是畅通运行的,待会我会把某一个节点挂掉,会发现背景色就不是绿色的了

  • 停止 node1 节点
docker stop node1

切换到后台管理画面,会发现第一个背景色变成了其他颜色,表示这个节点已经出现了故障,其他的四个节点还可以正常运行,正常向haproxy发送数据库的请求并不会受到影响,因为haproxy会把请求分发给正常运行的MySQL节点

  • 在MySQL客户端上连接haproxy,密码是 abc123456

其实Haproxy并不存储任何数据,我把请求发送给Haproxy,它只是把请求转发给真实的数据库实例

  • 验证,我向H1节点的数据库student表中插入C的数据,然后保存提交

提交的数据要么被轮询发送给DB2,要么分发给DB3,要么分发给DB4,要么分发给DB5,这次发给你,下次就会发给我,假如发给DB4了,因为PXC有同步机制,它会同步到其他的数据库节点

  • 我打开DB2
  • 再打开DB5

DB1就不要看了,因为已经挂掉了。

所以我们正常去操作haproxy,向它传递增删该查的语句,它都会均匀的分发给真实的MySQL实例,所以它起到一个负载均衡的作用,不会让你的数据库请求全部集中到一个数据库节点上去执行,它把你的请求均匀的分散出去,那么每一个数据库实例它得到的请求数量就小很多了。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...