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的工作集,他们仍然决定承担插拔所带来的任何后果。他们保留了增加第四个分片以维持内存中更多工作集的可能性。

从这些案例学到的硬件配置教程

  1. 对于读密集型应用,规划好服务器大小以保证在内存中能支撑整个工作集并且进行复制以得到更高的可用性。
  2. 如果你服务器的内存(RAM)不能够保证在内存中容纳工作集,进行分片以从多个复本集群中整合内存(RAM)。
  3. 使用与部署相同的服务器硬件创建一个概念验证系统。通过这个方法,你可以在你的概念验证系统中配置和测试一个服务器。接着,你可以根据需要,在扩展一个复制集或者增加一个分片进行拓展时,直接将其放入部署系统中。
 

MongoDB的容量规划及硬件配置的更多相关文章

  1. Hbase集群类型|集群配置|服务器选型|磁盘容量规划

    HBase和Hadoop的集群类型 1.单机模式 主要用于开发工作,一台机器上运行所有的守护进程,或者一台机器运行多个虚拟机.一般用于评估和测试. 2.小型集群 20台机器以内的集群,不同的机器运行不 ...

  2. 二 mysql容量规划,性能测试

    何为基线- 当前运行状态记录.快照- 用于和未来的状态进行对比- 未来时刻产生关键事件后的新状态,作为下一个基线基线数据收集,关注哪些要点- 系统负载- MySQL运行状态- 相应的业务指标1.系统& ...

  3. Elasticsearch集群规模和容量规划的底层逻辑

    转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e416ae ...

  4. 【Spark学习】Apache Spark集群硬件配置要求

    Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4135912.html 目录 存 ...

  5. C#程序中获取电脑硬件配置信息的一种方法

    本文介绍获取cpu信息和内存信息的方法,根据本文所举例的代码可以举一反三获取更多信息. 获取cpu名称的方法: public string GetCpuInfo() { ManagementObjec ...

  6. 为Hadoop集群选择合适的硬件配置

    随着Apache Hadoop的起步,云客户的增多面临的首要问题就是如何为他们新的的Hadoop集群选择合适的硬件. 尽管Hadoop被设计为运行在行业标准的硬件上,提出一个理想的集群配置不想提供硬件 ...

  7. 【STM32-V7】STM32H743XIH6开发板,丰富软件资源,强劲硬件配置,大量软件解决方案持续更新中(2019-12-12)

    说明: 争取做更多的实战性应用,分享更多的嵌入式技术,希望能在实际项目中帮到大家. (1)V7将大力加强对初学者的支持力度,已经更新至63章,下载链接,后37章和一批视频教程将加紧制作. (2)事隔五 ...

  8. 搭建高可用mongodb集群(一)——配置mongodb

    在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过 ...

  9. 人机大战之AlphaGo的硬件配置和算法研究

    AlphaGo的硬件配置 最近AlphaGo与李世石的比赛如火如荼,关于第四盘李世石神之一手不在我们的讨论范围之内.我们重点讨论下AlphaGo的硬件配置: AlphaGo有多个版本,其中最强的是分布 ...

随机推荐

  1. 关于Web界面查看日志的权限问题

    关于Web界面查看日志的权限问题 @(Hadoop) 访问集群的8088端口,通过web ui查看作业日志时,发现没有权限查看,8088主界面右上角显示Logged in as : dr.who,即匿 ...

  2. [Android Pro] service中显示一个dialog 或者通过windowmanage显示view

    转载: http://blog.csdn.net/huxueyan521/article/details/8954844 通过windowmananger来在窗口上添加view的时候,需要设置aler ...

  3. DevExpress TreeList使用

    using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; us ...

  4. EffectiveJava(26)使用泛型类替代普通类

    使用泛型编写类比使用需要在客户端代码中进行转换的类型更加安全,并且对去其他程序员来说更加容易扩展,我们应该将可以用泛型代替的非泛型类优化 那么,如何将类泛型化呢? 这很简单.首先,给他的声明添加一个或 ...

  5. com.apple.installer.pagecontroller 错误 -1 pkg安装错误

    在网上下载了一个pkg 的安装文件: 在mac上安装一打就出现错误 原因是,文件从网上直接下载的,会出权限问题,需要修复安装软件的安装权限: 我的原因是,下载的是个rar的mac解压不了,就在线解压, ...

  6. v - bind

    1. 用于处理html标签的动态属性,即动态赋值(动态地绑定一个或多个特性,或一个组件 prop 到表达式) 2. 官网API <!DOCTYPE html> <html lang= ...

  7. 学习EF之CodeFirst二(数据库对应映射)

    在上一篇文章我们简单通过一个实例完成对CodeFirst的理解,我们通过实体生成数据库里的表和字段,虽然有一些默认的配置生成规定,但其实我们可以能过对实体进一步控制从而对生成的表字段进行更加符合我们要 ...

  8. centOS7 安装redis-3.2.6

    0.下载tar.gz包并解压到某个位置,然后cd进入解压后的目录(redis-3.2.6)下 1.安装 make MALLOC=libc 关于为什么这样做,参考redis-3.2.6目录下的READM ...

  9. 基于mybatis-generator代码生成工具改(链式方法实体版)

    概述 一直以来使用原生mybatis-generator的我发现有一个地方很不方便,即它生成的实体类的set方法返回值是void,而目前比较流行的则是链式set的写法,即set方法返回值不再是void ...

  10. AnjularJS小项目,小案例,练手,猜数字

    之前自己就学了点AnjularJS,都是在菜鸟教程里面将基础的只是大致过了一遍,没怎么自己动手做什么东西练练手,但还是觉得纸上得来终觉浅,得知此事要躬行啊,今天就做了个猜数字的小游戏,觉得效果还不错, ...