max_connect_errors 不检查 Aborted_connects 吗?

Nik*_*ita 5 mysql

在 MySQL (5.5) 中,哪个状态变量反映max_connect_errors了服务器比较的当前连接错误数?我以为是,Aborted_connects但在我的测试中,我仍然可以在驱动 aborted_connects(连续)远远高于max_connect_errors...

换个方式问,mysql 服务器是否检查aborted_connects任何阈值变量?是否有任何行为取决于该状态变量的值(或者仅供 DBA 参考)?

编辑 1

澄清一下,我对如何到达不太感兴趣max_connect_errors,而对高是否aborted_connects会产生任何负面影响更感兴趣。

对于上下文: 我们使用第 4 层 (TCP) 负载平衡器在 MySQL 只读从服务器集群中分发应用程序服务器的数据库连接池的 JDBC 连接。负载均衡器 (AWS ELB) 具有基于 TCP 的健康检查功能 - 它通过与数据库服务器的 mysql 端口建立 TCP 连接来定期检查数据库服务器的健康状况。由于 LB 不会说 'JDBC',所以实际上它所做的只是创建一个 TCP 连接并立即断开连接。但是,这些连接中的每一个都aborted_connects在 mysqld 上增加。我看没有其他副作用,但是想知道跑起来aborted_connects最终会不会有负面影响(比如mysqld会禁止LB的IP,从而导致健康检查失败)

谢谢你 -nikita

Der*_*ney 8

max_connect_errors是基于每个主机的,所以我怀疑它是否会检查状态变量,例如Aborted_connects.

如果您使用“localhost”(不使用 TCP)进行测试,则此变量可能不适用,如果将 localhost 锁定会发生什么情况?没有人可以连接(假设只有一个 root 用户并且无法远程登录 root)!

所以我想深入研究这个来源。在文件 'sql/hostname.cc' 中是一个函数ip_to_hostname。这个函数有以下注释(强调我的):

将 IP 地址解析为主机名。

该函数执行以下操作: - 解析 IP 地址;- 采用正向确认反向 DNS 技术来验证 IP 地址;- 如果 IP 地址被验证,则返回主机名;- 将值设置为 out-variable connect_errors -- 此变量表示来自指定 IP 地址的连接错误数。

注意:connect_errors 仅针对可以解析 IP 地址且通过 FCrDNS 检查的客户端进行计数(支持)。

关于本地主机(或像 127.0.0.1 这样的环回 ip)也有这样的评论:

*connect_errors= 0; /* Do not count connect errors from localhost. */
Run Code Online (Sandbox Code Playgroud)

此外,connect_errors 增加的唯一时间是在同一 sql/hostname.cc 文件的函数“inc_host_errors”中。这仅从 sql/sql_acl.cc 文件中调用。看起来这些是一些情况:

1) 数据包有错误(数据包长度不匹配)。这也可能是文档说的原因:

如果您收到给定主机的 Host 'host_name' is blocks 错误消息,您应该首先验证来自该主机的 TCP/IP 连接没有任何问题。如果您遇到网络问题,增加 max_connect_errors 变量的值对您没有好处。

2) 本机密码无效(功能为native_password_authenticate

3) 旧式密码无效(功能是old_password_authenticate

我可能错过了一些事情,但最终max_connect_errors与中止的连接无关,而是网络问题或无效密码。


为了完成起见,我会提到我正在查看 Percona 5.5.15-rel21 源代码。


那么,Aborted_connects与它有什么关系呢?好吧,根据这个文档,它会随时增加:

  • 客户端没有连接到数据库的权限。

  • 客户端使用了错误的密码。

  • 连接数据包不包含正确的信息。

  • 获取连接数据包需要多于 connect_timeout 秒。

因此,Aborted_connects这只是 DBA 知道可能存在问题的一个指标(例如:如果它在一段时间内急剧增加,则有人可能试图入侵服务器,但max_connect_errors在这种情况下您应该受到保护)。

如果您的健康检查稳步增加,如果它异常飙升,您仍然可以使用它。