暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL连接控制插件相关了解


点击标题下「蓝色微信名」可快速关注

技术社群的这篇文章《MySQL 连接控制插件的异常处理及正确使用方法》给我们讲解了MySQL连接控制插件的相关情况,这个确实之前了解的比较少,学习一下。


引言

MySQL 从 5.7.17 版本开始,提供连接控制插件 Connection Control Plugins[1]。该插件可以在用户连续尝试失败后,增加服务器响应延迟,有效防止暴力破解攻击。‌

Connection Control Plugins

若使用不当,可能会导致以下问题:

  • 连接数积压。例如,当监控系统使用不存在的用户频繁访问数据库时,失败连接尝试会占用连接资源。
  • 数据库挂起。由于插件延迟机制的存在,无效连接无法快速释放,最终可能导致触发 too many connections 错误。

1. 问题背景及原因

1.1 场景描述

客户环境数据库在启用连接控制插件的情况下,监控系统使用了 igcam 不存在的用户进行数据库访问,该行为会导致 Connect 状态的连接大量积压,很快达到 max_connections
 上限,最终引起 too many connections 报错。

1.2 问题原因

当 Connection Control Plugins 启用时,插件会记录失败的连接尝试次数。在达到 connection_control_failed_connections_threshold
(默认为 3)后,插件会延迟创建新的连接。即使用户被删除,插件仍会记录失败尝试并延迟响应,进一步占用连接资源。

2. 复现场景及测试方法

2.1 安装连接控制插件

需要安装的插件分为 2 个部分:

  • Connection_control:负责检查连接次数并增加响应延时。
  • Connection_control_failed_login_attempts:记录失败登录尝试的详细信息。

执行下列命令安装连接控制插件:

INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';

通过 INFORMATION_SCHEMA.PLUGINS
 检查插件是否安装成功,PLUGIN_STATUS
 为 ACTIVE 表示插件安装成功。

SELECT PLUGIN_NAME, PLUGIN_STATUS from INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'connection%';

2.2 参数配置

插件的关键参数包括:

  • connection_control_failed_connections_threshold:定义允许的连续失败连接次数。超过该阈值后,后续连接尝试将被延迟。默认值为3,表示当连接失败3次后启用连接控制,0 表示不开启。
  • connection_control_min_connection_delay:最小响应延迟时间,单位是毫秒。默认 1000 毫秒,即 1 秒。
  • connection_control_max_connection_delay:最大响应延迟时间,单位是毫秒。默认 2147483647 毫秒,约 24 天。

示例配置:

SET GLOBAL connection_control_failed_connections_threshold = 3;
SET GLOBAL connection_control_min_connection_delay = 1000;

-- 设置为 1 小时
SET GLOBAL connection_control_max_connection_delay = 3600000;  

2.3 效果测试

创建测试用户 monitor 并删除。

-- 1.新建测试用户
CREATEUSER monitor@'127.0.0.1'IDENTIFIEDBY'monitor';
GRANT PROCESS,REPLICATIONCLIENT,SELECTON *.* TO'monitor'@'127.0.0.1';

-- 2.使用测试用户连接数据库,确认可以正常访问
SELECTcurrent_user();

-- 3.删除用户
DROPUSER monitor@'127.0.0.1';

调整 max_connections
 为 5,以模拟连接数满的场景。

SET GLOBAL max_connections=5;

并发连接测试。使用多个客户端同时尝试以 monitor 用户连接数据库,观察连接延迟现象。

while true
do
 time mysql -umonitor -p'monitor' -h127.0.0.1 -P3306 2>/dev/null
done

验证测试结果。在使用正常账号访问数据库时,返回结果显示已达到最大连接数限制。

从 show processlist
 结果中可以看到 monitor 无效用户占用着连接,且 monitor 用户身份验证处于 waiting in connection_control plugin 的连接延迟状态。

2.4 延迟机制分析

通过以上测试发现,使用错误的账号访问数据库时,前三次连接失败后立即断开,第四次及后续连接开始出现延迟,且每次登录失败延迟会增加 1 秒钟时间。


以下信息如果为非零值,表示有某个客户端触发了延迟控制:

  • 查看 connection_control_delay_generated
     状态变量信息,该变量记录了连接失败尝试增加响应延迟的次数。

  • 查看 information_schema.connection_control_failed_login_attempts
    ,该表提供了每个帐号当前连续失败的连接尝试次数的信息。

2.5 插件中定义的延迟计算公式

delay_time = min_delay * (current_count + 1 - threshold)

其中:

  • min_delayb:最小延迟时间,默认为 1000 毫秒。
  • current_count:当前失败连接次数。
  • threshold:失败连接次数阈值,默认为 3。

当前失败次数 current_count
 超过阈值 threshold
,或计数器异常(current_count < 0
),则触发延迟,且延迟时间随失败次数增加而递增。

2.6 计数器更新逻辑

在成功连接数据库后,计数器会重置为 0。此前因失败触发的延迟机制将不再影响此客户端,但失败连接尝试的延迟机制仍然生效,直到其再次达到阈值。

3. 总结及处理方法

3.1 问题总结

开启连接控制插件后,失败连接尝试会触发延迟机制,可能导致以下问题:

  • 连接数积压,达到 max_connections
     上限。
  • 数据库性能下降,影响正常用户连接。
  • 默认配置下,失败连接尝试从第 4 次开始,每次延迟增加 1 秒。

3.2 异常处理

  • 限制最大延迟时间,将 connection_control_max_connection_delay
     设置为较小值(如 1 小时),避免无效连接长期占用资源。

  • 对于监控类的信息采集,限制并发连接数,把监控用户的连接资源做控制。例如:

CREATE USER 'monitor'@'127.0.0.1' WITH  MAX_USER_CONNECTIONS 10;

  • 及时干预异常用户,发现密码被修改的用户或连接异常的用户,及时采取措施。

  • 紧急情况,例如,会话连接数达到最大连接数限制,可以通过以下命令重置计数器并释放连接。

SET GLOBAL connection_control_failed_connections_threshold=0;

参考资料
[1] 

Connection Control Plugins: https://dev.mysql.com/doc/refman/8.0/en/connection-control-installation.html


如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,


近期更新的文章:
FFmpeg的使用场景
长安街地下通道@骑行日记
聚焦民生,TiDB 加速政企数字化转型!6 月 14 日沈阳见!
众志成城,踢出哪吒精神!
MySQL中树状格式的执行计划

热文鉴赏:
揭开"仿宋"和"仿宋_GB2312"的神秘面纱
Linux的"aarch"是多了个"a"?
中国队“自己的”世界杯
你不知道的C罗-Siu庆祝动作
大阪环球影城避坑指南和功略
推荐一篇Oracle RAC Cache Fusion的经典论文
"红警"游戏开源代码带给我们的震撼

文章分类和索引:
公众号1700篇文章分类和索引

文章转载自bisal的个人杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论