双管理节点场景,当重启管理节点服务的时候或者demote管理节点操作之后,管理节点服务异常,管理节点数据库报错too many connections

图1 管理节点状态
ZStack云平台:ZStack云平台企业版
管理节点环境:双管理节点
存储环境:本地存储
网络环境:扁平网络
某些特定的情况下,例如在大规模同时连接数据库场景下,会导致数据库连接数量超过ZStack 设置的默认值(ZStack 在安装高可用的时候,默认会配置maxPoolSize=150,这样两个节点的maxPoolSize值为300,有些时候消耗的连接数远不止这么多)数据库同时连接数过多之后,就会导致该问题。

图2 数据库最大连接数
首先我们需要去数据库查询一下当前的连接数:
mysql -uroot -p zstack.mysql.password
1. 展示连接数
show processlist;
2. 筛选一下,更加直观
select id,command,time from information_schema.processlist;

图3 管理节点当前连接数
如果存在管理节点报错too many connection的时候,则会有大量的Sleep的连接(Time时间大于300的),需要删除他们,然后释放连接数,这些连接数不手动清理的话,会超时才会刷掉,手动删除时间长(Time>300 出于性能考虑)的Sleep连接数,不会对环境产生影响。
解决步骤:
1. 一般处理方法有以下两种。
a)
mysql -uroot -pzstack.mysql.password -e "select concat('kill ', id, ';') from information_schema.processlist where Command = 'Sleep' and Time > 300" b)
for i in `mysqladmin -uroot -pzstack.mysql.password processlist | grep -i sleep | awk '{print $2}'`
do
mysqladmin -uroot -pzstack.mysql.password kill $i
done(写一个脚本,然后直接执行就好,对应的数据库密码需要注意一下)
2. 如果用户环境反复出现这个问题,则需要修改ZStack的配置(zstack.properties)添加 DB.maxIdleTime = 50(小于100的任意值) 重启一下mn服务,可永久解决该问题。此方法和上述方法1主要思路都是一样的,都是需要将Sleep的时间已经持续很久的连接数删除释放。