美国东部标准时间 10 月 4 日和 5 日,互联网业界最有名也是最具价值的地理位置服务网站 FourSquare 经历了两次宕机事件,第一次长达 11 个小时,第二次也有 6 个小时。第一次宕机问题解决之后,FourSquare 技术团队在官方博客上发布帖子“这一次可真是郁闷了”,详细描述了该次发生问题的全过程。
FourSquare 使用 MongoDB 作为后台数据存储,他们保存了海量的用户签到(check-in)记录,并且使用用户 ID 对数据进行了分片(sharding),希望数据可以平均分布到不同的数据库片(shard)之中。4 日上午 11 时开始,FourSquare 发现某一个数据库片的写入操作出现异常,在接下来的一个半小时,他们采取各种负载均衡措施,均不起效。他们希望引入一个新的数据库片,并在不关闭网站的情况下,将过载的数据库片中的部分数据转移到新的数据库片中。然而,该操作没有成功,同时直接导致整个网站关闭。不仅如此,将数据向新的数据库片迁移也没有腾出原先预期的存储空间数量。(他们认为“数据碎片化”和“使用用户 ID 切分”是两个主要原因。)接下来五个小时的各种努力也没有起效,网站仍然没有起来。
4 日下午 6 时 30 分,他们决定重新建立数据库分片索引,这可以解决内存碎片化和可用性的问题。这个过程耗时 5 个小时。到晚上 11 时 30 分,网站恢复。而且由于他们之前做了足够的安全保障和备份工作,没有任何数据丢失。
FourSquare 团队在该帖子中提到,将会采取三种措施避免类似状况:
- 进一步与 MongoDB 的开发者们密切合作。
- 改变运维流程,防止过载发生。
- 寻找服务降级的方法,关闭某些服务,以避免整个网站全部受影响宕机。
然而,刚刚过了几个小时,FourSquare 再次经历了第二次宕机⋯⋯
最新的博客帖子这样说明第二次发生问题的过程:
简单来说,还是发生了同样的事情:数据库过载,解决方案还是手动重新分配用户签到数据,以确保没有数据库过载,然后重启网站;在将近 6 个小时之后,我们终于恢复了服务。
除了 FourSquare 自己的讲述之外,MongoDB 的开发公司 10gen 的 CTO 和联合创始人 Eliot Horowitz 也分析了整个过程,请关注 InfoQ 对于该事件的后续报道。
评论