MongoDB的容量规划及硬件配置
mongo是基于内存的数据库,应尽量将工作集中的数据全部加载到内存中,即内存应大于工作集
本文译自Chad Tindel的英文博客: http://www.mongodb.com/blog/post/capacity-planning-and-hardware-provisioning-mongodb-ten-minutes 。
大部分MongoDB部署都运行于多台服务器的集群中,相对于传统数据库,这增加了容量规划及配置方面的复杂性。系统架构师 Chad Tindel 在MongoDB 世界大会上的硬件配置演讲 中为实施团队提供了规划MongoDB部署大小的最佳实践。
这里有两个与MongoDB架构相关的重要概念能够帮助理解该演讲:
- 分片。 分片即MongoDB在服务器之间划分数据的一项技术。MongoDB能够自动在分片之间平衡数据,并且能够在不需要数据库离线的情况下增加和删除分片。
- 复制。 为了保证高可用性,MongoDB维护了许多数据的冗余备份。复制被嵌入于MongoDB,并且在不需要专业网络的情况下就可以在广域网内工作。
Chad在演讲开始的时候提到了一些需要记住的重要建议,然后提到了一些用户案例:
- 预先列出你的性能需求。 确定你需要存储的数据量。通过分析查询来估计你一次需要读取的数据量,从而确定工作集的大小。计算生产环境中你希望在每秒时间内发送的请求数目,设置好要求的正常运行时间百分比,确定你可以忍受的延迟时间。
- 计划一个PoC概念验证测试。
MongoDB的可扩展性允许你在10%-20%的硬件上使用10%-20%的数据运行应用。通过使用这个方法,你可以进行模式、索引设计并且了解查询模式,然后重新定义你估计的工作集大小。在一台机器上检测性能,然后在必要的情况下增加复制和分片。将这种配置作为一个沙盒,用于测试该应用的连续修订版本。
你可以通过在MongoDB中执行下面的命令来估计您的工作集大小
db.runCommand( { serverStatus: 1, workingSet: 1 } )
- 使用真实的工作负载进行测试。 向上拓展概念验证测试,但是直到使用真实世界的数据以及性能要求进行大量测试之后才开始部署。
- 基于新的需求不断监测和调整。 用户数量的增加经常会带来更多查询以及一个更大的工作集,新索引也会促使一个更大的工作集。应用可能会随着时间的变化而改变它的读写比例。像MongoDB管理服务(MMS)以及mongoperf之类的工具帮助你监测系统性能参数的改变。需求改变的同时,你可以调整你的硬件配置。请注意:通过使用MongoDB,你可以不必关闭数据库而增加和删除分片或复制集。
Chad接着在演讲中展示了两个真实的用户案例。
案例 #1 :某西班牙银行
该银行希望存储6个月的日志。每个月的数据需要3TB的空间。那么6个月的数据需要使用6 x 3 = 18 TB的空间。他们知道他们希望分析上个月的日志,因此工作集的大小被设为:1个月的数据(3TB)加上索引(1TB),即一个4TB的工作集。
在概念验证环境中,他们选择使用约10%的数据(2TB)。生产需求需要一个4TB大小的工作集,4TB/18TB数据再乘上我们2TB的概念验证数据,从而得到444GB的概念验证工作集大小。用户最多只能提供每台128GB容量的服务器,因此在概念验证环境中,他们选择采用4个分片,每个分片有128G存储。4 x 128GB = 512GB能够满足444GB的要求。每个分片上用于读取可用性及冗余的3个复制集成员为我们提供了4 x 3 = 12台物理机器。两台应用服务器运行mongos,虚拟机上的三台配置服务器进行概念验证配置。
为满足在128GB的服务器中存放4TB部署工作集及18TB数据,他们选择分割成36个分片,每个分片有128GB的内存(RAM)及512GB的可用存储。总的看来:一共有36 * 128GB = 4.6TB内存(RAM), 36* 512GB =18TB的可用存储。和上面的概念验证系统一样,他们用2台应用服务器上运行mongos,在虚拟机上运行3台配置服务器。同上,每个分片有一个三节点的复制集,那么36 分片* 3 复制集节点= 108 台物理机。
注意:MongoDB允许概念验证及生产配置使用相同的、配置有128GB内存(RAM)及512GB可用存储的标准硬件结构单元。这样就允许用户在将真实的生产节点添加进生产集群之前在概念验证集群中进行测试。
案例 #2 :大型在线零售商
该零售商希望将他们的产品目录从SQL Server中迁移到MongoDB中。MongoDB在存储目录信息方面有很大的优势。不像SQL数据库,MongoDB的动态模式可以为每个产品存储不同的属性,并且不需要在那些不存储相同信息的其它产品信息中强制放置一个空白的字段占位符。
该零售商希望分别为东、西海岸的顾客建立自己的数据中心,因此他们选择运行一个主动/主动配置。他们只在晚上最空闲的时间批量写入新的或者被修改的目录。在使用的峰值只执行读取操作。
他们有4,000,000产品库存单位,每一个都有平均30KB大小的JSON文档。他们需要为一个特定产品通过_id或者像“桌子”或“硬件驱动”之类的类别提供搜索查询服务。大多数类别请求将会检索平均大概72个文档。一个追踪该类别树所有链接的搜索引擎爬虫将会检索200个文档。
计算结果显示:平均每个产品都会出现在2个类别中。该零售商最初想根据类别进行分片,在多个类别中同时出现的产品进行重复存储。平均属于两个类别的4,000,000产品乘上30KB每库存单位为:8,000,000 乘上 30KB 等于240GB加上30GB索引,一共270GB数据。
MongoDB咨询工程师建议该零售商使用不分片的复制集,因为该应用需要很高的读取性能,但是只需要在空闲时间进行单独的批量写操作。整个270GB的工作集适合存放于该零售商希望使用的大型思科UCS服务器的384GB可用内存中,不需要在分片之间分割内存工作集,因此简化了他们的部署架构。
MongoDB工程师推荐 使用一个4节点的复制集横跨2个数据中心,在一个第三方位置建立一个投票机作为从节点以防主服务器出现故障。这样就会允许每个数据中心的任一服务器都可以关机维护或者出现故障的情况下,其它服务器还能够正常运行。Mongos的“最近读取”查询调节器将会基于最近延迟选择最近的服务器。

然而,令人吃惊的是,该零售商决定在他们公司的VMWare云平台上而不是他们的大型思科服务器上部署该系统。他们的IT部门不会提供任何一个内存(RAM)超过64GB的VMWare节点。为了解决64GB的限制,他们部署了3个分片,每个分片上部署4个节点(两个东海岸、两个西海岸加上投票机):64GB x 3 = 192GB。尽管这样不能够维持270GB的工作集,他们仍然决定承担插拔所带来的任何后果。他们保留了增加第四个分片以维持内存中更多工作集的可能性。
从这些案例学到的硬件配置教程
- 对于读密集型应用,规划好服务器大小以保证在内存中能支撑整个工作集并且进行复制以得到更高的可用性。
- 如果你服务器的内存(RAM)不能够保证在内存中容纳工作集,进行分片以从多个复本集群中整合内存(RAM)。
- 使用与部署相同的服务器硬件创建一个概念验证系统。通过这个方法,你可以在你的概念验证系统中配置和测试一个服务器。接着,你可以根据需要,在扩展一个复制集或者增加一个分片进行拓展时,直接将其放入部署系统中。
MongoDB的容量规划及硬件配置的更多相关文章
- Hbase集群类型|集群配置|服务器选型|磁盘容量规划
HBase和Hadoop的集群类型 1.单机模式 主要用于开发工作,一台机器上运行所有的守护进程,或者一台机器运行多个虚拟机.一般用于评估和测试. 2.小型集群 20台机器以内的集群,不同的机器运行不 ...
- 二 mysql容量规划,性能测试
何为基线- 当前运行状态记录.快照- 用于和未来的状态进行对比- 未来时刻产生关键事件后的新状态,作为下一个基线基线数据收集,关注哪些要点- 系统负载- MySQL运行状态- 相应的业务指标1.系统& ...
- Elasticsearch集群规模和容量规划的底层逻辑
转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...
- 【Spark学习】Apache Spark集群硬件配置要求
Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4135912.html 目录 存 ...
- C#程序中获取电脑硬件配置信息的一种方法
本文介绍获取cpu信息和内存信息的方法,根据本文所举例的代码可以举一反三获取更多信息. 获取cpu名称的方法: public string GetCpuInfo() { ManagementObjec ...
- 为Hadoop集群选择合适的硬件配置
随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...
- 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-12-12)
说明: 争取做更多的实战性应用,分享更多的嵌入式技术,希望能在实际项目中帮到大家. (1)V7将大力加强对初学者的支持力度,已经更新至63章,下载链接,后37章和一批视频教程将加紧制作. (2)事隔五 ...
- 搭建高可用mongodb集群(一)——配置mongodb
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...
- 人机大战之AlphaGo的硬件配置和算法研究
AlphaGo的硬件配置 最近AlphaGo与李世石的比赛如火如荼,关于第四盘李世石神之一手不在我们的讨论范围之内.我们重点讨论下AlphaGo的硬件配置: AlphaGo有多个版本,其中最强的是分布 ...
随机推荐
- ScrollView 和 ListView 冲突解决方案
网上说了很多阿,什么linearLayout 实现listView 什么的.还设置高什么的. 其实,你们可能忘记了,如果出现 ScrollView 和 ListView 同时出现,那就是设计错误了. ...
- MySQL SELECT 语句
SELECT语句: products表例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1eWluZ18xMDAx/font/5a6L5L2T ...
- Python的不同实现
这里的实现指的是符合Python语言规范的Python解释程序以及标准库等.这些实现虽然实现的是同一种语言,但是彼此之间,特别是与CPython之间还是有些差别的. 下面分别列出几个主要的实现. 1. ...
- 算法笔记_073:哈密顿回路问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 什么是哈密顿回路? 引用自百度百科: 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图, ...
- 从cocos2dx到cocos2dhtml5的不同之处
首先cocos2dhtml5使用javascript编程, 严格区分大写和小写. 1.新建cocos2dhtml5项目. 直接复制引擎自带的helloworld.改一下目录名字就可以. 2.新增js文 ...
- 串的匹配:朴素匹配&KMP算法
引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式 ...
- LoadRunner+Android模所器实现抓包并调试本地服务端
步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个:Record Emulator........ 3: 选择下一步后, ...
- Apache Spark(转)
来自:维基百科,自由的百科全书 Apache Spark是一个开源簇运算框架,最初是由加州大学柏克莱分校AMPLab所开发.相对于Hadoop的MapReduce会在运行完工作后将中介数据存放到磁盘中 ...
- 简单易懂的Dart》 - Dart语言中文简明教程
转自:https://www.blackglory.me/straightforward-dart/ Dart是Google公司发布的网络编程语言,其诞生的目的是为了让广大C类OOP程序员们克服Jav ...
- 基于Python-Flask实现的网站例子
概述 使用Flask写的体育网站 包括(注册 论坛 文章评论 组建战队 后台管理)等功能 示例地址文中有写 萌新 请多指教 详细 代码下载:http://www.demodashi.com/demo/ ...