Docker:MySQL连接慢问题解决

本文描述了在Docker环境中运行的MySQL数据库连接速度变慢的问题,经过排查,发现是由于MySQL的DNS解析配置引起。通过在MySQL配置文件中添加'skip-name-resolve'选项,禁用DNS解析,成功解决了连接延迟问题,实现了秒连。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

由于MySQL是使用Docker容器搭建起来的,在今天的数据库连接中,发现比平时的连接速度变慢了很多,每次连接大概延迟了10秒左右。

排查过程

1、 服务器资源
查看系统的CPU、网络等负载,无异常。

2、数据库连接池
一开始怀疑是连接数过多导致,登入MySQL后发现连接数有近200,于是kill掉一部分,发现还是连接缓慢。
排除连接数导致缓慢。

3.、网络问题
在ping服务器的时候并没有出现数据包延迟、丢包现象。
网络问题排除。

4、MySQL DNS解析
查阅了相关资料,觉得可能是MySQL的DNS解析配置。于是我从内网连接MySQL,居然也是一样慢,一下又没了头绪。

突然想起自己是使用的Docker搭建的MySQL,于是我连入容器内部连接MySQL,秒连!定位到问题所在了,就是MySQL的DNS解析配置问题。

查找了一些相关资料,这是MySQL文档关于DNS的部分说明:

How MySQL uses DNS
When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the hostname cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
If the operating system doesn’t support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.
You can disable DNS host lookup by starting mysqld with –skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.
If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with –skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.

大概意思就是说如果你有一个非常慢的DNS和许多主机,您可以通过使用-skip-name-resolve禁用DNS

解决过程

修改MySQL配置文件,添加skip-name-resolve

[mysqld]
skip-name-resolve
  • 1
  • 2

重启MySQL容器:

[root@template-centos7 /root]#docker restart mysqlN
mysqlN
  • 1
  • 2

重启完连接测试,秒连!

问题解决。

### 加快DockerMySQL 8下载速度的方法 为了提高Docker环境中MySQL 8镜像的下载效率,可以采取多种策略来优化这一过程。 #### 使用国内镜像源加速下载 通过配置Docker使用国内镜像仓库能够显著提升拉取镜像的速度。阿里云提供了官方认证的加速器服务,用户可以根据所在地区选择最合适的节点地址并应用到本地环境设置中[^3]。 对于Linux系统而言,在`/etc/docker/daemon.json`文件内加入如下JSON对象: ```json { "registry-mirrors": ["https://<your_mirror>.mirror.aliyuncs.com"] } ``` 重启Docker守护进程使更改生效: ```bash sudo systemctl restart docker ``` #### 利用缓存机制减少重复下载 当多次构建相同或相似的服务时,合理利用Dockerfile中的COPY指令以及多阶段构建技术可以帮助避免不必要的层重新创建与上传操作,从而节省时间成本。此外,确保宿主机磁盘I/O性能良好也有助于改善整体体验。 #### 预先加载常用基础镜像至离线设备 如果目标机器处于网络条件较差的位置,则可以在具备高速互联网连接的工作站上预先获取所需的MySQL版本,并将其导出成tarball格式保存下来以便后续迁移部署。 执行命令打包指定标签名下的image为压缩包形式: ```bash docker save -o mysql_8.tar daocloud.io/library/mysql:8.0 ``` 之后借助U盘或其他存储介质传输该文件到达目的地后再导入回容器引擎内部: ```bash docker load -i ./mysql_8.tar ``` 以上方法均有助于解决因公网带宽限制而导致的长时间等待问题,进而实现更高效的开发运维流程管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值