一、背景

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

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

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

二、测试

2.1、安装

该插件默认未启用,需要自行安装

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> show plugins; 或

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:失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)

上述3个参数均可以利用 set global 的方式在线修改。

2.3、配置文件固化

例:禁止在MySQL运行过程中卸载,配置方法如下:

[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
connection_control_failed_connections_threshold=5
connection_control_max_connection_delay=2147483647
connection_control_min_connection_delay=1500

2.4、实验

尝试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.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
+-------------------+-----------------+
| USERHOST          | FAILED_ATTEMPTS |
+-------------------+-----------------+
| 'select_user'@'%' |              1 |
+-------------------+-----------------+
1 row in set (0.01 sec)

此外,可以通过如下SQL查看受限用户清单,包括来源用户、IP和登录失败次数

select * from connection_control_failed_login_attempts;

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

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

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

三、处理过程

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

3.1、使用pt-kill工具

pt-kill --user=dba --ask-pass --socket=/tmp/mysql.sock --no-version-check --match-command Connect --match-state "Waiting in connection_control plugin" --victims all --interval 10 --print --kill

3.2、批量拼接 kill 语句

不方便安装pt工具的可以从如下表中检索ID信息

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

检索结果如下

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

(1)将 “ |” 替换为 ";"

(2)将 “|” 替换为 “kill”

执行拼接出来的kill语句后,问题暂时消失。

后续排查确认是zabbix监控账户密码配置出错导致。由于每分钟会进行探测,导致delay时间越来越大。

修改zabbix配置文件:/etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf 的密码设置(如有调用脚本,同步修改)

UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/etc/zabbix /usr/bin/mysql -N'UserParameter=mysql.ping,/usr/bin/mysqladmin  -uzabbix -p'XXXXXX' ping | grep -c alive
UserParameter=mysql.version,/usr/bin/mysql  -V
UserParameter=mysql_connection,/usr/bin/mysql  -uzabbix -p'XXXXXX' -e "show status like '%Threads_connected%';" 2>/dev/null | grep -v '|' | awk '{print $2}'| tail -n 1
UserParameter=mysqlnodenumber[*],/bin/bash  /etc/zabbix/scripts/mysql.sh $1

问题得以解决。

四、拓展问题

4.1、问题1

Connect状态的连接也会占用连接数。此类连接若大量积压,会很快达到max_connections的上限,最终引起too many connections的故障。

解决办法:

后台跑pt-kill,定期kill

pt-kill --victims=all --kill --match-command Connect --match-state "Waiting in connection_control plugin" --interval=120 u=dba,S=/tmp/mysql.sock --ask-pass --daemonize

4.2、问题2

如何避免root账号由于密码输入错误次数过多,导致延迟过久,无法马上登录的问题。

改善办法:

1、root账号授权时限定本地登录。最大限度避免远程恶意登录,快速推高connection_control插件的delay值,导致类似root@'%'账号受限的问题。

2、root账号禁止用于定期执行的脚本中。

3、手残党,密码都打不对,就不说了。

4.3、卸载

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

去除my.cnf文件中相关配置,防止启动报错。

参考文档

MySQL 5.7 Reference Manual: 6.4.2.1 Connection-Control Plugin Installation

关于MySQL非法连接尝试的解决方法(会话控制插件CONNECTION_CONTROL)

non-bug #89155 Connection-control exhausts all max_connection resources

pt-kill 用法记录

MySQL安全插件:Connection-Control Plugins 的利与弊相关推荐

  1. MySQL 插件分析 Connection control

    本文基于mysql 8.0.13. 插件介绍 MySQL 5.6.35 开始提供Connnection Control 插件: 如果客户端在连续失败登陆一定次数后,那么此插件可以给客户端后续登陆行为的 ...

  2. mysql 安装插件 validate_password

    在做等保的时候,数据库存在一个高风险漏洞,需要修改 二.MySQL数据库 1.无鉴别信息复杂度校验机制(高风险)建议数据库所在数据库鉴别信息复杂度策略设置为: validate_password_le ...

  3. 技术分享 | 一款功能全面的 MySQL Shell 插件

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  4. mysql 审计插件_MySQL审计插件使用

    下载MySQL审计插件 https://github.com/mcafee/mysql-audit/releases or 本文使用mcafee官网下载链接的软件: https://dl.bintra ...

  5. 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins)

    使用 jQuery UI Widget Factory 编写有状态的插件(Stateful Plugins) 使用 jQuery UI Widget Factory 编写有状态的插件(Stateful ...

  6. MySQL HandlerSocket插件 资料

    2019独角兽企业重金招聘Python工程师标准>>> HandlerSocket的优势和缺陷阐述 下一站:HandlerSocket! MySQL HandlerSocket 插件 ...

  7. mysql审计插件安装_MySQL审计插件安装使用说明文档--升级版

    目的 基于之前设计开发的MySQL审计插件,以及<MySQL审计插件安装使用说明文档>的内容介绍,对完善后的mysql审计插件进行补充和说明.主要对新增内容进行详细说明,进一步完善审计插件 ...

  8. Mysql的插件下载流程

    Mysql的插件下载流程 转载地址:https://www.cnblogs.com/it-mh/p/11205866.html 官网地址:官网地址:http://dev.mysql.com/downl ...

  9. ChatGPT 插件(ChatGPT plugins)

    献给英语不好的小白们 我们已经在ChatGPT中实现了插件的初始支持.插件是专门为语言模型设计的工具,具有安全性作为核心原则,帮助ChatGPT获取最新的信息,运行计算或使用第三方服务. 前言 为了符 ...

最新文章

  1. 数字化为小零售商带来大商机
  2. 详解log4j2(下) - 按日志级别区分文件输出
  3. [性能测试]:关于MQ协议脚本开发
  4. php开发入门,PHP开发入门教程之面向对象
  5. 数学--数论--四大定理之威尔逊定理
  6. .NET Core 使用 K8S ConfigMap的正确姿势
  7. ae toolbarcontrol运行时没有_想办法让AE跑起来
  8. Android 4.0 NDK Updated
  9. 渗透测试为什么要重基础、重实践?
  10. 数组java8求和_java – 如何使用IntStream对int数组的特定索引号求和?
  11. ads pspice 导入_ADS中使用pspice模型
  12. Java学习笔记:2021年12月31日下午-2022年1月1日上午
  13. Android系统启动流程
  14. 基于SpringBoot+Vue的宠物商场管理系统
  15. 常见的文件名后缀及用法
  16. 使用 Kotlin 中的 takeIf
  17. android 缓存头像,android 实现类似微信缓存和即时更新好友头像
  18. 【PythonPlanet】二手房产成交数据分析
  19. A02-HTML5入门
  20. 计算机音乐说散就散,说散就散(精彩音乐汇)

热门文章

  1. 项目实践——零基础实现手机验证码功能
  2. socket 半双工
  3. Python机器学习基础之Python的基本语法(一)
  4. 云杰恒指:6.11恒指期货早盘思路
  5. 【Protobuf】Protobuf协议
  6. GCC版本升级到指定版本
  7. SAP采购订单创建预付款并删除
  8. linux 汇编 perf,性能分析利器之perf浅析
  9. 探索性数据分析(EDA)为什么在机器学习中至关重要?
  10. java存储单位换算