07
2025
06
17:28:28

为什么不建议在 Docker 中跑 MySQL?



配置了一个docker版的mysql,然后在上面开发支持高并发的后端,后端的功能类似于一个Mysql代理,客户端来一个负载就会让后端跟数据库创建一个连接。结果发现并发数超过10000左右就会提示连不上数据库。

dial tcp 10.45.*****:7487: connect: cannot assign requested address

网络拓扑:

服务器和模拟的客户端全部在同一台机器上。

mysql通过docker的桥连接联通;后端和客户端通过192.168.0.1-10等多个虚拟ip进行连接,每个ip分配5w多端口。流量都是本地在跑,没有出本机,排除了外部网络条件的问题。

关于后端和模拟客户端咋能在一台机器上:莫得办法,性能测试要求太变态,只能这么玩。不过现在客户端就算是改成不在一台机器上,一样会有问题,基本上排除是客户端问题

另外也尝试过修改linux的各种描述符和mysql的各种参数设置,无效。

也试过连接池的想法,但依然不能解决

说好的四元组只要有一个不同tcp连接就不会冲突呢?客户端的ip和端口都不一样,为啥就冲突了导致无法分配?

随便问一下别人,明明Mysql可以支持十几万的并发啊,怎么到了我们这里就不行呢?


然后我想到了一个点:本机客户端发起的请求到底是怎么发到给mysql的?

我是往10ip的7487端口发送,但docker mysql的内部地址肯定不是10。再想想好像经过了172这个nat转发。。。等一下,nat?那是不是跟mysql直接通信的只有一个ip和50000个不到的端口?

Fine,看来一切的罪恶源于docker的默认网络模式bridge(NAT)。。。即使是本机流量,都要通过172它的内部nat转发才能到达容器内部,让这里成为了瓶颈。。。


之后赶紧换普通版的mysql,至少这个问题解决了,世界美好了一半。。。新的风暴出现那又是后话了。。

后面经别人提醒,还有一种修改方法是从默认的bridge模式换成host,应该也是可以的。总之就是要避免nat网关造成的瓶颈。

这次的经历给我的启示是,学好(计算机网络等)理论的重要性

我这个案例网上随便一搜,出来的都是说Docker会有性能问题,但就是不说会有这个端口的限制。之前问了好多人,都说:Docker应该没影响啊,最多慢点,你这个情况应该跟Docker没有关系。。

如果分析问题的时候只依赖于网上ai说的那些浮于表面的设置,没有深入到问题本身,没有具体问题具体分析,这个问题现在还会在这里卡着我。



不要拿老观念念经了,所有主流数据库都有官方镜像,多数也有容器化的集群方案,你要做的只是在部署的时候记得挂一个卷,把数据目录从外部挂载进去,减少IO的额外开销,并且保证容器删除时数据不丢失。使用容器部署有很多优点,比如可以随意选择数据库版本而不用过多在意与操作系统版本兼容性的问题,也保证和同一宿主机上部署的其他服务不会互相干扰,还可以很容易实现单台服务器上部署多个独立数据库实例。所谓的性能损失在正确挂载卷的情况下根本不存在。






推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/11523.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: