写点什么

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:015724
用户头像

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

关注

评论

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

PerformingTestCOMPILER_KNOWS_STDLIB-Failed

linux大本营

cmake C++

linux如何计算一个shell程序运行的时间

linux大本营

Shell Linux系统

点对点传输效率对比测试——镭速传输

镭速

已知非空线性链表由list指出,链结点的构造为(data,next)。写-算法,将链表中数据域值最小的那个链结点移到链表的最前面。要求:不得额外申请新的链结点

linux大本营

链表 C语言 数据结构与算法

再写一个版本,要求使用类进行封装,提供完善的接口,并对函数进行完善注释

linux大本营

RabbitMQ AMQP C++

智能感知编码优化与落地实践

Baidu AICLOUD

视频编解码

华为弹性云服务器ECS,帮助企业节省成本上云成本

平平无奇爱好科技

云计算,

nvmf协议

linux大本营

网络协议 nvme RDMA技术

写一个epoll的服务端程序

linux大本营

事件驱动 epoll C++ I/O 多路复用

【Python实战】Python采集最低战力信息

BROKEN

三周年连更

Last Week in Milvus

Zilliz

Milvus Zilliz 向量数据库

华为云全球加速GA,让企业获得更优质的服务体验

平平无奇爱好科技

华为云WAF设置要塞,筑起企业网络安全万里长城

轶天下事

敏捷宣言和原则

老王同学

读书笔记

如何执行mysql文件

linux大本营

MySQL 数据库

constchar*类型的实参与char*类型的形参不兼容

linux大本营

指针 const C++

【Python实战】Python采集电影评论

BROKEN

三周年连更

CouldNOTfindGMP(missing:GMP_LIBRARYGMP_INCLUDE_DIR)CallStack(mostrecentcallfirst)

linux大本营

Linux GNU cmake

ShareSDK QQ平台注册

MobTech袤博科技

TypeScript 函数 详解

程序员海军

Vue3 Typescript 三周年连更

Go Mutex:保护并发访问共享资源的利器

陈明勇

Go golang mutex 互斥锁 三周年连更

华为云弹性公网IP服务,实惠又便捷!

轶天下事

linux如何设置一个环境变量,在shell退出之后也不会失效

linux大本营

Linux Shell export

一个能在Linux下使用C++编写的访问RabbitMQ接收发送数据的可编译代码

linux大本营

RabbitMQ 消息队列 C++

汽车制造数字化转型如何做?有哪些可行性案例?

优秀

数字化转型 汽车制造

c语言如何用宏来实现字符串到函数的映射?

linux大本营

C语言 映射函数

对标阿里P8级Java面试题及答案整理(2023速成版,7天就能吃透)

收到请回复

详细讲解spdk里的examples/nvmf/nvmf/nvmf.c文件

linux大本营

nvme 文件存储

斩获四奖|海泰方圆荣登网信自主创新尖锋榜

电子信息发烧客

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