当MongoDB试图获取不在内存中的数据时就会发生页面错误。如果有空闲的内存,则操作系统会定位到硬盘上的页面中并把数据直接加载到内存中。然而,如果没有足够的内存,操作系统必须把内存中的某个页面数据写入硬盘中,当应用取数据时,把需要的数据页读到内存中。这个过程很耗时,比直接从内存中取数据要慢的多。
有些操作会无意间清楚很多内存中的工作集,这会严重影响系统性能。比如,有一个查询操作扫描了数据库中的所有文档,文档中的数据量超过了RAM的容量,这就会导致文档的所有数据被读取到内存中并导致内存中的工作集别挤出内存到硬盘中。其他一下数据库维护的操作也会引起这样的问题,比如数据库优化或者数据库恢复以及索引重建。
如果你数据库工作集超过了系统RAM的容量,可以考虑增大RAM容量或者增加数据库分片数量。有关这方面的讨论话题,请参考Sharding Best Practices中的有关章节。系统资源达到瓶颈之前部署分片是非常容易的,所以容量规划是一个成功项目的中的一个重要环节。
使用默认的WiredTiger存储引擎时,配置WiredTiger内部缓存大小可以参考
如果配置了MMAPv1,关于如何配置RAM大小可以参考:
MongoDB启动和配置 启动MongoDB同时提供了.ded和.rpm的包用户系统安装、升级、系统迁移以及系统配置。MongoDB的Windows安装包可以通过MSI下载的二进制文件安装,OS X的二进制文件也在tarball2中提供。
数据库配置用户应该把数据库的配置信息存放在mongod的配置文件中。这样系统管理员可以为整个集群实施合理的配置信息。配置文件支持mongod命令行提供的所有选项。MongoDB支持流行的自动化管理工具比如Chef和Puppet。Ops Manager 和 Cloud Manager平台可以自动配置复制集合分片集群的复杂拓扑,这些内容文档后面会提到。
升级建议用户经常升级数据库系统,不仅可以使用新系统中的最新特性以及稳定性,还能修复系统bug。系统升级应该现在非生产环境中测试。
MongoDB支持滚动升级,在不宕机的情况下完成升级,复制集中每个成员都可以单独升级,不会影响数据库的可用性。复制集中的每个成员可以运行不同版本的MongoDB,也可以配置不同的存储引擎。作为保障,升级前***参考MongoDB版本说明,看各个版本升级是否有特定的顺序要求,或者两个版本之间是否存在不兼容。Ops Manager 和Cloud Manager中,这些操作可以自动完成。
数据迁移用户应该进行评估并为应用做出设计出***数据模型,而不是简单的把原有系统的数据直接导入MongoDB中。传统关系型数据库中,数据更多的是以CSV这样的文件类型在系统之间进行迁移。MongoDB数据库可以接受CSV类型的文件系统,但是这只是数据迁移的第一步工作。通常来说,MongoDB的文档数据模型有很多优势和选择性,而这在关系型数据库是没有的。
Mongoimport 和mongoexport工具可以把JSON或者CSV文件导入或者导出到MongoDB文件系统中。这些工具只是在数据初始化的时候有用。Mongodump和mongorestore工具或者Ops Manager以及Cloud Manager备份工具可以在MongoDB系统之间数据迁移的时候用到。
把JSON文件导入系统中有很多选择,包括mongoimport,自定义脚本、ELT工具。
硬件以下的意见旨在为你的MongoDB系统的硬件提供高质量的指导。硬件的具体配置还要依赖于你的数据、查询频率、性能SLA、访问量以及底层硬件设施的容量。MongoDB有非常丰富的经验帮助客户选择合适的硬件并进行配置,我们会经常协助客户进行容量规划以及优化他们的MongoDB系统。当你为项目选择硬件时,可以查考以下资料,会有很大的帮助:Health Check、Operations Rapid Start, 以及Production Readiness consulting packages。
MongoDB对商业硬件支持度很高,对硬件需求和限制很少。通常来说,MongoDB会最大程度的利用RAM和CPU时钟速度。
内存MongoDB会最大程度的使用RAM以增加系统性能。一般来说,RAM越大越好。跟其他数据库一样,当工作负载开始请求不在RAM中的数据时,MongoDB的性能下降。MMAPv1会让操作系统自己去管理RAM的使用,而默认的WiredTiger存储引擎则是更多的由用户决定分配多少RAM给WiredTiger内部缓存,默认的是RAM*60%-1G,WiredTiger也会利用操作系统的文件缓存系统,而文件缓存系统则会利用系统中剩余的可以内存。
存储MongoDB不需要共享存储,可以使用本地附加的存储以及固态硬盘。MongoDB中的大多数磁盘访问模式都没有顺序属性,因此客户可能会使用SSD来获得大幅的性能提升。由于MongoDB的非顺序访问模式,商用SATA旋转硬盘的表现可以跟昂贵的旋转驱动器相媲美,与其把预算花在更贵的旋转驱动上,不如把这些开支放在增加RAM以及使用SSD上来的更高效。使用SSD的另一个好处是,如果内存中的工作集满了,则硬盘中的闪存会提供性能优势。