[原文] http://www.infoq.com/cn/news/2010/10/eliot-analyze-outage-of-4sq
上回书我们提到:10月4日、5日,由于数据碎片化和监控不力的原因,FourSquare经历两次宕机。FourSquare使用的后台数据库为MongoDB,在问题解决后不久,MongoDB的开发公司10gen的CTO和联合创始人Eliot Horowitz也在mongodb-user这个Google邮件组里分析了整个过程。国内知名技术博主、医药生命科学网站丁香园CTO冯大辉翻译了Eliot的分析,本着不重复发明轮子的原则,本文将引用冯大辉先生博客的主要内容,全文请见冯大辉的博客——《FourSquare长达11小时的宕机》。
在冯大辉看来,Eliot的说明“有为MongoDB辟谣的意味在里面”,同时他也认为这个案例“是一个很好的研究样本,值得分享”。
为了提高响应速度,Foursquare 使用 MongoDB 存储 Check-in 的数据已经有一段时间了。这部分数据的数据库起初跑在一个 66GB 内存的 Amazon EC2 单实例上(全部在内存里),两个月前,出于对容量增长的考虑,迁移到两台 Shard 集群上。每个 Shard 机器都是 66GB 内存,为了冗余,每个 Shard 都有复制到 Slave 实例。迁移的目标是所有的 Check-in 数据都保存在内存中。数据根据 ID 分成 200 个 Shard 分片,两台机器各占一半,也就说联机数据在每台机器上各使用 33GB 的内存。两个月相安无事。
问题来了,因为 Shard 算法导致的数据分散不均衡,其中一台(Shard0)数据增长到 67GB(另外一台 50GB),超过了 66GB 的限制,读写部分分散到磁盘上,性能急剧下降。从而,网站宕机。
首先尝试增加第三台 Shard 机器,上线后开始迁移,读取从三台进行,Shard0 的数据迁移到 5% 的时候,但是写操作还是让 Shard0 宕机了。这个时候发现Shard0 存在数据碎片(data fragmentation),即使数据迁移走,还是会占用原来的内存。每个Check-in 文档大约占用 300 字节,而 MongoDB 是 4KB 的页(Page),也就说十几个文档会填满一个页,而迁移 5% 反而造成了页更加稀疏,并不是将页全部删除。
这个时候已经到了第二天,随着网站全面宕机,技术团队开始用 MongoDB 的 repairDatabase() 功能来对数据库进行压缩,因为数据库太大和 EBS 慢,也因为 repairDatabase() 不能充分利用多核CPU 的能力,这个过程耗费了 4 个小时。之后这 5% 的内存空间终于释放出来,系统重新上线。
随着 Shard0 修复,第三台成功上线,进而添加了更多的 Shard 服务器,现在数据已经更加的均衡,通过在Slave上运行 repairDatabase(),然后将其切换到 Master ,每台 Shard 内存占用缩减到 20GB左右。整个故障时间已经延续了 11 小时之多。
产生问题的主要原因就是系统过载,前面介绍每台 Shard 承载原来 50% 的压力,到了问题发生的时候,单台 Shard 的负载已经超过 Shard 之前的系统负载,这时候已经积重难返了,在容量的临界点增加新系统资源,必然导致更多的停机时间。暴露了 Foursquare 团队在容量规划方 面的不足之处,或许也因为业务增长太快了吧。另外,内存碎片化的问题在没有宕机之前,技术团队应该没考虑过这个问题,如果文档的大小超过 4K,碎片化问题就不严重了,这是特定应用场景造成的特定问题。10Gen 现在已经着手研究如何进在线压缩(online compaction)。再次,Shard 键值的顺序和插入顺序是不同的,这造成了迁移数据的时候 Chunk 的迁移不是连续的。
冯大辉认为这个案例能够带给我们很大启示:
最近 NoSQL 已经成为一个热词,类似 MongoDB 这样的新事物当然值得尝试,但是不能冒进,因为驾驭起来并非易事。仅仅能够使用是不够的,系统没出问题一切都好,一旦出了异常,有足够的技术力量(设想一 下 Foursquare 得不到 10gen 团队的支持会如何?) 支持么?在极端情况下如何控制? 如果回答不了这个问题,那么还应该暂缓。最好的办法就是..."等待"。
分享到:
相关推荐
MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化MongoDB疑难杂症分析及优化...
12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar...
MongoDB的分析和报告的解决方案
国外著名的LBS社交类应用程序 foursquare源码,供大家分析研究
MongoDB Sharding 机制分析及实现
MongoDB数据库
使用Express与MongoDB 搭建多人博客
MongoDB数据库
本书是一个小册子,简介明确的介绍了Mongodb聚合基本概念和操作,适合数据分析和财务管理人员入门使用,也适合于初学Mongodb的人员使用,字数不多,但是涵盖了Mongodb聚合框架的入门,常用的高级聚合,针对数据分析...
Cube 是一个开源的基于 MongoDB 的数据分析工具 Cube 的收集器接收事件并将这些事件保持在 MongoDB 中。你可通过 UDP、HTTP POST 或者 WebSockets 来发送事件。同时 Cube 内置支持接受来自 collectd 的事件。
mtools一组脚本,用于设置MongoDB测试环境并分析和可视化MongoDB日志文件
MongoDB流量-流量分析
文件系统、Mongodb、Hadoop_存取方案分析
一、MongoDB简介 3 二、MongoDB结构 3 二、MongoDB 数据库关系型(这里并不是值关系型数据库的关系) 3 1、MongoDB一对一关系型 3 2、MongoDB一对多关系型 4 3、MongoDB多对多关系型 4 三、创建数据库(mongodb_test...
sudo vim /etc/yum.repos.d/mongodb-org-4.2.repo 写入: [mongodb-org-4.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpg...
本课程是一套关于MongoDB应用开发的实战性教程,名为《深入浅出MongoDB应用实战开发(基础、开发指南、系统管理、集群及系统架构)》,教程侧重于讲解MongoDB的常用特性及高级特性,从实际开发的角度出发对MongoDB...
资源名称:MongoDB应用设计模式内容简介:无论是在构建社交媒体网站,还是在开发一个仅在内部使用的企业应用程序,《MongoDB应用设计模式》展示了MongoDB需要解决的商业问题之间的连接。你将学到如何把MongoDB设计...
MongoDB数据库
适用于对mongodb有一定的使用经验,并且希望更深了解的人群,对mongodb的索引,执行计划有详细的介绍
用于mongdb数据分析, 强大的分析功能让你飞起, mongodb数据分析师必备