最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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 的迁移不是连续的。

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

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

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

关注

评论

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

flutter系列之:UI layout简介

程序那些事

flutter 程序那些事 6月月更

APICloud可视化开发新手图文教程

YonBuilder低代码开发平台

App APICloud 低代码开发 移动端开发 可视化开发

Sealem Finance打造Web3去中心化金融平台基础设施

BlockChain先知

盲盒商城APP系统开发的软件特点和盲盒功能介绍

WDL22119

盲盒商城 盲盒开发 盲盒源码 盲盒H5开发 盲盒APP系统开发

2022 年 DevOps 路线图|Medium

观测云

Vue-5-模板语法-2

Python研究所

前端 6月月更

Tornado简介&&本专栏搭建tornado项目简介

孤寒者

Python tornado 6月月更

【6.3-6.10】精彩博文回顾

InfoQ写作社区官方

优质创作周报

Java—基础容器

武师叔

6月月更

Spark ShuffleManager

布兰特

大数据 spark

云数据中心中的SDN/NFV应用

穿过生命散发芬芳

SDN网络 6月月更

数据库每日一题---第8天:超过5名学生的课

知心宝贝

数据库 程序员 前端 后端 6月月更

线程池的创建

急需上岸的小谢

6月月更

数据的软删除—什么时候需要?又如何去实现?

翊君

6月月更

华为云鲲鹏DevKit代码迁移实战

乌龟哥哥

6月月更

APICloud 5月SDK发版说明

YonBuilder低代码开发平台

App 低代码 APICloud 可视化开发

【愚公系列】2022年06月 面向对象设计原则(五)-接口隔离原则

愚公搬代码

6月月更

Redis stream Java API实践

FunTester

改变世界的开发者丨玩转“俄罗斯方块”的瑶光少年

华为云开发者联盟

人工智能 华为云 俄罗斯方块

攻防演练 | 网络安全“吹哨人”:安全监控

青藤云安全

网络安全 主机安全 攻防演练

Web3生态去中心化金融平台——Sealem Finance

西柚子

锁机制

卢卡多多

锁机制 6月月更

为什么要开发分布式操作系统

LAXCUS分布式操作系统

分布式计算 分布式存储 超算 云边端协同 分布式操作

APICloud可视化开发丨一键生成专业级源码

YonBuilder低代码开发平台

App 低代码 可视化 APICloud 移动端开发

首批!青藤通过信通院CWPP能力评估检验

青藤云安全

网络安全 主机安全 信通院

如何使用物联网低代码平台进行工作表管理?

AIRIOT

低代码 物联网 低代码开发平台

存储引擎分析

工程师日月

6月月更

推开混合云市场大门,Lenovo xCloud的破局之道

脑极体

ServerLess Aws Lambda攻击与横向方法研究

火线安全

云安全

很流行的状态管理库 MobX 是怎么回事?

岛上码农

flutter ios 安卓开发 跨平台开发 6月月更

leetcode 130. Surrounded Regions 被围绕的区域(中等)

okokabcd

LeetCode 搜索 数据结构与算法

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