- Administration >
- 管理概念 >
- Operational Strategies >
- 生产环境指南
生产环境指南¶
本篇详细描述了(尤其在生产环境下)影响MongoDB的系统配置。
注解
MongoDB Management Service (MMS) 是一项托管监控服务,该服务收集和聚合诊断数据以直观地表示MongoDB部署的性能和操作。更多信息,请参见 MMS Website 和 MMS documentation。
软件包¶
MongoDB¶
确定你使用的是最新稳定的发行版本。所有的发行版本都可以在 Downloads 页面得到。哪怕你最终选择通过包管理器安装,该页面仍是判定哪个是最新版本的好地方。
在生产中总是使用64位构建版本。用于测试和开发环境的32位版的MongoDB由于不能存储大于2GB的数据不适用于生产部署。更多信息请参见 32-bit limitations。
32位构建版本是为了支持开发机器的使用而存在的。
操作系统¶
MongoDB发行版目前支持Mac OS X,Linux, Windows Server 2008 R2 64位,,Windows 7 (32位和64位), Windows Vista和Solaris平台。
注解
如果系统的 GNU C Library (glibc)可用,MongoDB将使用该库。MongoDB最低需要 glibc-2.12-1.2.el6 版本的glibc以避免之前版本中的一个已知漏洞。为了更好的效果,请使用至少2.13版本。
并发¶
在之前版本的MongoDB中,所有的写操作争用MongoDB实例中一个唯一的读写锁。从2.2版本开始,(实例中的)每个数据库拥有一个读写锁,该锁使得数据库可以进行并行读,但是该锁给予每个数据库的单一写操作独占权限。更多信息请参见 Concurrency 页面。
日志¶
MongoDB对磁盘 journal 使用 预写式日志技术 以确保MongoDB能在崩溃或其它严重失败之后迅速恢复 write operations。
为了确保 mongod 能够在崩溃之后恢复数据文件并保持数据文件的有效状态,请启用日志。更多信息请参见 Journaling。
网络¶
使用可信赖的网络环境¶
总是在 可信赖的环境 中运行 MongoDB,并通过网络规则阻止 所有 未知的机器、系统和网络的接入。与任一对网络接入敏感的系统一样,你的MongoDB部署应该只能被需要访问的指定系统访问,比如应用服务器、监控服务和其它MongoDB组件。
注解
默认情况下, authorization 没有开启, mongod 假定这是一个可信赖的环境。当你需要时,你可以开启 security/auth 模式。
更多信息请参见 Security Section 中的文档,尤其是:
对于Windows用户,在Windows上部署MongoDB时可以参考 Windows Server Technet Article on TCP Configuration。
硬件考量¶
MongoDB特意设计为从核心支持硬件,几乎没有对硬件的要求或限制。MongoDB的核心在小端格式的硬件上运行,主要是x86/x86_64处理器。客户端库(例如驱动)可以在大端或小端格式的系统中运行。
硬件要求和限制¶
最高性能的MongoDB部署的硬件具有如下特征:
分配足够的内存和处理器¶
和所有的软件一样,更多的内存和更快的处理器时钟频率对于性能很重要。
一般情况下,数据库不是计算密集型的。正因为如此,增加处理器核数(对性能)会有帮助,但是并不会带来明显的边际收益。
MongoDB和NUMA硬件¶
重要
本节关于NUMA的讨论仅适用于拥有 多个 物理处理器的Linux系统,因此,本节的讨论绝对不会影响那些 mongod 实例运行在其它类UNIX系统、Windows或只有一个物理处理器的Linux系统上的部署。
在非统一内存访问(NUMA)的系统上运行MongoDB会导致许多运行问题,包括剪短时间的低性能和很高的系统进程使用率。
当在NUMA硬件上运行MongoDB时,你应当为MongoDB禁用NUMA并设置交错的内存策略作为替代。
注解
当被部署到基于Linux的系统时,MongoDB2.0及以上版本在启动时会检查这些设置,如果该系统是基于NUMA的,MongoDB将会打印一个警告。
为了禁用NUMA并设置交错的内存策略,使用 numactl 命令并以如下方式启动 mongod :
numactl --interleave=all /usr/bin/local/mongod
然后,使用如下命令在 proc 设置里禁用 zone reclaim :
echo 0 > /proc/sys/vm/zone_reclaim_mode
为了完全禁用NUMA,你必须执行这两个操作。更多信息,请参见 Documentation for /proc/sys/vm/*。
参见文章 The MySQL “swap insanity” problem and the effects of NUMA ,它描述了NUMA对数据库的影响。这篇博客文章描述的是NUMA对MySQL的影响,但是对于MongDB来说,问题是类似的。文章介绍了NUMA和它的目标,并阐明了为何这些目标不能与生产环境下的数据库兼容。
硬盘和存储系统¶
交换空间¶
为你的系统指定交换空间。分配存储空间可以避免内存争用的问题并可以防止Linux系统的OOM Killler杀死 mongod。
The method mongod uses to map memory files to memory ensures that the operating system will never store MongoDB data in swap space.
磁盘阵列(RAID)¶
大多数的MongoDB部署应当使用支持RAID-10的硬盘。
RAID-5和RAID-6通常不能提供足够的性能来支持MongoDB的部署。
避免RAID-0和MongoDB的部署。尽管RAID-0提供了良好的写入性能,但它也带来了有限的可用性并且可导致读取操作的性能降低,尤其是在使用亚马逊的EBS卷时。
远程文件系统¶
不推荐和网络文件系统协议(NFS)一起使用MongoDB,因为其某些版本性能不佳。
当把数据文件和日志文件都托管在NFS上时会出现性能问题。如果你把日志放在本地或 iscsi 卷,你可以体验到更好的表现。如果你必须使用NFS,加入如下的NFS选项到你的 /etc/fstab 文件中: bg, nolock, 和 noatime。
分离各组件到不同的存储设备¶
为了提高性能,考虑将你的数据库的数据,日志和记录分离到不同的存储设备上,(当然),这取决于你的应用的访问和写入模式。
注解
这会影响你创建快照风格的数据备份的能力,因为这些文件将会在不同的设备和卷上。
虚拟设备的调度¶
为了最佳的性能,通过虚拟机管理程序连接到虚拟机实例的本地块设备应当使用 noop 调度程序。 noop 调度程序允许操作系统将I/O调度推迟到下层的虚拟机管理程序。
架构¶
安全写级别¶
Write concern 描述了MongoDB报告写操作成功时提供的保证。安全写级别的强度决定了保证的等级。当插入,更新和删除(操作)拥有 弱 安全写级别时,写操作快速返回。在一些失败的例子中,在弱安全写级别下发布的写操作不会被持久化。在 强 安全写级别下,为了确认写操作,客户端会在给MongoDB发出写操作后等待。
为了更好地处理应用的特殊需求,MongoDB提供了各种不同的安全写级别等级。客户端应当调整安全写级别,以保证最重要的操作对整个MongoDB部署都能成功持久化。对于其它不是那么重要的操作,客户端可以调整安全写级别以保证更快的性能而不是保证对整个部署的持久化。
更多关于如何为你的部署选择一个合适的安全写级别等级的信息,请参见文档 Write Concern。
复制集¶
请参见文档 Replica Set Architectures 对复制集部署的架构考量有个概览。
分片集群¶
请参见文档 Sharded Cluster Production Architecture 对生产环境下推荐的分片集群架构有个概览。
平台¶
Linux上的MongoDB¶
重要
以下的讨论只适用于Linux,因此不会影响那些 mongod 实例运行在其它类UNIX系统或Windows上的部署。
内核和文件系统¶
当在生产环境中将MongoDB运行在Linux上时,推荐使用Linux内核为2.6.36及以上版本。
MongoDB在使用数据库文件之前预分配其数据库文件,而且常常会创建较大的文件。正因为如此,你应当使用 Ext4和XFS文件系统:
一般来说,如果你使用Ext4文件系统,请使用最低 2.6.23 版本的Linux内核。
一般来说,如果你使用XFS文件系统,请使用最低 2.6.25 版本的Linux内核。
某些Linux发行版需要不同的内核版本支持ext4和(或)xfs的使用:
Linux发行版
文件系统
内核版本
CentOS 5.5 ext4, xfs 2.6.18-194.el5 CentOS 5.6 ext4, xfs 2.6.18-238.el5 CentOS 5.8 ext4, xfs 2.6.18-308.8.2.el5 CentOS 6.1 ext4, xfs 2.6.32-131.0.15.el6.x86_64 RHEL 5.6 ext4 2.6.18-238 RHEL 6.0 xfs 2.6.32-71 Ubuntu 10.04.4 LTS ext4, xfs 2.6.32-38-server Amazon Linux AMI release 2012.03 ext4 3.2.12-3.2.4.amzn1.x86_64
重要
MongoDB需要 目录 支持 fsync() 的文件系统。例如,HGFS和Virtual Box的共享文件夹 不支持 该操作。
推荐配置¶
关闭存放 database files 的存储卷的 atime。
按照文档 ulimit 中的建议,设置文件描述符,-n,以及用户进程限制(ulimit),``-u``,大于20,000。过小的用户进程限制将在大量使用时影响MongoDB,并会产生错误,导致无法连接MongoDB进程和服务中断。
禁用 transparent huge pages ,因为MongoDB用常规的(4096字节)虚拟内存页性能更好。
禁用BIOS中的NUMA。如果不能禁用,请参见 MongoDB on NUMA Hardware。
确保存储数据库万能键的块设备的预加载设置是合适的。对于随机存取使用模式,设置小的预加载值。32(16kb)的预加载常常运转良好。
对于标准的块设备,您可以运行 sudo blockdev --report 获取预加载设置, sudo blockdev --setra <value> <device> 更改预加载的值。更多信息请参见您特定操作系统的系统手册。
使用网络时间协议 (NTP) 来同步您各个主机的时间。这是在分片集群中尤其重要。
虚拟环境的MongoDB¶
本节描述了在一些更常见的虚拟环境中运行MongoDB需要考虑的事情。
对于所有平台,参考 虚拟设备的调度。
EC2¶
MongoDB与EC2是兼容的,不需要特地修改配置即可部署到该环境中。
或者,你可以选择获取一套把MongoDB和亚马孙的Provisioned IOPS一起打包的Amazon Machine Images(AMI)。Provisioned IOPS可以极大地提高MongoDB的性能和易用性。更多信息,请参见 this blog post。
性能监控¶
备份¶
要备份您的MongoDB数据库,请参考 MongoDB Backup Methods Overview。