写点什么

大规模运行 MongoDB 应该知道的 10 件事

2014 年 3 月 17 日

MongoDB 的首席解决方案架构师 Asya Kamsky 最近发表了一篇文章,概括了大规模运行 MongoDB 需要知道的 10 件事。

  1. MongoDB也需要DevOpsMongoDB 是一个数据库。和任何其他的数据存储一样,它也需要容量计划、调整、监控和维护。不要因为它很容易安装、入门,同时与关系型数据库相比能够更加自然地满足开发人员的范例就认为 MongoDB 不需要适当的照顾和喂养。开发时它能在小样本数据集上超快地运行并不意味着你就不需要良好的模式、索引策略以及产品环境所需要的正确的硬件资源了。但是如果你准备的很好,并且理解最佳实践,那么运营大型 MongoDB 集群就会变得很无聊,而不是令人非常头痛。
  2. ** 成功的MongoDB用户会监控所有的事情,同时会做好增长的准备。** 在任何数据库系统中跟踪当前的容量以及容量计划都是基本的实践,MongoDB 也是如此。你需要知道集群现在能够支撑多少工作,最高使用率时它会处理哪些需求。如果你没有注意到服务器上增长的负载,那么最终会遇到没有足够容量的错误。监控MongoDB 可以使用 MongoDB 管理服务(MMS),通过查看操作计数器(opscounters)图表可视化自己的操作:
  3. 你可能并不希望系统随着使用量的增长出现性能扩展障碍。 根据大量用户的部署经验,性能瓶颈通常是(按顺序):
  • 应用程序访问模式没有使用最优的模式设计
  • 索引不佳或者缺失索引,抑或有太多不必要的索引
  • 磁盘较慢 / 磁盘 IOPS 不足
  • 索引没有足够的 RAM

事实证明,在真正的大型部署实践中对性能影响最大的是模式设计与应用程序需求的契合程度。而缺少索引、索引错误或者索引太多则是影响性能的第二大因素。在模式设计非常完美,索引也最优的情况下,磁盘 IO 吞吐能力就成了下一个限制因素,尤其是写吞吐量。RAM 不足会引发很多页错误,同时也会增加磁盘 IO 的压力。
4. ** 很多成功的MongoDB用户使用单复制集。** 太早分片可能是过早优化,并不是每个 MongoDB 部署都需要分片。分片处理非常特殊的需求,不能不加思索地认为它就是解决“数据库很慢”的最佳方案。如果你的协调模式非常差劲或者有错误索引,那么分片并不能解决问题,相反的你最终会得到一些差劲的协调和差劲的执行碎片。当单台机器或者复制集上的某种特殊资源成为瓶颈,同时基于成本的考虑无法添加更多这种资源的时候才适合分片。你可能需要更多的磁盘 IO 吞吐量,或者更多的内存,或者更多的存储,再或者更多的并发,这种情况下分片才是有意义的。
5. ** 即使没有将整个数据库放在内存中,MongoDB依然能够取得非常好的性能。** 对于 MongoDB 常见的一个误解是:为了获得更好的性能需要将整个数据库放在内存中。这可能是最错误的一件事情,因为这依赖于集群正在处理的负载的类型。有一些标志和指标能够告诉你:相对于你放到数据库上的负载类型你所拥有的内存数量是否充足。正如你所看到的,随着数据库大小的增长,能够放到内存中的相关部分将会受限于可用物理内存的大小。如果内存的数量不能满足性能需求,那么你将会看到页面错误,随着页面错误率的上升,opcounters 最终会低于期望值。


6. 必须将数据写刷新到磁盘。如果磁盘利用率达到了 100%,那么处理更多写操作的速度比起现在得不到丝毫的提升。可以通过 MMS 中的“Background flush average”图表查看将数据文件中的脏页刷新到磁盘花费了多长时间。通过这种趋势你会发现,随着写操作的增长,刷新将花费更多的时间。这种问题可以通过使用更快的磁盘解决,将工作拆分到更多的分片上,或者调整应用程序使之减少写数据的总量。你应该记住:写入的所有内容都会被刷新到磁盘两次——立即刷新到日志同时周期性地刷新到数据文件。将这两种操作分离到不同的物理设备上将会消除它们对可用磁盘 IO 带宽的竞争。

7. ** 复制 != 备份。** 所有人都清楚备份的重要性。但是为什么备份这么重要呢? 想必是因为当某些影响所有复制集节点的灾难性事件发生的时候我们可以恢复数据。复制并不是备份的原因是:它并不能让你避免人为错误——例如某些人突然删除了产品数据,或者部署了错误版本的应用程序代码以致于搞乱了部分或者所有数据。必须要有一个能够让我们从这种场景中恢复数据的备份。通过文件系统快照 mongodump 或者 MMS 备份练习数据恢复。第一次从备份恢复产品数据的操作不应该发生在真正的“数据紧急事件”发生的时候。
8. 复制集的健康不仅仅是复制延迟。“复制延迟”仅仅是复制集健康状况的指标之一。关注复制操作日志(oplog)窗口和监控复制延迟一样重要。它表示的是基于现在的写流量完全“滚动” oplog 所要花费的时间。换句话说,它指的是将一个复制节点拿下来以后依然能够重新加入集合而不必对所有数据进行重新同步的时间。随着时间的推移,复制操作日志窗口将会随着写负载的变化而浮动。流量高峰时窗口会缩短。这在容量计划中是非常重要的,你需要为最繁忙的数据吸收时间做好准备。下面是 MMS 中的一个并行视图,它展示了整个复制集的复制操作日志窗口。
9. MongoDB并不清楚数据需要什么样的安全级别。和其他数据库一样,你应该遵循最小特权原则。必须自己配置数据库的安全。不要让所有人都能访问你的数据。打开 MongoDB 自己本身的安全机制是非常重要的,但是这样也锁定了从任何地方对集群的访问,除非你确实认为自己的客户端进程可以在那里运行。只修改 MongoDB 进程的默认端口并不能保证安全。
10. 没必要修改引擎里面的东西。 除非文档或者 MongoDB 支持告诉你做一些非常特殊的事情,否则你没有必要直接修改系统集合、本地、管理或者配置数据库。你可以借助于管理命令和 shell 执行所需的操作,如果数据库并不能按照期望运行,或者某些地方发生了错误,那么成功的钥匙并不是试图通过直接操作内部的“bits”强制它运行。你需要熟悉的唯一一个“特殊的”、由系统产生的集合是分析器集合,定期地分析你的查询是确保事情按照期望运行的一个非常好的方式。


感谢程显峰对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 3 月 17 日 08:429572
用户头像

发布了 321 篇内容, 共 102.2 次阅读, 收获喜欢 6 次。

关注

评论

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

中国计算机软件开发合同纠纷分析报告(2019-3)

朱又生

项目管理 计算机软件开发合同纠纷 风险管理 司法大数据

SpreadJS 纯前端表格控件应用案例:医疗行业智能报表系统

Geek_Willie

IMC御用设备到底有多强?英特尔携手掠夺者呈现“飞”一般5GHz电竞盛宴

飞天鱼2017

快速学习秘诀:费曼学习法

池建强

学习

SpreadJS 纯前端表格控件应用案例:生产采购管理软件

Geek_Willie

架构师训练营第十周作业

一剑

中国计算机软件开发合同纠纷分析报告(2019-1)

朱又生

项目管理 计算机软件开发合同纠纷 风险管理 司法大数据

中国计算机软件开发合同纠纷分析报告(2019-2)

朱又生

项目管理 计算机软件开发合同纠纷 风险管理 司法大数据

第十周作业

晨光

Oracle常用命令

阡陌r

不断壮大的电竞生态——英特尔大师挑战赛携手李宁中国选手等你来战!

飞天鱼2017

架构师训练营第10周

大丁💸💵💴💶🚀🐟

软件规模扩张与其组织粒度的进化

superman

中台 微服务 服务化改造

低/零代码的认知误区有哪些?

代码制造者

编程语言 低代码 零代码 信息化 开发应用

将设计模式应用到日常的curd中-模板方法和装饰器

LSJ

Java 设计 设计模式 装饰器 模板方法

信息管理软件需求分析阶段的实践经验及论述(2010年)

朱又生

项目管理 产品经理 需求分析 用户需求调研

RushPlayer“一键下马”系列之-JavPlayer

flow

第十周总结

晨光

央行清算总中心与三家银行签署区块链福费廷交易平台合作协议

CECBC区块链专委会

区块链技术 人民银行

微服务的认识

chenzt

微服务

石印掌纹

娱乐至穷

北柯

学习 互联网 娱乐 抖音

35岁腾讯员工被裁员感叹:北京一套房,存款700多万,失业好焦虑

程序员生活志

程序员生活

Flink 支持的重启策略有哪些

古月木易

flink

anyRTC 4.0 以心铸造,以梦相承

anyRTC开发者

anyRTC 4.0 官网升级

第四届IMC再起烽烟 极致性能助战力升级!

飞天鱼2017

如何通过electron构建桌面跨平台音视频应用

ZEGO即构

音视频 Electron RTC

即大数据后-贵阳能否成为区块链的机遇之城?

CECBC区块链专委会

区块链 大数据 贵阳

华章科技好书5折优惠,满99再减10元

华章IT

Python AI 数字化转型 Java 25 周年 计算机科学丛书

week10 学习总结

任小龙

只加两行代码,为什么用了整整两天时间?

程序员生活志

编程 bug

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

大规模运行MongoDB应该知道的10件事-InfoQ