(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()的逻辑是选择当前为连接状态最少的服务器进行连接的(前提是当前连接池中有从服务器的连接)
第三步:
最后还没有拿到连接时,从连接池中拿主服务器的连接。
分享到:
相关推荐
6. **调试与测试**:在开发和测试环境中,MySQL Proxy 可以方便地模拟各种故障情况,帮助开发者测试应用程序的容错能力。 `mysql-proxy-0.8.5` 版本可能包含以下文件: - `mysql-proxy.exe`:MySQL Proxy 的可执行...
MySQL Proxy 是一个开源工具,它允许用户在 MySQL 客户端和服务器之间插入一个代理层,从而实现诸如负载均衡、故障切换、读写分离等高级功能。以下是对MySQL Proxy安装配置及其相关知识点的详细说明: 1. **安装...
MySQL Proxy 是一个开源工具,它允许你在 MySQL 客户端和服务器之间设置一个代理层,以便实现诸如负载均衡、故障切换、读写分离等高级功能。在这个场景中,我们将讨论如何配置 MySQL Proxy 来实现读写分离,以提高...
./mysql-proxy --proxy-read-only-backend-addresses=192.168.1.140:3306 --proxy-backend-addresses=192.168.1.14:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --...
MySQL Proxy是一款轻量级的中间件,它允许你在MySQL服务器和客户端之间插入一个代理层,以便进行监控、负载均衡、故障切换等操作。在安装MySQL Proxy之前,我们需要确保系统上安装了必要的工具和依赖,以确保顺利...
`sysbench`是一个多线程的数据库压力测试工具,它可以模拟多种数据库工作负载,帮助我们理解MySQL Proxy在实际环境中的表现。 总的来说,MySQL Proxy提供了一种简单而灵活的方式,通过在客户端和数据库服务器之间...
- 测试环境充分测试,避免生产环境中出现未预期的问题。 - 监控 Sharding-Proxy 的运行状态,包括CPU使用率、内存占用、网络IO等,及时调整配置或优化。 通过以上步骤,我们可以有效地利用 Sharding-Proxy 在 MySQL...
它使用灵活,没有限制,常见的用途包括:负载平衡,故障、查询分析,查询过滤和修改等等。 MySQL Proxy就是这么一个中间层代理 二、mysql-proxy安装 yum直接安装 [root@okingt ~]# yum install mysql-proxy 安装...
MySQL Proxy是一个轻量级的代理软件,它可以用来在MySQL服务器之间提供透明的负载均衡和故障切换。安装`mysql-proxy`,例如这里的`mysql-proxy-0.8.5-linux-el6-x86-64bit`,解压后按照官方文档进行配置和启动。 在...
MySQL Proxy是一款轻量级的中间件,它能够监控、分析或修改在客户端和MySQL服务器之间传输的数据流。通过这个代理,你可以实现负载均衡、故障切换、SQL审计、性能监控等功能,对数据库进行更精细的管理。MySQL Proxy...
MySQL数据库在大型应用中面临的一个常见挑战是读写操作的负载均衡问题。为了解决这个问题,MySQL提供了一个名为`mysql-proxy`的工具,这正是"MYSQL数据库读写分离mysql-proxy 32bit包"的主题。MySQL Proxy是一个轻量...
MySQL Proxy是MySQL官方提供的一款开源工具,用于在MySQL服务器和客户端之间设置一个代理层,它允许用户在数据流中插入自定义的脚本或者插件,以实现诸如负载均衡、故障切换、数据过滤等高级功能。`mysql-proxy-...
### MySQL Proxy 快速实现读写分离以及负载均衡 #### 一、概述 在数据库管理领域,MySQL Proxy 是一个开源的代理服务器,它为 MySQL 提供了一层中间件,能够帮助用户实现数据库的读写分离、负载均衡等功能,进而...
MySQL Proxy 是一个开源工具,主要用于实现数据库的读写分离,以优化MySQL服务器的负载。在本文中,我们将探讨如何利用MySQL Proxy实现一个简单的读写分离环境,并关注在配置过程中的一些关键点。 首先,读写分离是...
2. **插件式架构**:通过 Lua 脚本,MySQL Proxy 允许用户在数据流经代理时执行自定义操作,比如记录查询日志、分析性能、执行复杂的数据转换等。 3. **动态配置**:代理可以在运行时重新加载 Lua 脚本,这意味着...
"方法.txt"可能包含了搭建测试环境和执行对比的具体步骤,如安装配置proxy和Mycat,设置MySQL主从复制,编写测试脚本,以及收集和分析性能数据等。"测试主从对比.docx"很可能是测试报告,详细记录了测试过程和结果,...
MySQL数据库在处理大规模数据时,可能会遇到性能瓶颈,特别是在数据分片或分区后,进行主键查询时,问题更为突出。"MySQL数据库分表批量主键查询代理-mysql-partitions-proxy"项目就是为了应对这一挑战而设计的。这...
MySQL主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的