某一个程序启动速度超级慢,查看日志得知是是在Init DruidDataSource ~ {dataSource-1} inited 这一段耗时最长,这一段是Druid 数据源初始化,进行连接的创建等,使用mysql命令行连接发现连接超级慢,可见是在创建连接的时候导致慢。
原因:
性能开销:由于需要进行 DNS 解析(以及反向解析),连接过程会有一定的延迟,尤其是在 DNS 配置不当或 DNS 服务器响应较慢的情况下。
DNS 不可用时的影响:如果 DNS 服务器不可用或配置有问题,连接 MySQL 服务器时可能会变得非常缓慢,甚至无法连接。
解决方案:
启用
skip-name-resolve
会跳过反向 DNS 解析,这样 MySQL 只会基于 IP 地址来进行连接和身份验证,从而加速连接过程并避免 DNS 配置或延迟导致的问题。
[mysqld]
skip-name-resolve
同时,请注意在增加该配置参数后,mysql的授权表中的host字段就不能够使用域名而只能够使用 ip地址了,因为这是禁止了域名解析的结果。
SELECT user, host, authentication_string FROM mysql.user;
MySQL连接过程
客户端(client
): 192.168.1.100
服务端:
DNS 解析
主机名解析:当客户端通过主机名(例如 mysql -h example.com -u user -p
)连接 MySQL 服务器时,MySQL 会首先通过 DNS(域名系统)解析该主机名为 IP 地址。这个过程涉及向 DNS 服务器发送请求并接收响应。
DNS 查询:客户端向 DNS 服务器查询 example.com
(或者你指定的任何主机名),DNS 服务器会返回该主机名的 IP 地址(例如 192.168.1.100
)。如果 DNS 解析失败(比如域名不存在,或者 DNS 服务器不可用),连接过程将失败。
如果直接使用IP进行连接,则这一步跳过
建立 TCP 连接
连接过程:一旦 DNS 解析完成,客户端使用解析到的 IP 地址和指定的端口号(MySQL 默认端口是 3306)建立 TCP 连接。
握手过程:在连接建立后,MySQL 服务器和客户端之间会进行 TCP 握手。这是一个标准的网络协议过程,确保双方的连接是可靠的。
发送连接请求
客户端向 MySQL 服务器发送连接请求。这个请求包括客户端的用户名、密码、目标数据库、字符集等信息。
主机名反向解析
根据IP解析出主机名就是反向解析
1、MySQL 服务器收到连接请求,客户端的 IP 地址是 192.168.1.100
2、MySQL 服务器将该 IP 地址转换为反向 DNS 查询格式:100.1.168.192.in-addr.arpa
。
3、MySQL 服务器向 DNS 服务器发送查询请求,查询 100.1.168.192.in-addr.arpa
是否存在反向解析记录。
4、DNS 服务器返回 client
作为主机名。
5、MySQL 服务器使用 client
作为主机名进行身份验证,验证是否允许来自该主机的连接。
如果反向解析出来的主机名在root用户允许访问的主机内,那么这个连接就被授权,否则MySQL 将拒绝该客户端的连接请求。
身份验证
MySQL 服务器验证客户端提交的用户名和密码。如果验证成功,服务器会根据客户端的请求返回数据库的相关信息。
建立会话
如果身份验证成功,MySQL 会为该客户端创建一个会话并允许其执行查询或操作。