Docker容器中MySQL最大连接数被限制为214的解决方案
原文:Docker容器中MySQL最大连接数被限制为214的解决方案

一、背景

话说笔者在上次的博客里简单的讲了一下调整MySQL最大连接数的方法。在文章的最后笔者提到了还有一些特殊情况比如说Docker中,会导致MySQL的最大连接数被限制在一个值上。今天笔者就要来讲一下为什么在Docker环境中会出现这个问题。

这次的问题也是在公司实习的时候碰到的。当时导师要笔者去部署一个LAMP环境(不要问笔者为什么用docker还要把apache+PHP和MySQL塞在一起,这个问题您得问笔者导师),然后要调整一下Apache和MySQL的最大连接数。在调整结束之后笔者就想着要不进去看看有没有设置成功,就进入Docker容器的MySQL控制台,查看MySQL的最大连接数,结果是笔者之前设置的最大连接数并没有生效,MySQL的最大连接数被限制在了214。

二、解决方案

今天就先讲一下解决方案吧,因为当时遇到这个问题的时候真的是没有一点思路。去百度搜索了很久都没有找到什么靠谱的结果。最后抱着赌一赌的决心去Google上用英文搜了一下,结果在第一页就搜到了有人在stackoverflow提出的类似问题《Increasing mysql max_connections to 1024 in a docker container》,里面提出了一个解决方案:

在启动容器时加入参数:

--ulimit nofile=65536:65536

好的,那让我们试验一下行不行,在启动容器的时候加入--ulimit参数:

用docker exec命令进入容器,检查MySQL的max_connections变量值:

成功了!

三、思考

问题是解决了,但到底是为什么呢?

我们来看一下Docker官方对ulimit这个参数是怎么解释吧。

ulimit这个参数最初出现于Docker 1.6版本,在官方博客《Docker 1.6: Engine & Orchestration Updates, Registry 2.0, & Windows Client Preview》里,他们对ulimit参数的是这么解释的:

Ulimits

Up until now, containers inherit the ulimit settings from the docker daemon. This tends to be extremely high to account for production workloads, but is not ideal inside the container.  Ulimits allow you to limit the resources of a given process (you may be familiar with the command line tool ulimit). With this new feature, you can now specify the default ulimit settings for all containers, when configuring the daemon. For example:

docker -d --default-ulimit nproc=1024:2048

This will set a soft limit of 1,024 and a hard limit of 2,048 child processes for all containers. You can set this option multiple times for different ulimit values: --default-ulimit nproc=1024:2408 --default-ulimit nofile=100:200

These settings can be overwritten when creating a container as such:

docker run -d --ulimit nproc=2048:4096 httpd

This will overwrite the default nproc value passed into the daemon.

Thanks to Brian Goff for this patch. If you are interested in the original pull request you can view it here.

个人渣翻:

Ulimits

直至当前,容器通过从docker守护进程继承ulimit设置,这对于生产工作量来说往往是非常高的,但在容器的内部却并不理想。Ulimits将允许您去限制给予进程的资源(您可能熟悉命令行工具ulimit)。通过这个新功能,您现在可以在设置守护程序时向所有的容器指定默认的ulimit设置。例如:

docker -d --default-ulimit nproc = 1024:2048

这将为所有容器设置1024个软限制和2048个硬限制的子进程限制。您可以对不同的ulimit值多次设置此选项:--default-ulimit nproc=1024:2408 --default-ulimit nofile=100:200

这些设置可以在创建容器本身时被重写:

docker run -d --ulimit nproc=2048:4096 httpd

这将重写之前传入守护程序中的默认nproc值。

感谢Brian Goff提供的补丁。如果您对原始的pull request感兴趣,您可以去这里查看。

简单的说呢就是,在Docker容器将继承Docker守护进程的ulimit设置,我们通过在启动容器的时候加上--ulimit nofile=65536:65536参数,重写了容器内部的nofile限制值。

四、其他修改默认设置方法

由于笔者要部署的容器都需要提高MySQL的最大连接数,每次启动的时候都要设置ulimit参数会变的非常繁琐。如果使用文档中提到的docker -d --ulimit这种方式如果以后突然要返回默认值就比较麻烦了。有没有什么一劳永逸且设置方便取消也方便的方法呢?答案当然是有的——修改docker守护进程ulimit设置。

由于这里用的系统是CentOS 6.9,所以不存在docker.service文件。但我们可以通过修改服务启动脚本来实现:

vim /etc/init.d/docker

在文件的开始部分加入以下代码:

ulimit -u 65536 -HSn 65536

保存后退出vim。

现在我们回到容器中,这次我们不添加--ulimit参数,看看能不能解除MySQL最大连接数214的限制。

和刚刚一样,用docker exec进入lamp容器内部,检查MySQL当前max_connections变量值:

可以看到,现在就算没有加入--ulimit参数,MySQL最大连接数也可以突破214的限制了。

五、写在最后

为什么在第四章笔者给出了一种修改服务配置文件的方式而不是通过官方提供的docker -d --ulimit方法去调整docker守护进程的ulimit值呢?主要的原因大概就是docker官方在后面的更新中,也是使用修改服务配置文件的方式设置了默认的ulimit设置。

在写本文时,笔者因为需要截图,所以打算在自己的笔记本中搭建环境,但一开始用的是CentOS 7系统,在实际的操作过程中就算没有加--ulimit参数,容器内的MySQL也可以突破最大连接数为214的限制,Ubuntu 16.04也是如此。只有CentOS 6才出现了这个问题。通过查看CentOS 7和Ubuntu 16.04的docker.service文件后,笔者发现在docker.service中,已经默认加入了LimitNOFILE和LimitNPROC这两项设置并默认给予了一个非常大的数值,所以这个问题就不会出现在CentOS 7和Ubuntu 16.04上了。

CentOS 7 docker.service文件部分截图:

Ubuntu16.04 docker.service文件部分截图:

所以笔者个人觉得通过修改docker守护进程的配置文件来设置ulimit值的方法更为妥善。

posted on 2019-05-17 00:31 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10878974.html

Docker容器中MySQL最大连接数被限制为214的解决方案相关推荐

  1. docker容器中下载vim指令的速度特别慢,解决方案

    docker中执行apt指令下载软件包的速度,默认使用的下载源速度很慢,所以提供一个apt换源的解决方案,如果能对看文章的你有一定的帮助,本人深感荣幸! 由于该源是不用GPG验证的,有可能会导致不安全 ...

  2. docker导入MySQL文件_Docker容器中Mysql数据的导入/导出详解

    前言 Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢? 解决办法其实还是用mysqldump命令,但是我们需要进入docker的 ...

  3. Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法

    Navicat 远程连接docker容器中的mysql 报错1251 - Client does not support authentication protocol 解决办法 1).容器中登录my ...

  4. 记录一次 在linux 搭建的mysql迁移到docker容器中

    上篇文章写道,我腾讯云被攻击了,然后我各种删除木马文件,但在这个过程中,有些系统文件没认到,以为是木马文件,就删除了,各种处理无果,打开腾讯云的救援模式,备份了些重要文件,然后重装系统了. 基于这个契 ...

  5. Openstack技术\在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server

    MySQL部署 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server. 操作步骤: 搜索mysql镜像 拉取mysql镜像 创建容器 操作容器中的mysql 容器 ...

  6. Docker(三):镜像导入与导出、保存与加载、在Docker容器中安装软件

    相关阅读: Docker(一):Docker的安装与常用命令 Docker(二):Docker常用命令之镜像的创建:Dockerfile 与 commit Docker(三):Docker镜像导入与导 ...

  7. docker容器下mysql更改WordPress的site address和home(URL)

    转载 先简单介绍下,用docker安装的WordPress,mysql是在docker容器中的,并未在Ubuntu(我把WordPress是安装Ubuntu系统上),即WordPress和Ubuntu ...

  8. 【Docker】(五)使用bind mounts修改Docker容器中的Nginx配置文件

    1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远 ...

  9. docker容器中安装vim

    docker容器中安装vim 在使用docker容器时,容器一般没有安装vim,就需要安装vim apt-get install vim命令用于安装vim,但是下载过慢. 第一步 配置国内镜像源 进入 ...

最新文章

  1. OpenResty+Keepalived组建高可用集群+双主模式
  2. BGP建立邻居的详细过程
  3. python培训班有用吗-Python培训班哪家好?
  4. FICO年结完全手册
  5. 高并发,分布式系统要点
  6. MyBatis动态SQL底层原理分析 与 JavaScript中的Date对象,以及UTC、GMT、时区的关系...
  7. FTP 编程 5 文件传输与目录切换
  8. WinAPI——钩子函数大全
  9. ABP之Javascript生成
  10. HDOJ2005 ( 第几天? ) 【水题】
  11. 阿里云CTO王坚当选院士,高手的人生都是如此雷同:生命的信仰
  12. sql 根据身份证号码计算年龄
  13. android获取指定位置经纬度,Android - 如何获取当前位置(经度和纬度)?
  14. 我和权威的故事——王垠
  15. 测试期货系统的软件,期货交易系统测试怎么做?不会软件执行一样可以!
  16. python打开csv文件、计算总成绩_python – 读取CSV文件,计算平均值并打印所述平均值...
  17. 苹果手机换android,我从苹果手机换回了安卓手机,是怎样的体验呢?
  18. 笔记本插入耳机没反应 必须重启前插入再启动才行 启动后拔下再插入依旧外放
  19. JAVA并发容器-ConcurrentHashMap 1.7和1.8 源码解析
  20. 安全扫描工具-appscan

热门文章

  1. koa 接口返回数据_koa-api
  2. java遍历栈_Java中使用StackWalker和Stream API进行堆栈遍历
  3. 东莞网络推广浅析如何通过简化标题来提升核心关键词排名能力呢?
  4. 如何设置网站标题更有利于网站SEO优化?
  5. python 微信模块_Python使用itchat模块实现简单的微信控制电脑功能示例
  6. 内存淘汰算法_「承」Redis 原理篇——Redis 的内存回收机制
  7. 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  8. jsp 调用java_jsp中调用java代码小结
  9. 1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习
  10. ES JVM使用如果超过75%就会GC较多,导致ES索引性能下降