原文: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疑难杂症分析及优化...
本文将深入探讨如何利用MongoDB进行数据分析和报告,并结合Databazel项目(尽管压缩包中的具体文件未给出详细信息,但我们可以假设它是一个与MongoDB数据分析相关的工具或示例)来增强这些能力。 首先,让我们了解...
综上所述,foursquare源码的分析不仅能让我们了解LBS应用的基本架构,还能深入学习到社交网络的设计、推荐系统的工作原理、大数据处理以及前端优化等多个领域的技术知识。对于任何想要提升自己在移动应用开发领域...
12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar12、MongoDB复制集实战及其原理分析_ev.rar...
MongoDB 是一个流行的开源文档数据库系统,以其灵活性、高性能和强大的数据处理能力而备受青睐,尤其是在数据分析和财务应用中。本书“MongoDB 聚合实战:数据分析与财务应用轻松入门”是为初学者和专业人士设计的一...
"mongodb数据分析工具"指的是利用特定工具来挖掘、解析和理解存储在MongoDB中的数据。 MongoDB Compass是MongoDB官方提供的一款强大的图形用户界面(GUI)工具,版本号为1.11.2,适用于Windows 64位系统,如文件名...
课时2:MongoDB数据数据查询与分析.mp4 课时3:MongoDB数据库核心知识.mp4 课时4:MongoDB数据库管理备份.mp4 课时5:MongoDB开发实战:开发博客应用.mp4 课时6:MongoDB数据库性能分析与调优.mp4 课时7:MongoDB...
Eliot Horowitz,MongoDB的联合创始人和CTO,在引言部分阐述了MongoDB的设计理念,即从现实世界的需求出发,解决传统关系型数据库存在的问题,并利用文档型数据库的数据模型提供一系列新的功能。 首先,MongoDB的...
**Python-mtools:MongoDB测试环境与日志分析利器** `Python-mtools` 是一个强大的工具集合,专门针对MongoDB数据库进行测试环境的搭建以及日志文件的分析和可视化。这个开源项目由Rückstädt开发,其版本号为...
MongoDB数据库
在实际应用中,MongoDB被众多知名公司广泛采用,如Craigslist、FourSquare、Shutterfly、bit.ly、Spike.com、Intuit、SourceForge.net、Etsy、The New York Times和CERN等,涵盖了社交网络、图像存储、数据分析等多...
Hadoop与MongoDB都是在大数据时代被广泛使用的技术,它们在处理和分析大规模数据方面拥有各自的优势。为了更好地处理日益增长的数据量,Hadoop与MongoDB之间的整合技术变得越来越重要。 Hadoop是一个由Apache基金会...
MongoDB流量分析是数据库性能监控和优化的关键环节,特别是在大数据处理和实时应用中,MongoDB作为流行的NoSQL数据库,其流量分析能帮助我们理解数据库的运行状况,优化查询效率,确保系统的稳定性和高可用性。...
MongoDB数据库
Cube 是一个开源的基于 MongoDB 的数据分析工具 Cube 的收集器接收事件并将这些事件保持在 MongoDB 中。你可通过 UDP、HTTP POST 或者 WebSockets 来发送事件。同时 Cube 内置支持接受来自 collectd 的事件。
/usr/local/mongodb/mongodb-linux-2.0.7/bin/mongod --dbpath=/usr/local/mongodb/data/db --logpath=/usr/local/mongodb/mongodb-linux-2.0.7/logs/mongodb.log --logappend --port=27017 --fork 知识点 6:配置...
2. **聚合框架**:可能包含各种聚合管道示例,用于演示如何使用MongoDB的聚合功能进行数据统计和分析。 3. **索引创建和优化**:测试数据可能包含各种不同结构的文档,用于测试不同索引类型的效果,如单字段索引、...
MongoDB入门指南 MongoDB是一种开源的文档类型数据库,它具有高性能、可扩展、高可用、自动收缩等特性。MongoDB能够避免传统的ORM映射,从而有助于开发。MongoDB中的每一行记录就是一个文档,它是一个由键值对构成...
MongoDB是一个流行的开源、分布式文档型数据库,设计用于处理大量数据并提供高可用性和高性能。在Java应用程序中,为了与MongoDB进行交互,我们需要使用Java MongoDB驱动程序。这个压缩包包含的就是Java连接MongoDB...