引子

大概在两个多月前,我们之前的小公司被现在公司收购,从此,我就开始了水深火热的生活。再也不能享受走路五分钟就可以到公司的待遇了,想吃点早餐还要算着时间,不过好在现在这公司在10点前到公司都可以不算迟到。
除了生活上的问题,还有就是工作上也遇到了新的挑战。之前,公司在游戏的推广力度上不大,游戏服务也一直运行的非常不错,没出过大问题,更同遇到过负载问题,但是到了这边后就大不一样了。几乎来新公司之后就马上对游戏开始了大力的推广,于是就开始了地狱般的一个月。

NoSQL

在游戏开始推广之前我们就已经意识到有可能会出现负载问题,到了新公司第一件事就是把一部分与其它库的关联不是那么密切表迁移到NoSQL数据库中,首批迁移的是建筑数据 ,这是数据量最大记录条数最多的数据,在这里我们使用的是腾讯开放平台提供的CMEM,其实就是Memcached,只不过提供了持久化的能力。
由于之前没有尝试过使用NOSQL,出于对这种存储数据方式的不信任和不适应,我们决定保存两份数据,一份在CMEM中,同时再保存一份到数据库中,此处使用的数据库也是腾讯提供的CDB(其实就是MySQL)。我的做法是,在保存数据>到memcached中后,马上把该操作生成sql写入队列,然后再由队列处理程序异步的将数据写入到数据库中,这个做法在刚开始压力没那么大的时候效果非常好,从memcached中读取数据要比从数据库读取的速度快不少。

404 or 500

随着用户的增加,新的问题开始暴发出来。表现出来的现象是,一到在线高峰,用户就可以访问不到服务器,提示404错误,检查日志,发现出现404错误是由500错误引发的,由于没有配置500错误页面,500错误时找不到500错误页面,于是Nginx返回了404 Not Found。查看500错误,发现是无法连接fastcgi服务,然后就卡在这里了,当时没想起来可以记慢执行日志。
在腾讯开放后台查看统计数据时无意中发现,在每次出现大量404错误时数据库的连接数都暴高,猜测这可能是由于同时连接到数据库的客户端太多,查遍了所有有关连接数据库的位置,加入延迟连接数据库的代码,只在必要的时候>连接数据库。这种做法虽然稍有改观,但是在在线高峰时还是会出现404错误。
在纠结于无法解决这个问题时,又检查了GM后台,以及感觉不起眼的队列同步服务,发现队列服务竟然没限制同时连接数,虽然里面加入了限制连接数的代码,但是没启用。果断限制连接数,然后再看,高峰时段平稳度过。