混沌演练把主库停了 30 秒,恢复后应用仍然全站 500,连接池里的坏连接没有剔除,重连要等十分钟,用户侧错误率一直不降。

一开始怀疑是「读写没有分离,主库挂了全部接口受影响」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。连接池没有配置失效检测与重连。也可能是故障期间连接被标记为可用但没有校验。

还有一种情况,健康检查只看进程存活,不看数据库连通。

上来先看连接池的校验与重连参数

python -c "print({'test_on_borrow':True,'validation_ms':1000})"

接着把健康检查改成实际执行一条查询

python -c "print('healthcheck=SELECT 1')"

主库故障时把读请求切到只读副本

python -c "print('read=replica; write=primary')"

等前面都确认过,再重跑演练确认恢复时间

python chaos.py --target primary --mode down --s 30 --watch recovery

改完先别撤,确认这几项。主库恢复后 8 秒内错误率回到基线,读请求全程可用,健康检查在故障期间正确返回不健康。

连接池不会自己发现坏连接,校验和重连要显式配;健康检查只探进程存活是最常见的假健康,得真正打一条查询。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189