写点什么

MongoDB 创始人 Eliot Horowitz 分析 FourSquare 宕机原因

  • 2010-10-09
  • 本文字数:1033 字

    阅读完需:约 3 分钟

为了提高响应速度,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 的迁移不是连续的。

2010-10-09 20:015974
用户头像

发布了 479 篇内容, 共 183.0 次阅读, 收获喜欢 53 次。

关注

评论

发布
暂无评论
发现更多内容

原创 | TDD工具集:JUnit、AssertJ和Mockito (十六)编写测试-有条件执行测试

编程道与术

Java 编程 TDD 单元测试 JUnit

普通二本,毕业三年,北漂之后,我是怎么成为程序猿的。

why技术

个人成长 程序人生 随笔杂谈 北漂

如何挑选一份工作

池建强

求职 找工作

CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手

图灵社区

CSS Web 开发 设计思维

一周信创舆情观察(5.25~5.31)

统小信uos

基础软件 操作系统 新基建

分享一份阿里架构师 651 多个技术分支的脑图

奈学教育

大数据

这场大数据+AI Meetup,一次性安排了大数据当下热门话题

Apache Flink

大数据 flink 流计算 实时计算

一文让你快速上手 Mockito 单元测试框架

mghio

Java spring 单元测试 Mockito

我的个人知识管理方法

lidaobing

个人成长 知识管理 PKM

Shell 文本处理一则

wong

Shell sed grep

产品的本质,知道却看不到

Neco.W

产品 产品经理 需求 产品开发

Kafka的生产者优秀架构设计

奈学教育

kafka 分布式

Java 走过的创新25年

田晓旭

Java25周年

吉德热泵烘干机解放阳台,引领生活品质新风尚

infoq小陈

奈学教育:Hadoop源码编译全流程分享

奈学教育

Mobaxterm (安装 、汉化、使用)入门教程

Geek_Offset

如何更好的交谈(以英语为例)

董一凡

学习 生活

计算机超全核心技术知识

苹果看辽宁体育

后端 计算机基础

2020年6月3日 对象与类

瑞克与莫迪

Docker 容器优雅终止方案

硅基新手村

Docker

入门到放弃:理清前端技术概念

大伟

Java ecmascript 大前端 Node

千万别学编译原理

池建强

编译原理

MyBatis之启动分析(一)

ytao

面试 mybatis

JAVA后端学习路线

敖丙

Java 学习 程序员 Java25周年

缓存与存储的一致性策略:从 CPU 到分布式系统

伴鱼技术团队

缓存 系统设计 cpu 系统架构 架构模式

手撕编译原理:汇编语言不会编

贾献华

Flink Weekly | 每周社区动态更新-20200520

Apache Flink

大数据 flink 流计算 实时计算

读懂才会用 : 带你见识 Redis 的 zset

小眼睛聊技术

redis 学习 程序员 架构 redis6.0.0

Flink 1.10 SQL、HiveCatalog 与事件时间整合示例

Apache Flink

大数据 flink 流计算 实时计算

浅谈敏捷开发中的设计

czjczk

敏捷开发

女朋友跟我吐槽Java中ArrayList遍历时删除元素的各种姿势

NotFound9

Java 架构 面试 编程语言 后端

MongoDB创始人Eliot Horowitz分析FourSquare宕机原因_架构_郑柯_InfoQ精选文章