`
like.eagle
  • 浏览: 249074 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL-Proxy负载平衡测试遇到的问题及其分析 && MySQL-Proxy工作机制

阅读更多

(1)MySQL-Proxy负载平衡测试中遇到的问题及其分析

 

(a)在0.8.1版mysql-proxy的负载平衡测试中,出现了如下的测试结果:

 

第一次启动mysql-proxy:
[root@rap2 ~]# mysqlslap -h 127.0.0.1 -P 4040 -u root -pcps-pt --create-schema=database_name --query='SELECT * FROM table_name WHERE id = 18' -c 7 -i 10 --number-of-queries 10000

* 有三台backend服务器,104,110和111
查询分配情况比较
104(主)     110(从)    111(从)
8.5%        51.6%      39.9%
(8519次)  (51598次)  (39839次)


在不重新启动mysql-proxy的情况下,继续执行上述测试,查询的分配情况如下所示:
* 有三台backend服务器,104,110和111
查询分配情况比较
104(主) 110(从)      111(从)
0%       50.6%        49.4%

(0次)     (50580次)  (49374次)

 

(b)分析上述测试结果可以得出这样的结论:
①在第一次启动mysql-proxy后,10万次查询中有一部分(8.5%)流向了主服务器(104),剩下的查询在从服务器110和111中也没有实现均衡分配, 由此可知,在本次测试中,mysql-proxy的负载平衡没有实现并且主服务器还承担一部分查询操作;
②第一次启动mysql-proxy后,先执行了一次10万次查询,然后继续执行同样的测试时,不但所有的查询都集中在从服务器(110和111), 而且从服务器之间也基本实现了查询次数的均衡分配;

那么为什么会出现上面奇怪的结论呢?
想知道结果的话,就要深入分析mysql-proxy的工作机制。
#想了解mysql-proxy的工作机制的话请参照【(2)MySQL-Proxy工作流程】。

 

(c)了解完mysql-proxy的工作机制,继续分析出现结论(b)的原因:
①当mysql-proxy处于第一次启动后,连接池中没有创建任何数据库服务器的连接。
  当第一次查询请求过来后,根据balance.lua中的idle_ro()逻辑,mysql-proxy选择从连接池中拿从服务器的连接。
  然而此时的连接池中没有任何连接,那么根据rw-splitting.lua中的connect_server()逻辑,
  mysql-proxy没有拿到任何连接时,优先从连接池中拿主服务器的连接,此时mysql-proxy就会默认创建一个主服务器的连接;
②查询请求越来越多,mysql-proxy会不断的创建主服务器的连接。当主服务器的连接数超过最低空闲连接数(min_idle_connections)后,
  mysql-proxy才会继续创建第一个从数据库的连接;
③mysql-proxy依次按照上述规则创建数据库连接,直至所有的数据库连接都被创建过并且其数目达到最低空闲连接数(min_idle_connections);
④当所有的主从数据库连接都被创建过后,再有查询请求过来的话,mysql-proxy会按照从服务器选择函数idle_ro()的逻辑来选择当前连接状态最少的从服务器进行连接(即实现了负载均衡)。
⑤有了上面四步的解析,现在应该对出现结论(b)的原因很清楚了吧。

 

(d)附录→关于在mysql-proxy0.8.0和0.8.1中实现负载均衡的脚本修正:

* 修改文件:
/usr/local/mysql_proxy_0.8.1/lib/mysql-proxy/lua/proxy/balance.lua

*修改函数:idle_ro()
*  < 表删除;  > 表追加;

<       local max_conns_ndx = 0
---
>         local max_conns_ndx = math.random(2,#proxy.global.backends)
>         local s_tmp = proxy.global.backends[max_conns_ndx]
>         local conns_tmp = s_tmp.pool.users[proxy.connection.client.username]
>         if s_tmp.type == proxy.BACKEND_TYPE_RO and
>            s_tmp.state ~= proxy.BACKEND_STATE_DOWN and
>            conns_tmp.cur_idle_connections > 0 then
>              max_conns = s_tmp.connected_clients
>         else
>           max_conns_ndx = 0
>         end

 

 

(2)MySQL-Proxy工作流程(如图附件proxy_main.jpg所示):

#连接池连接规则的创建在rw-splitting.lua中完成。
第一步:
按照backend服务器设置的顺序(通常是主服务器+从服务器若干台),当client发起连接时,
就先在没有满足最低空闲连接数的服务器上创建一个连接。

第二步:
当此次查询是读操作时,根据balance.lua中的idle_ro()逻辑选择从连接池中拿从服务器的连接。
从服务器选择函数idle_ro()的逻辑是选择当前为连接状态最少的服务器进行连接的(前提是当前连接池中有从服务器的连接)

第三步:
最后还没有拿到连接时,从连接池中拿主服务器的连接。

 

分享到:
评论

相关推荐

    MySQL Proxy 实现负载均衡测试

    MySQL Proxy 实现负载均衡测试 MySQL Proxy 实现负载均衡测试

    mysql-proxy安装与配置

    它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。  MySQL Proxy就是这么一个中间层代理 二、mysql-proxy安装 yum直接安装 [root@okingt ~]# yum install mysql-proxy 安装...

    MySQL读写分离架构与实践--mysql-proxy

    MySQL主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的

    MySQL-Proxy快速实现读写分离以及负载均衡

    MySQL_Proxy快速实现读写分离以及负载均衡

    分布式数据库Proxy解决方案(mysql负载均衡)

    分布式数据库Proxy解决方案(mysql负载均衡方案)

    Docker搭建MySQLl基于ShardingSphere-Proxy读写分离(docker-compose)

    docker_compose搭建shardingSphereProxyMysql主从读写分离

    amoeba-mysql-1.0.2-BETA.zip_SQL 高并发_mysql-proxy java_代理_分布式java_

    Amoeba属于分布式数据库代理开发框架,专注于分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户 端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请 求...

    mysql-proxy

    主要用于mysql读写分离,减少磁盘io,起到负载均衡的作用

    基于MySQL的数据库中间件SOHU-DBProxy.zip

    它在MySQL官方推出的 MySQL-Proxy 0.8.3版本的基础上, 修改了大量bug,添加了很多功能特性。现在已经在sohu的多个业务线上使用DBProxy 主要功能:1 即使在同一个连接(只要不在同一个事务中)也能连接复用2 负载均衡...

    Atlas:一个高性能稳定的 MySQL 代理

    它在MySQL官方推出MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。主要功能:1....

    MySQL Proxy 快速实现读写分离以及负载均衡

    MySQL Proxy 快速实现读写分离以及负载均衡

    LAMP环境双机负载均衡2009.09.17修正.doc

    LAMP环境双机LVS负载均衡 准备: 两台服务器: BBS1 192.168.0.109 BBS2 192.168.0.93 LVS虚拟IP 192.168.0.90 下载所需软件: mkdir /home/src;cd /home/src wget ...

    mysql 集群部署

    本集群为MySQL异步集群,适用场景为低并发写高并发读的系统应用,采用MySQL复制机制和MySQL Proxy的读写分离以及负载均衡搭建的MySQL异步集群。为了MySQL Proxy服务的高可用性,采用Keepalived实现MySQL Proxy的双机...

    amoeba-mysql-binary-2.2.0.tar.gz

    Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性...

    Ubuntu10下如何搭建MySQL Proxy读写分离探讨

    它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。 (Figure1:MySQL Proxy) MySQL-Proxy, announced in June, is a binary application that sits between your MySQL ...

    Atlas-2.2.1

    它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。 主要功能...

    深入浅出Mysql优化性能提升.txt

    01-MySQL优化大的思路.wmv 02-Awk简洁入门.wmv 03-观察服务器周期性变化.wmv 04-观察MySQL进程状态.wmv 05-列选取原则.wmv ...30-MySQL Proxy完成负载均衡与读写分离.wmv 31-Partition分区.wmv 32-事务讲解.wmv

    MySQL读写分离技术

    阅读目录1、简介2、基本环境3、配置主从复制4、MySQL读写分离配置4.1、安装lua4.2、安装mysql-proxy5、MySQL读写分离测试1)、修改rw-splitting.lua文件2)、修改完成后,启动mysql-proxy3)、创建用于读写分离的...

    Keepalived+HAProxy实现MySQL高可用负载均衡的配置

    由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+haproxy来实现.  keepalived主要功能是实现真实机器的故障隔离及负载均衡器间的失败切换.可在第3,4,5层交换.它通过VRRPv2(Virtual ...

Global site tag (gtag.js) - Google Analytics