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

一、背景

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

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

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

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

该状态的连接总数达到338个

mysql> select COUNT(*) from information_schema.PROCESSLIST 
where STATE='Waiting in connection_control plugin';

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

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

二、模拟测试

2.1、安装

该Connection-Control Plugins 插件默认未启用,需要自行安装

mysql> INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
Query OK, 0 rows affected (0.40 sec)

mysql> INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';
Query OK, 0 rows affected (0.01 sec)

确认下SQL插件是否安装

mysql> select PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME like 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME                              | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL                       | ACTIVE        |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE        |
+------------------------------------------+---------------+
2 rows in set (0.00 sec)

2.2、参数释疑

mysql> show variables like connection_control%;
+-------------------------------------------------+------------+
| Variable_name                                   | Value      |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 3          |
| connection_control_max_connection_delay         | 2147483647 |
| connection_control_min_connection_delay         | 1000       |
+-------------------------------------------------+------------+
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清零

#查看到登录失败的次数

mysql> show global status like %conn%control%;
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| Connection_control_delay_generated | 1 |
+------------------------------------+-------+
1 row in set (0.00 sec)

开启多个连接,继续试错下去,此时可以看到进程中

mysql> select * from information_schema.PROCESSLIST where USER='root';
+----+-------------+-----------+------+---------+------+--------------------------------------+------+---------+-----------+---------------+
| ID | USER        | HOST      | DB   | COMMAND | TIME | STATE                                | INFO | TIME_MS | ROWS_SENT | ROWS_EXAMINED |
+----+-------------+-----------+------+---------+------+--------------------------------------+------+---------+-----------+---------------+
| 54 | root | localhost | NULL | Connect |    2 | Waiting in connection_control plugin | NULL |    2485 |         0 |             0 |
| 52 | root | localhost | NULL | Connect |    7 | Waiting in connection_control plugin | NULL |    7038 |         0 |             0 |
| 53 | root | localhost | NULL | Connect |    4 | Waiting in connection_control plugin | NULL |    4591 |         0 |             0 |
+----+-------------+-----------+------+---------+------+--------------------------------------+------+---------+-----------+---------------+
3 rows in set (0.00 sec)

这时,我们就回到了一开始提出的生产环境下遇到的问题。

三、解决生产问题

由于问题连接过多,逐个kill掉显然不太现实

因此,我采用拼接SQL 的方式,批量kill

根据STATE状态为’ Waiting in connection_control plugin’ 从information_schema.PROCESSLIST 表中检索出ID ,再本地文本中拼接出SQL ,再批量kill

mysql> select ID from information_schema.PROCESSLIST where Command='Connect' and STATE='Waiting in connection_control plugin';

检索结果如下

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

再在文件编辑器中,利用查找替换功能,

将 “ |” 替换为 ;一个由MySQL安全插件引发的生产问题

再将 “|” 替换为 “kill”

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

拼接的SQL 效果如下:

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

执行SQL 文件, 连接数告警 消失,问题暂时解决

四、事后分析

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

补充:
卸载MySQL安全插件:Connection-Control Plugins

另外注意查看my.cnf 中 是否也定义了此参数

mysql> UNINSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
mysql> UNINSTALL PLUGIN CONNECTION_CONTROL;

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/7519

(0)
杰斯的头像杰斯
上一篇 2023年3月6日 下午6:10
下一篇 2023年3月7日 下午7:23

相关推荐

  • CentOS图形化界面和命令行界面的转化–超详细(Linux操作系统)

    对于我这样的小白来说,Linux系统的图形化界面更加简单,但是Linux命令行才是精髓,如何进行转化呢? 1、快捷键方式切换(较为简单) 图形化界面转化成命令行界面  ctrl+alt+F3 命令行界面转化为图形化界面 ctrl+alt+F1 2、命令行形式切换切换成命令行模式: systemctl set-default mu…

    2023年12月13日
    54800
  • 二进制部署Mysql8.0.31

    二进制部署Mysql8.0.31 一、软件包下载 企业版:Enterprise , 互联网行业一般不选择. 社区版本:选择 源码包 编译安装: source code .tar.gz 通用二进制 公司用什么版本数据库? 具体什么小版本号? 5.6.20 5.6.34 5.6.36 5.6.38 5.6.40 5.7.18 5.7.20 5.7.22 5.7.…

    2023年1月20日
    60000
  • ubuntu20.04 删除linux中软raid的方法

    取消软件 RAID 可能涉及到几个步骤,具体取决于你的操作系统和使用的软件。在大多数 Linux 系统中,mdadm 是用于管理软件 RAID 的常见工具。以下是在 Linux 中取消软件 RAID 的一般步骤: 请注意:在执行这些步骤之前,请确保你已经备份了所有重要数据,因为取消 RAID 可能会导致数据丢失。 查看当前 RAID 状态: 使用以下命令查看…

    2023年11月24日
    68300
  • Linux 从 lsof 开始,深入理解 Linux 虚拟文件系统!

    背景 有时会出现这样的情况,磁盘空间显示已经被占满,但是在查看磁盘的具体文件占用情况时,发现磁盘仍然有很大的空余空间。 1. 执行df命令查看磁盘使用情况,发现磁盘已经满了。 2. 执行du命令查看各个目录的磁盘占用情况,把各个目录文件的大小相加,发现并没有占满磁盘,有10多G空间莫名失踪。 3. 为何会出现这样的情况呢? 因为虽然文件已被删除,但是一些进程…

    2024年2月20日
    74700
  • Ubuntu创建和删除用户

    Ubuntu与其他Linux发行版一样,是一个多用户操作系统。每个用户可以具有不同的权限级别和各种命令和GUI应用程序的特定设置。 了解如何添加和删除用户是Linux用户应该了解的基本技能之一。为能够创建和删除用户,您需要以root或具有sudo权限的用户登录。 在Ubuntu中添加用户方式有两种,第一种是使用adduser或者useradd命令。第二种通过…

    2023年3月10日
    55100

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信