这是我当前的测试设置:
- SQL0:192.168.22.64(主+从)
- SQL1:192.168.22.65 (主+从)
- 负载均衡器0:192.168.22.66
- 负载均衡器1:192.168.22.67
- 虚拟 IP:192.168.22.80
负载均衡器使用心跳相互连接,并且都运行 MySQL-Proxy。
一切运行正常;其中一个 SQL 服务器死机,其他一切正常运行。其中一个 LB 死机,其他一切正常运行。
但是,当检查正在使用哪个 SQL 服务器时,我注意到它总是相同的,除非那个服务器不可用。
例如,几个小时后,SQL1 有 600,000 个查询,而 SQL0 有 20,000 个查询。
有没有办法使其更加平衡,使其接近~50% SQL0 和~50% SQL1?
这是我启动代理的基本行:
/usr/bin/mysql-proxy --proxy-skip-profiling -b 0.sql.domain.com:3306 -b 1.sql.domain.com:3306 --keepalive -P :3306
为了证明这一点,从昨天下午开始,这里每 10 分钟进行一次试运行。
答案1
MySQL 代理是基于连接的。您在问题中提到了查询,以此为例,如果您有一个打开一个连接并通过它执行 100,000 个查询的框,它们都将转到同一个后端服务器。您可以通过查看源代码来验证这一点:
mysql-proxy-0.8.2/src/network-conn-pool.c:
182 GQueue *conns = network_connection_pool_get_conns(pool, username, NULL);
183
184 /**
185 * if we know this use, return a authed connection
186 */
187 if (conns) {
188 entry = g_queue_pop_head(conns);
它只是从池中获取下一个连接。如果您查看正在使用的 ODBC 的 TCP 连接数,它们应该是 50/50。
您可以考虑增加应用程序 ODBC 配置中的数据库连接数,希望以此方式分散查询负载。