问题描述:
内网Docker中安装了Mysql,在使用连接工具进行连接时,发现连接很慢(十几秒左右)。
原因分析:
查阅相关资料得知,由于mysql对连接的客户端进行DNS反向解析。
当一个新线程连接到mysqld时,mysqld将产生一个新线程来处理请求。此线程将首先检查主机名是否在主机名缓存中。否则线程将调用gethostbyaddr\u
r()和gethostbyname\u r()来解析主机名。
如果操作系统不支持上述线程安全调用,线程将锁定一个互斥锁,并改为调用gethostbyaddr()和gethostbyname()。请注意,在这种情况下,在第一个线程准备就绪之前,没有其他线程可以解析主机名缓存中没有的其他主机名。
您可以通过使用–skip name resolve启动mysqld来禁用DNS主机查找。在这种情况下,您只能在MySQL特权表中使用IP名称。
如果您有一个非常慢的DNS和许多主机,您可以通过使用–skip name resolve禁用DNS lookop或通过增加主机缓存大小define(默认值:128)并重新编译mysqld来获得更高的性能。
这里我推断,由于docker镜像安装时安装的是最小容器,因此缺少DNS解析等某些模块,所以连接时会出现连接超慢的问题。
解决方案:
1. 修改Mysql配置
进入docker中的mysql容器的shell命令行
docker exec -it 容器ID bash
以下是退出容器shell的命令
exit
编辑相关配置
vi /etc/mysql/mysql.conf.d/mysqld.cnf
如果提示没有vi命令,外网可以安装一个,内网环境的话可以选择执行命令查找服务器上的docker中的mysql地址
find / -name mysqld.cnf
找到docker中的mysql配置,修改所有找到的docker中mysql的配置信息。
添加禁用DNS反向解析配置,skip-name-resolve
[mysqld]
skip-name-resolve
在末尾添加上该配置,修改后
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
skip-name-resolve
修改后进行重启容器,解决
2. 启动时添加参数
docker run --name mysql --skip-name-resolve
同样可以解决
来源:https://blog.csdn.net/weixin_43464964/article/details/122837704
评论区