1. 通过 Docker 配置 Mysql 服务
- 参考
docker-compose.yaml
配置,相关 path 路径可以单独存放在宿主机上 - 注意
volumes
可以根据自己环境调配 command
可以按自己的情况配置/conf.d
会被
1.1. Docker-Compose 环境
1.2. docker-compose.yml 配置
|
|
1.3. conf.d/my.cnf - 开启慢查询、最大连接线程数、数据存储等配置
|
|
1.4. 快速重新运行镜像加载相关配置
注意: 数据卷相关不会有变化,所以如果密码被重置过后,可能和docker-compose.yaml
不一致
|
|
2. Mysql服务监控
2.1. 已发送给数据库的在执行的慢查询
可以手动执行 sleep()
函数,或者是执行全表扫描的慢SQL, 观察慢查询日志
|
|
2.2. 通过 show processlist 也可以看到慢查询情况

3. mytop 数据库连接监控利器
mytop
用于观察 mysqld 服务情况,比如当前 qps、线程数、增删改查的比例,方便进一步调优;
- 安装: 参考 https://www.digitalocean.com/community/tutorials/how-to-use-mytop-to-monitor-mysql-performance
- 配置: 编辑
~/.mytop
输入相关连接参数,支持TCP连接
和Socket
两种方式配置
图示:

4. 磁盘 IOStat 监控
最开始的时候,

5. database/sql 包连接配置
6. 数据库表 - user
|
|
7. 调试代码 tmysql.go
|
|
8. tmysql_test.go
可以通过用例尝试不同的连接池,配合闲置连接数,以及模拟慢查询、多并发情况实验观察效果
|
|
9. 关键配置
9.1. SetMaxOpenConns
设置连接池最大可以打开的连接数,这个参数需要结合数据库的 max_connections
(limit)、以及连接数据库的节点数(N)、并发量综合考虑;
比如预估SQL的QPS 1w+左右,每个SQL执行100ms左右,则满打算1k连接;我们可以将Mysql服务器配置的 max_connection
为2048(2倍),假定按10个节点分派,即平均每个计算节点可以有200个长连接;但考虑到后续计算节点可能会伸缩(比如扩展到20个),我们可以为我们的Go服务实例配置 SetMaxOpenConns(100)
;
不过实际情况,我们可能会引入一主多从的架构,进一步分摊每个数据库的连接数,避免数据库单节点负载过高。
另外,我们有很多慢查询请求时候,我们的连接可能都会被这些慢查询给占用,导致后续SQL请求无连接可用,从而导致连接超时错误,这部分应该配合慢查询日志监控+告警及时解决 (通常是加分析加索引、加缓存、架构调整等进行优化)
|
|
9.2. SetMaxIdleConns
在连接池中可闲置的连接数,这个SetMaxIdleConns
数据可以控制保活的空闲连接数,即使用完后不立马释放,做到连接资源复用;
如果连接资源平摊到各个计算节点不是很紧张,一般会将 SetMaxIdleConns
值直接配置成和 SetMaxOpenConns
一样大 (这部分可以直接在test用例中验证,即处于WaitCount的数量最少),最大化连接利用率;
|
|
9.3. db 连接状态 - db.Stats()
9.4. 连接资源释放问题 - db.Close()
注意,在Query操作完后,应该及时释放资源,避免资源无法回收导致后续连接超时!
10. 小结
- 通过docker快速搭建了一个mysql测试环境,可以方便复用
- 可以通过
mytop
工具观察连接情况 - 在go中使用
database-sql
连接池配置需要结合数据库的max_connections
(limit)、以及连接数据库的节点数(N)、并发量综合考虑,通常为了提升SQL连接利用率,一般会将SetMaxIdleConns
值直接配置成和SetMaxOpenConns
一样大 - 慢查询监控和告警应该关注和解决,可以配备相应Kill机制(需要确认对业务无影响),避免连接池中的连接资源耗尽
11. 最后补一张图
