背景: mariadb,mycat 中间件
问题: DB 连接数过多; 开发使用程序使用连接池连 mycat;
DB 待优化项: interactive_timeout,wait_timeout 都是 8 小时默认值
mycat 配置: 100 个分片库, 和其他业务库现在分片库用到 16 分片, 后面尚未使用
当前 DB 最大连接数: 3000
mycat 版本: 当前线上的 mycat 版本是 1.5.8 版本, 推荐以后线上使用最稳定的 mycat1.6.5 版本
经 DB 和开发碰面了解 这两个 timeout 时间不能缩短, 所以常规的优化手段不能使用:
正常 DB 连接数 1000, 数据库两个 timeout 为 300--500, 参数可以全局动态生效
公司线上 DB 前段时间建总出现连接数过多问题, 正常来说连接数 1000, 已经能够满足大部分需求
正常手段无法使用的时候, 那么就要找到 DB 为啥连接数过多
1. 审计日志
DB 上部署过审计日志, 审计日志部署请移步: 审计日志部署, 审计日志中可以查看到做坏事的坏小子是谁!
因为时间关系, 未保存但是从审计日志中发现大量访问连接 sql 就是 select 1 , 也是 mycat 连接 mysql 的连接
且该链接连的是大量尚未使用的物理库
至此审计日志只能判断到这里
2. DB 层面
mariadb 物理库 information_schema 中 processlist 表记录连接相关信息, 比如 DB,HOST,INFO,STATUS 等而且能统计具体某个库的连接数
查询后, 发现很多没有使用的 DB 中连接很多没有释放, 大概占总连接数的 60% 左右, 使用脚本 "kill id;" 后连接仍旧重新连接
这种情况很尴尬, 找不到原因
3. 审计日志
再结合审计日志, 查看连接从哪来的, 还是 mycat 发过来的 <heartbeat>select 1 </heartbeat>, 暂时就可以定位 mycat 的 heartbeat 问题, 结合网上查找的 heartbeat 算法,
其中有一条是关于未用的 DB 连接算法: 如果当前 DB 一直有访问, 那么链接该 DB 的 heartbeat 暂不执行, 未用的 DB 链接 300 秒重新连接该 DB
这算法是个人的理解, 因能力有限, 代码阅读能力低, 只能理解个大概; 现也能判断个大概方向
4. 更改 mycat 配置
当前 mycat 配置:<schema><table datanode ></table></schema>datanode
需要减少未使用的 datanode, 减少后发现, 连接数并未减少
kill id; 后还是连接数会重新增长判断单单更改 datanode 不是解决问题的办法
更改 < datanode></datanode>:
删除尚未使用的 < datanode></datanode>, 再次 kill id; 操作未用的 < datanode></datanode > 连接不再出现
至此问题解决, 实验文字叙述较多, 描述较少, 仅供读者参考
来源: http://www.bubuko.com/infodetail-2517111.html