写点什么

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

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

关注

评论

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

golang实战之flag包,Redis灵魂14问

Java 程序员 后端

Helm部署的服务如何修改配置,nginx面试题负载均衡

Java 程序员 后端

CNCF 官方大使张磊:什么是云原生?,一个Java程序员的面试心得

Java 程序员 后端

gRPC学习之三:初试GO版gRPC开发,Java面试题中高级

Java 程序员 后端

HashMap(jdk1,Java程序员进大厂面试必备基础技能

Java 程序员 后端

GitHub调优热榜,居然是腾讯T9熬肝撰写的594页MySQL优化手册,简直太香

Java 程序员 后端

BATJ真题突击:Java基础+JVM,springboot和vue实战视频

Java 程序员 后端

BAT互联网大厂JAVA岗高频面试题总结,看完offer成功率再翻一番

Java 程序员 后端

Chrome上的这些灵魂插件太猛了,碾压其他同款,java架构师成长直通车分享

Java 程序员 后端

CoProcessFunction实战三部曲之一:基本功能,软件技术java工程师方向

Java 程序员 后端

Dubbo—SPI及自适应扩展原理,java项目系统架构图

Java 程序员 后端

Elasticsearch的高阶使用方法有哪些?,rabbitmq入门案例

Java 程序员 后端

GateWay 网关服务,java程序员进阶路线

Java 程序员 后端

Gradle构建多模块SpringBoot应用,mybatis面试常问问题

Java 程序员 后端

Apache Log4j2详解,【高级Java架构师系统学习

Java 程序员 后端

Bootstrap框架快速上手,这位阿里P7大牛分析总结的属实到位

Java 程序员 后端

CDH5部署三部曲之二:部署和设置,高薪程序员必会

Java 程序员 后端

dubbo实战之三:使用Zookeeper注册中心,java后端工程师面试题

Java 程序员 后端

Github又爆神作,阿里JVM垃圾回收全解小册全网开源!,已开源

Java 程序员 后端

GitHub上访问下载破百万的神仙文档《Java面试神技》看完我呆了

Java 程序员 后端

Github神作!2021Java秋招高级面试指南,吃透至少阿里P6

Java 程序员 后端

Docker下,两分钟极速体验Nacos配置中心,mysql视频教程百度网盘

Java 程序员 后端

Fluid 给数据弹性一双隐形的翅膀 -- 自定义弹性伸缩,多线程面试题2021

Java 程序员 后端

Hello Git快速入门,redis常见数据结构以及使用场景分析

Java 程序员 后端

hive学习笔记之七:内置函数,mybatis防止sql注入原理

Java 程序员 后端

Github点赞接近 70k 的Spring Cloud学习教程+实战项目推荐!牛批

Java 程序员 后端

Docker下的Nacos环境开发,mysql联合索引原理

Java 程序员 后端

透过表象看REST

Jxin

GitHub上标星90k+的《Java知识总结,java基础选择题填空

Java 程序员 后端

HashMap源码解析,操作系统原理与实践教程第三版答案

Java 程序员 后端

HashMap详解,hadoop源码分析完整版

Java 程序员 后端

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