配置了一个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说的那些浮于表面的设置,没有深入到问题本身,没有具体问题具体分析,这个问题现在还会在这里卡着我。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/11523.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~