flask自动重连数据库


情况描述

flask部署到服务器后,日志中经常出现错误

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2006, "MySQL server has gone away (ConnectionResetError(104, 'Connection reset by peer'))")

看下mysql日志,大量的超时导致的连接中断

...
2018-09-10  6:45:41 768 [Warning] Aborted connection 768 to db: 'xxx' user: 'xxx' host: '172.22.0.2' (Got timeout reading communication packets)

问题原因

原因就是因为连接超时,数据库把它中断了,详细参见官方文档.

https://dev.mysql.com/doc/refman/8.0/en/communication-errors.html

起因

  • 查看数据库配置。不要混淆全局配置与会话配置
show global variables like '%timeout%'

connect_timeout      5
interactive_timeout  28800
wait_timeout         600
  • 配置文件my.cnf
connect_timeout         = 5
wait_timeout            = 600

错误复现

mysql错误日志两次中断间隔时间都大于600秒,有可能是该参数引起,将它设置小点看看,能否复现问题

set global wait_timeout=10

设置后,问题又出现了,可以缺点就是该参数引起的。

自动重连实现

无论wait_timeou设置多大,总会出现超时,该怎么避免呢?简单方法是定时重连接.

flask已经提供了重连参数。连接超过一定时间就将它回收。

SQLALCHEMY_POOL_RECYCLE=7200   # 默认2小时。该值一定要比数据库wait_timeout小,否则它不起作用,上面就是这个原因导致的

当然这个方法不会帮我们处理网络异常导致的连接失效时重连



上篇: sysbench测试mysql性能瓶颈 下篇: myisam锁表机制