乐趣区

关于mysql:技术分享-MySQL-hostcache

作者:高鹏

DBA,负责我的项目日常问题排查,善于 MySQL。

本文起源:原创投稿

* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


前言

本文章与一次日常运维过程中发现的问题无关。问题如下:

客户生产环境中有一个一主一从半同步的集群,运维共事发现连贯主库的时候很快,然而连贯从库的时候就很慢,故此征询起因;

拿到这个问题的时候感觉景象的确挺怪异,所以就进行了抓包比照。

连贯从库时的抓包后果:

从抓包后果能够看到三步握手后期待了 10 秒才收到 MySQL 给客户端的响应,那么问题呈现在 MySQL 这侧,什么状况下会导致 MySQL 呈现该问题?当咱们比照了主从配置文件后发现从库比主库少了 skip-name-resolve,从库加上重启后问题得以解决。

1. MySQL 反向解析的过程

  1. mysql-client 向 mysqld 发动连贯申请;
  2. mysqld 创立子线程来解决该连贯申请;
  3. 子线程首先去查看主机名是否存在于 performance_schema.host_cache 表中;
  4. 如果是,则进入权限验证阶段;
  5. 如果否,那么会尝试解析将 IP 地址解析为主机名;
  6. 而后再将主机名解析为 IP 地址;
  7. 将解析到的后果和原始 IP 地址进行比拟;
  8. 如果雷同则增加到 host_cache 中而后进行权限验证;
  9. 如果不雷同,那么返回报错

注:只有非本地主机的 TCP 连贯会应用主机缓存;应用网络回环地址或 socket 建设的连贯不会应用主机缓存

2. 主机缓存的作用

  • 通过缓存 IP 到主机名查找的后果,能够防止每次客户端进行连贯时都去寻找 DNS 进行解析,所能缓存条目标数量受 host_cache_size 管制。
  • 缓存中蕴含客户端连贯过程中产生的错误信息。如果同一主机间断屡次连贯谬误,那么将阻止该主机的进一步连贯,该行为受 max_connect_errors 管制。

3. 参数 host_cache_size 与 skip-host-cache 和 skip_name_resolve 的作用

host_cache_size:管制主机缓存的数量,设置为 0 时,禁用主机缓存,每次服务器连贯时,服务器都会进行 DNS 查找,相比 skip-host-cache 来说,host_cache_size 更加灵便,能够随时变更或禁用。

skip-host-cache:作用相似于 host_cache_size,但 mysql 在运行时无奈对该参数进行变更,并且 skip-host-cache 在之后的版本中已弃用。

skip_name_resolve:查看客户端连贯时是否解析主机名,变量为 off,则 mysqld 会在查看客户端连贯时解析主机名。若变量为 on,mysqld 只应用 IP ; 在这种状况下,受权表中的所有列值都必须是 IP 地址。

4. 如何查看 host_cache 表

mysql> select * from performance_schema.host_cache\G
*************************** 1. row ***************************
                                        IP: 10.186.61.21       #连贯到服务器的 IP 地址
                                      HOST: NULL               #客户端 DNS 解析出的主机名,null 代表未知
                            HOST_VALIDATED: YES                #是否执行了 DNS 解析,如果值为 YES 则主机列将用作与 IP 绝对应的主机名,以便能够防止对 DNS 的其余调用;如果值为 NO 则每次连贯尝试都会尝试 DNS 解析,直到最终以无效后果或永恒谬误实现解析
                        SUM_CONNECT_ERRORS: 0                  #被视为“阻塞”的连贯谬误数,仅统计协定握手谬误,并且仅统计 HOST_VALIDATED=YES 的主机
                 COUNT_HOST_BLOCKED_ERRORS: 0                  #以下为各种连贯形式失败的计数
           COUNT_NAMEINFO_TRANSIENT_ERRORS: 0
           COUNT_NAMEINFO_PERMANENT_ERRORS: 1
                       COUNT_FORMAT_ERRORS: 0
           COUNT_ADDRINFO_TRANSIENT_ERRORS: 0
           COUNT_ADDRINFO_PERMANENT_ERRORS: 0
                       COUNT_FCRDNS_ERRORS: 0
                     COUNT_HOST_ACL_ERRORS: 0
               COUNT_NO_AUTH_PLUGIN_ERRORS: 0
                  COUNT_AUTH_PLUGIN_ERRORS: 0
                    COUNT_HANDSHAKE_ERRORS: 0
                   COUNT_PROXY_USER_ERRORS: 0
               COUNT_PROXY_USER_ACL_ERRORS: 0
               COUNT_AUTHENTICATION_ERRORS: 17
                          COUNT_SSL_ERRORS: 0
         COUNT_MAX_USER_CONNECTIONS_ERRORS: 0
COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS: 0
             COUNT_DEFAULT_DATABASE_ERRORS: 0
                 COUNT_INIT_CONNECT_ERRORS: 0
                        COUNT_LOCAL_ERRORS: 0
                      COUNT_UNKNOWN_ERRORS: 0
                                FIRST_SEEN: 2020-12-18 10:30:03 #客户端第一次尝试连贯的工夫戳
                                 LAST_SEEN: 2020-12-18 14:50:41 #客户端看到最新的连贯尝试的工夫戳
                          FIRST_ERROR_SEEN: 2020-12-18 10:30:03 #第一次连贯谬误的工夫戳
                           LAST_ERROR_SEEN: 2020-12-18 14:46:37 #最近一次连贯谬误的工夫戳
1 row in set (0.00 sec)

提醒:执行 flush hosts 能够刷新 host_cache,刷新后会革除内存中的主机缓存

5.host-cache 和 skip_name_resolve 参数对数据库的影响

论断:

论断和设想中一样,当 skip_name_resolve =OFF、host_cache_size=700 时,只有在刚建设连贯进行 DNS 解析和 host_cache 缓存时会影响 mysql 性能,之后再次进行压测时,能够看到性能有少许的晋升。

退出移动版