OneProxy :: 用中间件的连接池实现MySQL线程池(Thread Pooling)效果

MySQL企业版提供了收费的线程池组件(单队列线程池),可以极大提高万千上万个并发连接情况下MySQL的性能;Percona和MariaDB也有开源版本的线程池(单队列线程池)可以使用;平民软件的OneSQL定制版本则实现了多队列线程池,在复杂应用场景(读写混合热点现象)下可以起到比单队列线程池更好的效果。如果你用的是MySQL官方社区版本,则没有线程池组件可以用,这时可以在OneProxy中间件里实现和线程池同等的效果。

OneProxy维护了自身到后端MySQL数据库之间的连接池,用以保持到数据库后端的长连接,以免PHP等程序频烦地连接和断开数据库,引起不必要的数据库负载。只要能严格限制连接池的最大连接数,就可以起到线程池的作用,可以在OneProxy(请使用5.8.5及以上版本)上开启最大连接数限制,只需要设置如下参数:

proxy-strict-poolmax     = 1

这时就会严格限制OneProxy到数据库的最大连接数,如果没有连接可用,会放入等待队列;某个SQL操作结束要归还连接时会检查等待队列,如果有等待,则唤醒任务。在OneProxy中可以通过管理端口来查看,连接池的最小连接数和最大连接数设置:

mysql> list pool;
+------+-------------------+------+--------+------+---------+---------+------------+
| INDX | ADDRESS           | USER | LENGTH | SIZE | MINIDLE | MAXIDLE | REQUESTS   |
+------+-------------------+------+--------+------+---------+---------+------------+
|    1 | 127.0.0.1:3308    | test |      0 |    0 |      10 |     200 |          0 |
|    2 | 172.30.12.6:3316  | test |      6 |    6 |      10 |     200 |        224 |
|    3 | 172.30.12.2:3866  | test |      5 |    5 |      10 |     200 |        224 |
|    4 | 172.30.12.4:3316  | test |      5 |    5 |      10 |     200 |        224 |
|    5 | 172.30.12.5:3306  | test |      6 |    6 |      10 |     200 |        224 |
|    6 | 172.30.12.7:3766  | test |      6 |    6 |      10 |     200 |        224 |
|    7 | 172.30.12.8:3866  | test |      5 |    5 |      10 |     200 |        224 |
|    8 | 172.30.12.9:3966  | test |      0 |  117 |      10 |      90 | 2885557416 |
|    9 | 172.30.12.10:3866 | test |      5 |    5 |      10 |     200 |        224 |
+------+-------------------+------+--------+------+---------+---------+------------+
9 rows in set (0.00 sec)

默认的最小连接数为10,默认的最大连接数为200,由于默认情况下不限制连接上限,因此200的设置并不生效,除非指定了“proxy-strict-poolmax”参数。可以通过“set poolmax <indx> num”来动态调整最大连接数的设置。例如:

mysql> set poolmax 8 90;
Query OK, 0 rows affected (0.00 sec)

在起用最大连接数限制后,可以使用压测工具进行高并发场景的测试,例如:

[root@localhost]# ./mydbtest_linux64.bin query=test1.cnf degree=900
Summary: SQL01 exec=75561210, rows=75561210=100/e, avg=3575 us
Summary: exec=250202/s, qtps=250202/s

虽然压测工具开启了900个并发,但后端数据库中只有约90个连接不停地进行工作,可以保证数据库的高效运行,900多个并发请求在OneProxy进行合理排队,充分利用90个后端数据库连接的能力,让数据库保持高性能运转。

如果正在使用MySQL标准版本,并面临较高的并发压力,又不想用其他分支或OneSQL,则可以考虑使用OneProxy来做线程池,平民软件可为你做质量担保,并可提供技术服务。