一个由MySQL安全插件引发的生产题目

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

一、背景

生产环境下遇到一个题目,有数据库节点的连接数略高,触发了连接数告警。登录上检察后,发现实际业务压力不大。检察processlist发现有大量状态为“Waiting in connection_control plugin”的等候连接。


  1. mysql> select ID,HOST,DB,COMMAND,TIME,STATE,INFO from information_schema.PROCESSLIST where STATE='Waiting in connection_control plugin';
复制代码


该状态的连接总数达到338个
  1. mysql> select COUNT(*) from information_schema.PROCESSLIST  where STATE='Waiting in connection_control plugin';
复制代码


应该是Connection-Control Plugins起作用了,先在测试环境模仿一下。
二、模仿测试

2.1、安装

该 Connection-Control Plugins 插件默认未启用,需要自行安装
  1. mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
  2. Query OK, 0 rows affected (0.40 sec)
  3. mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
  4. Query OK, 0 rows affected (0.01 sec)
复制代码
确认下SQL插件是否安装
  1. mysql> select PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME like 'connection%';
  2. +------------------------------------------+---------------+
  3. | PLUGIN_NAME                              | PLUGIN_STATUS |
  4. +------------------------------------------+---------------+
  5. | CONNECTION_CONTROL                       | ACTIVE        |
  6. | CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE        |
  7. +------------------------------------------+---------------+
  8. 2 rows in set (0.00 sec)
复制代码
2.2、参数释疑
  1. mysql> show variables like "connection_control%";
  2. +-------------------------------------------------+------------+
  3. | Variable_name                                   | Value      |
  4. +-------------------------------------------------+------------+
  5. | connection_control_failed_connections_threshold | 3          |
  6. | connection_control_max_connection_delay         | 2147483647 |
  7. | connection_control_min_connection_delay         | 1000       |
  8. +-------------------------------------------------+------------+
  9. 3 rows in set (0.00 sec)
复制代码
参数含义:


  • connection_control_failed_connections_threshold:单个用户登录失败(由于密码错误引起)次数上限,默认3次
  • connection_control_max_connection_delay:失败上限之后再次实验登录前最大等候时间,单位ms
  • connection_control_min_connection_delay:失败上限之后再次实验登录前最小等候时间,单位ms
上述3个参数均可以利用 set global 的方式在线修改。
2.3、实验

实验3次错误输入密码后,在第4次登录时会delay 1秒(由connection_control_min_connection_delay指定),同时Connection_control_delay_generated计数+1(若登录密码继续输入错误,则delay秒数与计数器继续增加。直到成功登录为止之后,此时delay清零
   检察到登录失败的次数
  1. mysql> show global status like "%conn%control%";
  2. +------------------------------------+-------+
  3. | Variable_name                      | Value |
  4. +------------------------------------+-------+
  5. | Connection_control_delay_generated | 1 |
  6. +------------------------------------+-------+
  7. 1 row in set (0.00 sec)
复制代码
开启多个连接,继续试错下去,此时可以看到进程中
  1. mysql> select * from information_schema.PROCESSLIST where USER='root';
  2. +----+-------------+-----------+------+---------+------+--------------------------------------+------+---------+-----------+---------------+
  3. | ID | USER        | HOST      | DB   | COMMAND | TIME | STATE                                | INFO | TIME_MS | ROWS_SENT | ROWS_EXAMINED |
  4. +----+-------------+-----------+------+---------+------+--------------------------------------+------+---------+-----------+---------------+
  5. | 54 | root | localhost | NULL | Connect |    2 | Waiting in connection_control plugin | NULL |    2485 |         0 |             0 |
  6. | 52 | root | localhost | NULL | Connect |    7 | Waiting in connection_control plugin | NULL |    7038 |         0 |             0 |
  7. | 53 | root | localhost | NULL | Connect |    4 | Waiting in connection_control plugin | NULL |    4591 |         0 |             0 |
  8. +----+-------------+-----------+------+---------+------+--------------------------------------+------+---------+-----------+---------------+
  9. 3 rows in set (0.00 sec)
复制代码
这时,我们就回到了一开始提出的生产环境下遇到的题目。
三、解决生产题目

由于题目连接过多,逐个 kill掉显然不太现实
因此,我接纳拼接SQL 的方式,批量 kill
根据STATE状态为Waiting in connection_control plugin' 从information_schema.PROCESSLIST表中检索出 ID ,再本地文本中拼接出SQL ,再批量 kill
  1. mysql> select ID from information_schema.PROCESSLIST where Command='Connect' and STATE='Waiting in connection_control plugin';
复制代码
检索效果如下


再在文件编辑器中,利用查找替换功能,
将 “ |” 替换为 ";"


再将 “|” 替换为 “kill”


拼接的SQL 效果如下:


执行SQL 文件, 连接数告警 消失,题目临时解决
四、事后分析

后续排查确认是zabbix agent 的一个监控脚本 ,数据库地址 配置的题目,导致存在这样的现象,Waiting in connection_control plugin
补充:


  • 卸载MySQL安全插件:Connection-Control Plugins
  • 注意检察my.cnf 中 是否也界说了此参数
  1. mysql> UNINSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
  2. mysql> UNINSTALL PLUGIN CONNECTION_CONTROL;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表