希望能帮助到你 2016-02-24
都是很折腾人很见鬼的bug。
Background
最近做了一个交易中间件项目--这个名字听起来比较高大山。。。就是个大量访问的卖手机流量的交易平台,对接好多客户自动下单,以及自动化处理的上级系统,运行在阿里云上,配置4 cores 8GB Memory。
First thing first
1.阿里云安装MariaDB 10.1.9(后升级到10.1.10仍然没解决),长事物丢数据。
每天凌晨从订单表导入到历史订单表,至少10K数据,然后发现丢数据了。写程序对比了程序输出日志和binlog以及数据库之后发现,sql被完整执行,但是在这个长事物中,innodb在存储的时候会随机少几条,当然也有一天没少...后来尝试了各种方法,几天之后没辙了,切换到RDS;之后再没有过这个问题。
说实话我没怀疑MariaDB,这个bug太弱智了,我是怀疑阿里云的IO有问题。
2.话说切换到RDS之后出现过一次数据不一致的情况,在一个连接里面,行级锁锁定一个客户记录,然后查客户余额,然后根据余额情况来决定是否做某些逻辑,然后修改余额(用update语句直接修改),结果发现查询出来一个一小时之前的数值...然后udpate语句因为RDS的binlog是记录修改前和修改后的数据的,所以发现binlog记录的是正确的数据。为什么会查出来一个小时之前的数据呢...虽然只有一次!
3.生成报表Excel并下载,大概从几万到十几万数据。因为系统有几天偶尔会跑死,cpu占用率爆高,或者连接池超时(实际连接数并不很高,大概七八十),一直不知道是什么原因,只能重启系统。后来发现,这事儿和360浏览器有关(为毛又是360浏览器,被这玩意坑的血泪史真是...),客户如果用360浏览器下载生成的Excel报表,浏览器可能没正确识别Content-Length头(为毛这么弱智的bug)所以半路就把连接关了,客户就下载失败了,服务端catch异常之后正常返回;然而就这么个简单问题,服务器上tomcat占用cpu直接就爆表,因为线上交易比较多,所以一直没时间仔细研究这个bug的具体原因(怀疑是tomcat的apr的bug),但是看起来无论如何也不应该出现这个问题...解决方案就是换其他whatever的浏览器都ok,只要别是大坑360。
记录一下,可能后来还有被坑的兄弟,可以参考。