FourSquare 经历两次宕机

  • 郑柯

2010 年 10 月 8 日

话题:架构DevOps语言 & 开发

美国东部标准时间 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 团队在该帖子中提到,将会采取三种措施避免类似状况:

  1. 进一步与 MongoDB 的开发者们密切合作。
  2. 改变运维流程,防止过载发生。
  3. 寻找服务降级的方法,关闭某些服务,以避免整个网站全部受影响宕机。

然而,刚刚过了几个小时,FourSquare 再次经历了第二次宕机⋯⋯

最新的博客帖子这样说明第二次发生问题的过程:

简单来说,还是发生了同样的事情:数据库过载,解决方案还是手动重新分配用户签到数据,以确保没有数据库过载,然后重启网站;在将近 6 个小时之后,我们终于恢复了服务。

除了 FourSquare 自己的讲述之外,MongoDB 的开发公司10gen的 CTO 和联合创始人 Eliot Horowitz 也分析了整个过程,请关注 InfoQ 对于该事件的后续报道。

架构DevOps语言 & 开发