OneSQL :: 预留10个连接给root用户,让运维人员随时都可以登录处理紧急情况!

在高并发的互联网应用或传统行业的“互联网+”应用中,数据库都是十分重要的,也是压力的集中点,当业务量因促销而数倍增长(或其他原因)时,很容易将数据库连接打满,导致DBA无法登录进行及时处理,只有通过停掉部份应用程序释放连接才行。在个人的工作经验中,还使用screen工具在后台开几个窗口,预先以root用户登录好,留作备用;但也遇到过screen工具本身的原因导致这些窗口丢失而干瞪眼,重新回去杀掉几个应用的情况。最好的办法是能控制应用的连接数,以便任何时侯管理员都能及时登录。

在Oracle/MySQL中都有参数来控制最大允许的连接数,如果超出则不允许新的连接进入。MySQL数据库会报以下错误:

ERROR 1040 (08004): Too many connections

Oracle的报错信息也非常类似,在分析MySQL源代码后,发现只需要少量代码即可以实现如下逻辑:如果登录的用户为root,则以配置的最大连接数为上限;如果登录的用户不是root,则以配置的最大连接数减去10个为上限;只要应用不以root用户连接,即可以保证root用户可以随时登录。在OneSQL 5.6.31版本中,已经实现此逻辑,数据库的当前最大连接数配置如下:

mysql> show variables like 'max_connection%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 100   |
+-----------------+-------+
1 row in set (0.00 sec)

当我们以200个并发启动性能压测工具(压测时间为3分钟),启动命令如下所示:

 ./mydbtest_linux64.bin query=test.sql degree=200
Summary: SQL02 exec=1266140, rows=1266140=100/e, avg=12222 us
Summary: exec=6956/s, qtps=6956/s

在压测过程中,偿试用“test”用户登录时,就会报无法登录的错误,如下所示:

[root@rh4srv1 ~]# mysql -u test -ptest
ERROR 1040 (08004): Too many connections

而使用root用户则可以顺利登录。通过查看状态变量,可以看到当前有多少个连接:

mysql> show status like 'thread_%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 5     |
| Threads_connected | 90    |
| Threads_created   | 470   |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)

可以看到总共连接了90个,即预留了10个给root用户专享,也可以用来保证一些后台任务(比如查杀长时间锁等待会话)可以顺利运行,实现的代码只有5行。据说有人给Oracle官方提过Bug,但一直没有被合并!