分布式集群架构下的mysql错误 "too many connections"

背景

项目采用微服务,分布式集群的方式进行部署,每个服务有2至3个节点。

问题

新增了一个服务,开了两个节点,发布到线上环境后,过了一段时间,发现其他服务的消息积压了。

原因

经过查看各个相关服务的日志,发现数据库无法写入,日志中首先出现了Communications link failure,The last packet successfully received from the server… 字样,之后半个小时左右出现了 Too many connections ,此时是连接都连接不上。如此,导致了数据无法写入数据库,从而消息会一直积压。
进一步思考,从上一次该连接成功获取数据库服务器返回数据的时间来看,服务器的允许连接的最大空闲时间是5分钟,导致连接空闲5分钟之后被数据库服务器释放,而连接池未校验连接的有效性就分配给了线程使用,从而产生了该错误。
至于too many connections,则是数据库服务器端max_connections设置的太小了。

总结

在分布式集群架构中,考虑事情需要从整个系统考虑,就拿上面说的情况作为例子,我增加了一个服务,该服务的最大数据库连接数为20,如果只从单个服务考虑,那数据库方面就可能被疏忽(该服务集群部署n个节点就需要20*n的数据库连接,这样其他集群服务也需要使用数据库连接时足够吗,数据库是否分配足够呢),不然就会有很可怕的事情出现!

你可能感兴趣的:(问题,数据库,微服务,集群,微服务)