Contents
  1. 1. Forword
  2. 2. The problem
    1. 2.1. Debug
    2. 2.2. Fix up
  3. 3. Final
  4. 4. improve(date: Dec.)

牢骚向

Forword

我一开始使用MySQL我就后悔了,因为我深深的体会到,在sql型数据库中,当表之间关系复杂以后,要删除一条信息是有多么的困难。而几乎所有的第三方MySQL库使用的还是原生的sql语句。且不说sql语句的拼接被x问题,sql的高阶语法本身就非常的反人类。加上我已经习惯了noSQL带来的好处(直接字典\对象操作),仿佛就从天堂到了地狱。

The problem

前台说请求报错,她那里格式正常。启动服务器简单脚本测试,发送get正常,post报pipeBroken。重启应用,好了。过了半天,一发post,跪。

Debug

get能用,post挂了,肯定是数据库问题,看了下错误类型,连接管道断了,那就是pymysql的问题。

第一反应,连接对象过期了,定期更新it,无解。

加快更新频率,无解。

启用连接池,加大连接节点数,加快更新频率,均无解。此时已过2周,暂时用无限手动重启应用的方法应付问题。

通过supervisor查应用日志,发现启动应用大约过了半天时间一发post服务器才会pipeBroken,而报错期间并没有主动断开。就是过期了啊(葛优瘫)

Fix up

经过一段时间的思考,我感觉是MySQL本身的问题,查了一会相关资料,把服务器日志pipeBroken的报文Google了一下,发现是MySQL长时间没有操作,进入睡眠了。。

进入MySQL交互界面输入

show variables like '%timeout%';

发现wait_timeout的值为28800s,相等于8小时没操作MySQL就会断开连接。于是我用最简单暴力的方法:

set global wait_timeout=2880000;

服务器再也不频繁抛错了。至于之前的那些解决方案……先留着那些代码吧

Final

在条件允许的情况下,尽量使用更加稳定而简单的nosql数据库,避免给自己挖坑

improve(date: Dec.)

修改MySQL变量不是权宜之计,MySQL休眠是因为长期没有操作,所以自动断开连接节点,而且不是所有的服务器都支持修改MySQL全局变量的,有时候root也不能改- -。所以用计时器每隔一段时间向MySQL发一次查询,重置连接时间。若还抛出错误pipeBroken的时候换一条新的管道。

实际效果:MySQL能够平稳的运行好几天,几天之内查询成功率在90%左右,仍然不太能够令人满意,但是相比以前,已经进步了很多。。

Contents
  1. 1. Forword
  2. 2. The problem
    1. 2.1. Debug
    2. 2.2. Fix up
  3. 3. Final
  4. 4. improve(date: Dec.)