此页面详细描述了会影响MongoDB的系统配置,尤其是在生产环境中运行时。
MMAPv1已删除
MongoDB 4.2删除了不赞成使用的MMAPv1存储引擎。要将MMAPv1存储引擎部署更改为WiredTiger Storage Engine,请参阅:
注意
MongoDB Atlas是一种云托管的数据库即服务。MongoDB Cloud Manager(托管服务)和Ops Manager(本地解决方案)提供对MongoDB实例的监视,备份和自动化。有关文档,请参阅Atlas文档, MongoDB Cloud Manager文档和Ops Manager文档
要在生产环境中运行,请参阅“ 推荐平台”以获取操作系统建议。
平台支持停产通知
Ubuntu 14.04 | 支持已在MongoDB 4.2+中删除。 |
Debian 8 | 支持已在MongoDB 4.2+中删除。 |
macOS 10.11 | 支持已在MongoDB 4.2+中删除。 |
即将停产的通知:
Windows 8.1 / 2012R2 | MongoDB将在将来的版本中终止支持。 |
Windows 8/2012 | MongoDB将在将来的版本中终止支持。 |
Windows 7 / 2008R2 | MongoDB将在将来的版本中终止支持。 |
平台 | 4.2社区与企业 | 4.0社区与企业 | 3.6社区与企业 | 3.4社区与企业 |
---|---|---|---|---|
亚马逊Linux 2 | ✓ | ✓ | ||
Amazon Linux 2013.03及更高版本 | ✓ | ✓ | ✓ | ✓ |
Debian 10 | 4.2.1+ | |||
Debian 9 | ✓ | ✓ | 3.6.5+ | |
Debian 8 | ✓ | ✓ | ✓ | |
RHEL / CentOS / Oracle Linux [1] 8.0及更高版本 | 4.2.1+ | 4.0.14+ | 3.6.17+ | |
RHEL / CentOS / Oracle Linux [1] 7.0及更高版本 | ✓ | ✓ | ✓ | ✓ |
RHEL / CentOS / Oracle Linux [1] 6.2及更高版本 | ✓ | ✓ | ✓ | ✓ |
SLES 15 | 4.2.1+ | |||
SLES 12 | ✓ | ✓ | ✓ | ✓ |
Solaris 11 64位 | 仅社区 | |||
Ubuntu 18.04 | ✓ | 4.0.1+ | ||
Ubuntu 16.04 | ✓ | ✓ | ✓ | ✓ |
Ubuntu 14.04 | ✓ | ✓ | ✓ | |
Windows Server 2019 | ✓ | |||
Windows 10 /服务器2016 | ✓ | ✓ | ✓ | ✓ |
Windows 8.1 / Server 2012 R2 | ✓ | ✓ | ✓ | ✓ |
Windows 8 /服务器2012 | ✓ | ✓ | ✓ | ✓ |
Windows 7 / Server 2008 R2 | ✓ | ✓ | ✓ | ✓ |
Windows Vista | ✓ | |||
macOS 10.13及更高版本 | ✓ | ✓ | ||
macOS 10.12 | ✓ | ✓ | ✓ | ✓ |
macOS 10.11 | ✓ | ✓ | ✓ | |
macOS 10.10 | ✓ | ✓ |
[1] | (1,2,3)的MongoDB仅支持运行红帽兼容内核(RHCK)的Oracle的Linux。MongoDB的确实不支持坚不可摧的企业内核(UEK)。 |
平台支持停产通知
Ubuntu 16.04 ARM64 | 支持已在MongoDB Community 4.2+中删除。 |
平台 | 4.2社区与企业 | 4.0社区与企业 | 3.6社区与企业 | 3.4社区与企业 |
---|---|---|---|---|
Ubuntu 18.04 | 仅社区 | |||
Ubuntu 16.04 | 仅限企业 | ✓ | ✓ | ✓ |
平台支持停产通知
Ubuntu 16.04 PPC64LE | 支持已在MongoDB 4.2+中删除。 |
平台 | 4.2企业 | 4.0企业 | 3.6企业 | 3.4企业 |
---|---|---|---|---|
RHEL / CentOS 7 | ✓ | ✓ | ✓ | ✓ |
Ubuntu 18.04 | ✓ | |||
Ubuntu 16.04 | ✓ | 从3.6.13开始删除 | 从3.4.21开始删除 |
平台 | 4.2社区与企业 | 4.0企业 | 3.6企业 | 3.4企业 |
---|---|---|---|---|
RHEL / CentOS 7 | ✓ | 4.0.6+ | 从3.6.2开始删除 | 从3.4.14开始删除 |
RHEL / CentOS 6 | ✓ | ✓ | 从3.6.14开始删除 | 从3.4.22开始删除 |
SLES12 | ✓ | 4.0.6+ | 从3.6.2开始删除 | 从3.4.15开始删除 |
Ubuntu 18.04 | 4.2.1+ | 4.0.6+ |
尽管MongoDB支持多种平台,但建议将以下操作系统用于生产环境:
也可以看看
确保您具有最新的稳定版本。
所有MongoDB版本均可在MongoDB下载中心 页面上找到。在MongoDB的下载中心页面是一个好地方,以验证当前的稳定版本,即使你是通过包管理器进行安装。
对于其他MongoDB产品,请参考MongoDB下载中心 页面或它们各自的文档。
WiredTiger支持读写器同时访问集合中的文档。客户端可以在进行写操作时读取文档,并且多个线程可以同时修改集合中的不同文档。
也可以看看
分配足够的RAM和CPU提供有关WiredTiger如何利用多个CPU内核以及如何提高操作吞吐量的信息。
MongoDB使用预写日志记录到磁盘日志上。日志记录可确保MongoDB可以快速恢复写到日志但mongod
由于崩溃或其他严重故障而终止的情况下无法写到数据文件的写操作。
使日记功能保持启用状态,以确保mongod
崩溃后能够恢复其数据文件并将数据文件保持在有效状态。有关更多信息,请参见日记。
从MongoDB 4.0开始,您无法指定--nojournal
选项或使用WiredTiger存储引擎的副本集成员。storage.journal.enabled:
false
3.2版中的新功能。
从MongoDB 3.6开始,如果写入请求确认,则可以使用因果一致的会话来读取自己的写入。
在MongoDB 3.6之前,您必须发出具有写入关注点的写入操作,
然后
对读取操作使用或关注读取,以确保单个线程可以读取自己的写入。{ w: "majority" }
"majority"
"linearizable"
若要使用关注级别"majority"
,副本集必须使用WiredTiger存储引擎。
您可以"majority"
为具有三名成员的主次仲裁器(PSA)架构的部署禁用读取关注。但是,这对变更流(仅在MongoDB 4.0和更早版本中)和分片群集上的事务有影响。有关更多信息,请参见禁用多数阅读关注。
始终在可信任的环境中运行MongoDB,该环境具有阻止来自所有未知计算机,系统和网络的访问的网络规则。与依赖网络访问的任何敏感系统一样,您的MongoDB部署仅应由需要访问的特定系统访问,例如应用程序服务器,监视服务和其他MongoDB组件。
重要
默认情况下,不启用授权,并mongod
采用可信环境。authorization
根据需要启用
模式。有关MongoDB支持的身份验证机制以及MongoDB中的授权的更多信息,请参阅身份验证
和基于角色的访问控制。
有关安全性的其他信息和注意事项,请参阅“ 安全性”部分中的文档,特别是:
对于Windows用户,在Windows上 部署MongoDB时,请考虑有关TCP配置的Windows Server Technet文章。
在版本3.6中进行了更改: MongoDB 3.6删除了MongoDB弃用的HTTP接口和REST API。
MongoDB的早期版本提供HTTP接口来检查服务器的状态,并可以选择运行查询。默认情况下,HTTP接口是禁用的。不要在生产环境中启用HTTP接口。
避免超载的连接资源mongod
或
mongos
通过调整连接池的大小,以满足您的使用案例的实例。从当前数据库请求的典型数量的110-115%开始,然后根据需要修改连接池的大小。请参阅
连接池选项以调整连接池大小。
该connPoolStats
命令返回有关分片群集中当前数据库mongos
和mongod
实例的打开连接数的信息
。
另请参阅分配足够的RAM和CPU。
MongoDB是专门针对商品硬件而设计的,几乎没有硬件要求或限制。MongoDB的核心组件运行在低端硬件上,主要是x86 / x86_64处理器。客户端库(即驱动程序)可以在大小端系统上运行。
在最低限度,确保每个mongod
或
mongos
实例访问两个真正的核心还是一个多核物理CPU。
该WiredTiger存储引擎是多线程的,可以采取额外的CPU内核的优势。具体来说,活动线程(即并发操作)的总数相对于可用CPU的数目会影响性能:
该阈值取决于您的应用程序。您可以通过试验和测量吞吐量来确定应用程序的最佳并发活动操作数。来自的输出
mongostat
提供有关(ar|aw
)列中有效读/写次数的统计信息。
通过WiredTiger,MongoDB可以利用WiredTiger内部缓存和文件系统缓存。
从MongoDB 3.4开始,默认的WiredTiger内部缓存大小是以下两者中的较大者:
例如,在总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB RAM()。相反,总内存为1.25 GB的系统将为WiredTiger缓存分配256 MB,因为这是总RAM的一半以上减去1 GB()。0.5 * (4 GB - 1 GB) = 1.5 GB
0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB
注意
在某些情况下,例如在容器中运行时,数据库的内存限制可能低于系统总内存。在这种情况下,此内存限制而不是系统总内存将用作最大可用RAM。
要查看内存限制,请参阅hostInfo.system.memLimitMB
。
默认情况下,WiredTiger对所有集合使用Snappy块压缩,对所有索引使用前缀压缩。压缩默认值是可以在全局级别配置的,也可以在收集和索引创建期间基于每个集合和每个索引进行设置。
WiredTiger内部缓存中的数据与磁盘格式使用不同的表示形式:
通过文件系统缓存,MongoDB自动使用WiredTiger缓存或其他进程未使用的所有可用内存。
要调整WiredTiger内部缓存的大小,请参阅
storage.wiredTiger.engineConfig.cacheSizeGB
和
--wiredTigerCacheSizeGB
。避免将WiredTiger内部缓存的大小增加到其默认值以上。
注意
该storage.wiredTiger.engineConfig.cacheSizeGB
限制WiredTiger内部高速缓存的大小。操作系统将使用可用的空闲内存进行文件系统缓存,从而允许压缩的MongoDB数据文件保留在内存中。此外,操作系统将使用任何可用的RAM来缓冲文件系统块和文件系统缓存。
为了容纳更多的RAM使用者,您可能必须减小WiredTiger内部缓存的大小。
默认的WiredTiger内部缓存大小值假定mongod
每台计算机有一个实例。如果一台机器包含多个MongoDB实例,则应减小设置以容纳其他mongod
实例。
如果你运行mongod
在一个容器(例如lxc
,
cgroups
,Docker,等等),它没有访问所有系统中可用的RAM,你必须设置storage.wiredTiger.engineConfig.cacheSizeGB
的值小于RAM容器使用的量。确切的数量取决于容器中运行的其他进程。请参阅
memLimitMB
。
要查看有关高速缓存和逐出速率的统计信息,请参阅命令wiredTiger.cache
返回的
字段serverStatus
。
使用加密时,配备AES-NI指令集扩展的CPU具有明显的性能优势。如果您将MongoDB Enterprise与 Encrypted Storage Engine一起使用,请选择支持AES-NI的CPU,以获得更好的性能。
也可以看看
使用SATA SSD(固态磁盘),MongoDB具有良好的结果和良好的性价比。
如果可用且经济实惠,请使用SSD。
商品(SATA)旋转驱动器通常是一个不错的选择,因为更昂贵的旋转驱动器的随机I / O性能提高并不那么引人注目(仅大约2倍)。使用SSD或增加RAM可能会更有效地提高I / O吞吐量。
在具有非统一内存访问(NUMA)的系统上运行MongoDB可能会导致许多操作问题,包括一段时间内性能下降以及系统进程使用率很高。
在NUMA硬件上运行MongoDB服务器和客户端时,应配置内存交错策略,以便主机以非NUMA方式运行。MongoDB部署在Linux(自2.0版起)和Windows(自2.6版起)计算机上时,会在启动时检查NUMA设置。如果NUMA配置可能会降低性能,则MongoDB将显示警告。
也可以看看
在Windows上,必须通过计算机的BIOS启用内存交错。有关详细信息,请查阅系统文档。
在Linux上,您必须禁用区域回收,还必须确保您的
mongod
和mongos
实例由启动
numactl
,通常通过平台的init系统对其进行配置。您必须执行这两项操作,才能正确禁用NUMA与MongoDB一起使用。
使用以下命令之一禁用区域回收:
确保mongod
和mongos
以开头numactl
。通常,这是通过平台的init系统配置的。运行以下命令来确定平台上正在使用哪个初始化系统:
如果为“ systemd
”,则您的平台使用systemd初始化系统,并且您必须按照下面systemd选项卡中的步骤编辑MongoDB服务文件。
如果“ init
”,你的平台使用SysV初始化系统,并且你
也不需要执行此步骤。SysV Init的默认MongoDB初始化脚本包括numactl
默认情况下通过启动MongoDB实例的必要步骤。
如果您管理自己的初始化脚本(即,您没有使用这两个初始化系统中的任何一个),则必须按照下面“ 自定义初始化脚本”选项卡中的步骤 编辑您的自定义初始化脚本。
有关更多信息,请参见/ proc / sys / vm / *的文档。
在避免或尽量减少交换的情况下,MongoDB的性能最佳,因为从交换中检索数据始终比访问RAM中的数据要慢。但是,如果托管MongoDB的系统的RAM不足,则交换可以防止Linux OOM Killer终止mongod
进程。
通常,您应该选择以下交换策略之一:
请参阅设置vm.swappiness,以获取有关按照以下准则在Linux系统上配置交换的说明。
注意
如果您的MongoDB实例托管在还运行其他软件的系统(例如Web服务器)上,则应选择第一个交换策略。难道不是在这种情况下,禁用掉。如果可能,强烈建议您在其专用系统上运行MongoDB。
为了在存储层方面获得最佳性能,请使用RAID-10支持的磁盘。RAID-5和RAID-6通常不能提供足够的性能来支持MongoDB部署。
使用WiredTiger存储引擎,如果远程文件系统符合ISO / IEC 9945-1:1996(POSIX.1),则WiredTiger对象可以存储在远程文件系统上。由于远程文件系统通常比本地文件系统慢,因此使用远程文件系统进行存储可能会降低性能。
如果你决定使用NFS,添加以下NFS选项的
/etc/fstab
文件:bg
,nolock
,和noatime
。
为了提高性能,请考虑根据应用程序的访问和写入模式将数据库的数据,日志和日志分离到不同的存储设备上。将组件安装为单独的文件系统,并使用符号链接将每个组件的路径映射到存储它的设备。
对于WiredTiger存储引擎,您还可以将索引存储在其他存储设备上。请参阅
storage.wiredTiger.engineConfig.directoryForIndexes
。
注意
由于文件将位于不同的设备和卷上,因此使用不同的存储设备将影响您创建数据的快照式备份的能力。
WiredTiger可以使用以下压缩库之一压缩收集数据:
zlib
或,
zstd
但CPU成本低于任何一种。snappy
,但比都较高的CPU成本snappy
和zstd
。snappy
,
zlib
并且CPU成本低于zlib
。默认情况下,WiredTiger使用活泼的压缩库。要更改压缩设置,请参阅
storage.wiredTiger.collectionConfig.blockCompressor
。
默认情况下,WiredTiger 对所有索引使用前缀压缩。
MongoDB 组件保留逻辑时钟以支持与时间有关的操作。使用NTP 同步主机时钟可以降低组件之间时钟漂移的风险。组件之间的时钟漂移增加了与时间有关的操作的不正确或异常行为的可能性,如下所示:
如果任何给定的MongoDB组件的基础系统时钟与同一部署中的其他组件相比偏移了一年或更长时间,则这些成员之间的通信可能变得不可靠或完全停止。
该maxAcceptableLogicalClockDriftSecs
参数控制组件之间可接受的时钟漂移量。值较低的簇maxAcceptableLogicalClockDriftSecs
对时钟漂移的容忍度相应较低。
两个集群成员与不同的系统时钟可能对返回当前群集或系统时间的操作,例如返回不同的值Date()
,
NOW
和CLUSTER_TIME
。
在MongoDB组件之间存在时钟漂移的群集中,依赖计时的功能可能具有不一致或不可预测的行为。
例如,TTL索引依靠系统时钟来计算