waiting in connection_control plugin

waiting in connection_control plugin

𝓓𝓸𝓷 Lv6

一、现象

应用程序连接mysql数据库报错,帐号无法连接, show processlist查看mysql进程, show plugins查看mysql数据的插件

image-20250226145716553

二、原因

connection_control 插件,主要用来控制客户端在登录操作连续失败一定次数后的响应的延迟。那就是当客户端连接数据库连续失败到达一定次数后,服务端会进行一段时间的响应延迟,连续失败尝试的次数越多,响应延迟时间越长。
该插件可有效的防止客户端暴力登录的风险。该插件包含以下两个组件:
CONNECTION_CONTROL:用来控制登录失败的次数及延迟响应时间。
CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS:将登录失败的操作记录至 information

三、connection_control插件介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

[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

配置说明:
plugin-load-add=connection_control.so#插件预加载
connection-control=FORCE_PLUS_PERMANENT#强制打开插件
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT#强制打开插件

以下3个参数均可以利用 set global 的方式在线修改
connection_control_failed_connections_threshold=5
#允许帐户进行的连续失败尝试的次数。默认为3,表示当连接失败3次后启用连接控制,0表示不开启

connection_control_max_connection_delay=2147483647
#超出阈值的连接失败的最大延迟(以毫秒为单位),默认 2147483647 毫秒,约25天

connection_control_min_connection_delay=1500
#超过阈值的连接失败的最小延迟(以毫秒为单位),默认 1000 毫秒,即 1 秒

show plugins;
show variables like "connection_control%";

查看失败记录
SELECT * FROM information_schema.CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS;
正常情况下,输错密码是即刻返回错误的,当连续失败次数达到阈值后,再次进行连接尝试,则会延迟响应,具体表现就是一直卡着,到延迟结束后才返回错误。information_schema 系统库中的表会记录登录失败的用户名及失败次数,当延迟发生时,从 processlist 中也可以查到正在延迟的
连接。若输入密码正确,则会取消延迟、重新计数。

尝试3次错误输入密码后,在第4次登录时会delay 1秒(由connection_control_min_connection_delay指定),同时Connection_control_delay_generated计数+1(若登录密码继续输入错误,则delay秒数与计数器继续增加。直到成功登录为止之后,此时
delay清零,但计数器不清零。需要注意的是,即使后续密码正确,依然要先延迟一定的秒数,才会进入账号校验流程)

这里注意的是delay的值并不是说每次都是1500毫秒,而是以(当前失败总次数-失败阈值)*1500,所以假如当前设定为上,当我失败登陆第6次时,我的等待时间不是1.5秒而是3秒,还有就是想不让尝试登陆超过一次,可以把阈值改为0。

四、解决方法

1
2
3
4
5
6
7
8
9
10
11
12
13
1.使用kill杀掉连接的id,应用会一直连接,这种方法不行
select ID from information_schema.PROCESSLIST where Command='Connect' and STATE='Waiting in connection_control plugin';

select * from information_schema.processlist where state='waiting in connection_control plugin";
select * from information_schema.PROCESSLIST where USER='mpi';

2.排查应用连接的账号密码,更改正确,然后重启数据库,重启应用
重启服务,重启服务后会刷新CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS表下账号的对应失败登录错误次数

命令修改参数:
SET GLOBAL connection_control.failed_login_threshold = 100;

3.将插件取消使用,不建议
  • Title: waiting in connection_control plugin
  • Author: 𝓓𝓸𝓷
  • Created at : 2025-02-26 15:00:09
  • Updated at : 2025-03-04 11:38:30
  • Link: https://www.zhangdong.me/mysql-waiting-in-connection_control-plugin.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
评论