MongoDB-CN-Manual
  • MongoDB中文手册|官方文档中文版
  • MongoDB用户手册说明
  • MongoDB简介
    • 入门
    • 数据库和集合
      • 视图
      • 按需物化视图
      • 封顶集合
      • 时间序列集合
    • 文档
    • BSON类型
      • Comparison and Sort Order
      • MongoDB Extended JSON (v2)
      • MongoDB Extended JSON (v1)
  • 安装 MongoDB
    • 安装MongoDB社区版
      • 在Linux上安装MongoDB社区版
      • 在macOS上安装MongoDB社区版
      • 在Windows上安装MongoDB社区版
    • 安装MongoDB企业版
      • 在Linux上安装MongoDB企业版
      • 在Mac OS安装MongoDB企业版
      • 在Windows安装MongoDB企业版
      • 使用Docker安装MongoDB企业版
    • 将社区版MongoDB升级到企业版MongoDB
    • 验证MongoDB软件包的完整性
  • The mongo Shell
    • 配置mongo Shell
    • 使用 mongo Shell帮助
    • 为mongo Shell编写脚本
    • mongo Shell中的数据类型
    • mongo Shell 快速参考
  • MongoDB CRUD操作
    • 插入文档
      • 插入方法
    • 查询文档
      • 在mongo Shell中迭代游标
      • 从查询返回的项目字段
      • 查询嵌入式文档数组
      • 查询数组
      • 查询空字段或缺少字段
      • 查询嵌入/嵌套文档
    • 更新文档
      • 更新方法
      • 聚合管道更新
    • 删除文档
      • 删除方法
    • 地理空间查询
      • 用地理空间查询查找餐馆
      • GeoJSON对象
    • 批量写入操作
    • 可重试写入
    • 可重试读取
    • SQL到MongoDB的映射图表
    • 文本搜索
      • 文本索引
      • 文本索引操作
      • 集合管道中的文本索引
      • 文本索引语言
    • Read Concern读关注
      • 读关注 "local"
      • 读关注 "available"
      • 读关注 "majority"
      • 读关注 "linearizable"
      • 读关注 "snapshot"
    • Write Concern写关注
    • MongoDB CRUD概念
      • 原子性和事务
      • 读隔离性,一致性和近因性
        • 因果一致性和读写关注
      • 分布式查询
      • 通过findAndModify进行线性化读取
      • 查询计划
      • 查询优化
        • 评估当前操作性能
        • 优化查询性能
        • 写操作性能
        • 说明结果
      • 分析查询表现
      • Tailable 游标
  • MongoDB聚合
    • 聚合管道
      • 聚合管道优化
      • 聚合管道限制
      • 聚合管道和分片集合
      • 使用 Zip Code 数据集进行聚合
      • 使用用户首选项数据进行聚合
    • Map-Reduce
      • Map-Reduce 和分片集合
      • Map-Reduce 并发
      • Map-Reduce 示例
      • 执行增量 Map-Reduce
      • 对 Map Function 进行故障排除
      • 排除 Reduce Function 问题
      • Map-Reduce转换到聚合管道
    • 聚合参考
      • 聚合管道快速参考
      • 聚合命令
      • 聚合命令对比
      • 聚合表达式中的变量
      • SQL 到聚合映射图表
  • MongoDB数据模型
    • 数据建模介绍
    • 模式验证
    • 数据模型设计
      • 一对一嵌套关系模型
  • MongoDB事务
  • MongoDB事务
    • 驱动程序 API
    • 生产注意事项
    • 生产注意事项 (分片集群)
    • 事务操作
  • MongoDB索引
    • 单字段索引
    • 复合索引
    • 多键索引
      • 多键索引范围
    • 文本索引
      • 为文本索引指定语言
      • 指定文本索引的名称
      • 用权重控制搜索结果
      • 限制扫描条目的数量
    • 通配符索引
      • 通配符索引限制
    • 2dsphere 索引
      • 查询一个2dsphere索引
    • 2d 索引
      • 创建一个2d索引
      • 查询一个2d索引
      • 2d索引内部
      • 使用球面几何计算距离
    • geoHaystack 索引
      • 创建Haystack索引
      • 查询Haystack索引
    • 哈希索引
    • 索引特性
      • TTL 索引
        • 通过设置TTL使集合中的数据过期
      • 唯一索引
      • 部分索引
      • 不分大小写索引
      • Sparse 索引
    • 在填充的集合上建立索引
      • 在副本集上建立滚动索引
      • 在分片群集上建立滚动索引
    • 索引交集
    • 管理索引
    • 衡量索引使用
    • 索引策略
      • 创建索引来支持查询
      • 使用索引对查询结果进行排序
      • 确保索引适合RAM
      • 创建以确保选择性的查询
    • 索引参考
  • MongoDB安全
    • 安全检查列表
    • 启用访问控制
    • 身份验证
      • 用户
        • 添加用户
        • 权限认证机制
          • SCRAM
            • 用x.509证书来认证客户端
    • 审计
      • 配置审计过滤器
      • 配置审计
      • 系统事件审计消息
    • 网络和配置强化
    • 安全参考
      • system.roles集合
      • system.users集合
      • 资源文档
      • 权限操作
    • 附录
      • 附录-A-用于测试的 OpenSSl CA 证书
      • 附录-B-用于测试的OpenSSL服务器证书
      • 附录-C-用于测试的OpenSSL客户端证书
  • Change Streams变更流
    • 变更流生产建议
    • 变更事件
  • MongoDB复制
    • 副本集成员
    • 副本集日志
    • 副本集数据同步
    • 副本集部署架构
    • 副本集成员配置教程
    • 副本集维护教程
    • MongoDB复制参考
  • MongoDB分片
    • 分片集群组件
    • 分片键
    • 哈希分片
    • 范围分片
    • 区
      • 管理分片区
      • 按位置细分数据
      • 用于更改SLA或SLO的分层硬件
      • 按应用或客户细分数据
      • 仅插入工作负载的分布式本地写入
      • 管理分片区
    • 使用块进行数据分区
      • 在分片集群中拆分数据块
    • 分片管理
      • 查看集群设置
    • 重启一个分片集群
    • [把一个分片集群迁移到不同的硬件](fen-pian/migrate-a -sharded-cluster-to-different-hardware.md)
    • 分片参考
  • MongoDB管理
    • 产品说明
    • 操作检查列表
    • 开发检查列表
    • 配置和维护
    • 性能
    • 数据中心意识
      • MongoDB部署中的工作负载隔离
      • 区
        • 管理分片区
        • 按位置细分数据
        • 用于更改SLA或SLO的分层硬件
        • 按应用或客户细分数据
        • 仅插入工作负载的分布式本地写入
        • 管理分片区
    • MongoDB备份方法
    • MongoDB监控
  • MongoDB存储
    • 存储引擎
      • WiredTiger 存储引擎
      • 内存存储引擎
    • 日志记录
      • 管理日志记录
        • GridFS
        • FAQ:MongoDB 存储
  • MongoDB参考
    • 运算符
      • 查询与映射运算符
        • 比较查询运算符
          • $eq
          • $gt
          • $gte
          • $in
          • $lt
          • $lte
          • $ne
          • $nin
        • 逻辑查询运算符
          • $and
          • $not
          • $nor
          • $or
        • 元素查询运算符
        • 评估查询运算符
        • 地理空间查询运算符
        • 数组查询运算符
        • 按位查询运算符
        • $comment
        • 映射运算符
      • 更新运算符
        • 字段更新运算符
        • 数组更新运算符
        • 按位更新运算符
      • 聚合管道阶段
      • 聚合管道操作符
        • $abs (aggregation)
        • $acos (aggregation)
        • $acosh (aggregation)
        • $add (aggregation)
        • $addToSet (aggregation)
        • $allElementsTrue (aggregation)
        • $and (aggregation)
        • $anyElementTrue (aggregation)
        • $arrayElemAt (aggregation)
        • $arrayToObject (aggregation)
        • $asin (aggregation)
        • $asinh (aggregation)
        • $atan (aggregation)
        • $atan2 (aggregation)
        • $atanh (aggregation)
        • $avg (aggregation)
        • $ceil (aggregation)
        • $cmp (aggregation)
        • $concat (aggregation)
        • $concatArrays (aggregation)
        • $cond (aggregation)
        • $convert (aggregation)
        • $cos (aggregation)
        • $dateFromParts (aggregation)
        • $dateToParts (aggregation)
        • $dateFromString (aggregation)
        • $literal (aggregation)
      • 查询修饰符
    • 数据库命令
      • 聚合命令
      • 地理空间命令
      • 查询和写操作命令
      • 查询计划缓存命令
      • 认证命令
      • 用户管理命令
      • 角色管理命令
      • 复制命令
      • 分片命令
      • 会话命令
      • 管理命令
      • 诊断命令
      • 免费监控命令
      • 系统事件审计命令
    • mongo Shell 方法
      • 集合方法
        • db.collection.aggregate()
        • db.collection.bulkWrite()
        • db.collection.copyTo()
        • db.collection.count()
        • db.collection.countDocuments()
        • db.collection.estimatedDocumentCount()
        • db.collection.createIndex()
        • db.collection.createIndexes()
        • db.collection.dataSize()
        • db.collection.deleteOne()
        • db.collection.deleteMany()
        • db.collection.distinct()
        • db.collection.drop()
        • db.collection.dropIndex()
        • db.collection.dropIndexes()
        • db.collection.ensureIndex()
        • db.collection.explain()
        • db.collection.find()
        • db.collection.findAndModify()
        • db.collection.findOne()
        • db.collection.findOneAndDelete()
        • db.collection.findOneAndReplace()
        • db.collection.findOneAndUpdate()
        • db.collection.getIndexes()
        • db.collection.getShardDistribution()
        • db.collection.getShardVersion()
        • db.collection.insert()
        • db.collection.insertOne()
        • db.collection.insertMany()
        • db.collection.isCapped()
        • db.collection.latencyStats()
        • db.collection.mapReduce()
        • db.collection.reIndex()
        • db.collection.remove()
        • db.collection.renameCollection()
        • db.collection.replaceOne()
        • db.collection.save()
        • db.collection.stats()
        • db.collection.storageSize()
        • db.collection.totalIndexSize()
        • db.collection.totalSize()
        • db.collection.update()
        • db.collection.updateOne()
        • db.collection.updateMany()
        • db.collection.watch()
        • db.collection.validate()
    • MongoDB中的限制与阈值
    • MongoDB系统集合
    • 词汇表
    • 默认的MongoDB端口
    • 默认的MongoDB读/写关注
    • 服务器会话
  • MongoDB FAQ
    • FAQ: MongoDB基础知识
    • FAQ: MongoDB索引
    • FAQ: MongoDB并发
    • FAQ: MongoDB分片
    • FAQ: MongoDB复制和副本集
    • FAQ: MongoDB存储
    • FAQ: MongoDB诊断
  • MongoDB 版本管理
  • 联系我们
    • Tapdata Cloud
    • MongoDB中文社区
    • 社区合作伙伴—锦木信息
由 GitBook 提供支持
在本页
  • MongoDB 二进制文件
  • 支持的平台
  • 推荐的平台
  • 使用最新的稳定包
  • MongoDB 文件存储路径
  • 并发
  • WiredTiger
  • 数据一致性
  • 日志
  • 读操作安全机制
  • 写操作安全机制
  • 联网
  • 使用可信网络环境
  • 禁用 HTTP 接口
  • 管理连接池大小
  • 硬件考虑因素
  • 分配足够的 RAM 和 CPU
  • 使用固态硬盘(SSD)
  • MongoDB和NUMA硬件
  • 磁盘和存储系统
  • 架构
  • 副本集
  • 分片集群
  • 压缩
  • 时钟同步
  • 平台特定注意事项
  • Windows 上的 MongoDB
  • 虚拟环境中的MongoDB
  • 性能监控
  • iostat
  • bwm-ng
  • 备份
  • 附录
  1. MongoDB管理

产品说明

上一页MongoDB管理下一页操作检查列表

最后更新于3年前

本文详细描述了影响MongoDB,特别是在生产环境中运行时的系统配置。

移除 MMAPV1:

MongoDB 4.2 移除了已弃用的 MMAPv1 存储引擎。要将 MMAPv1 存储引擎部署更改为 ,请参见:

注意:

MongoDB 二进制文件

支持的平台

注意:

MongoDB 4.0 在 macOS 10.12.x 和 10.13.x 系统上当硬盘未正常关机时可能丢失数据。

x86_64

平台支持的产品生命期结束通知

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

✓

✓

亚马逊 Linux 2013.03 和更高版本

✓

✓

✓

✓

Debian 10

4.2.1+

Debian 9

✓

✓

3.6.5+

Debian 8

✓

✓

✓

4.2.1+

4.0.14+

3.6.17+

✓

✓

✓

✓

✓

✓

✓

✓

SLES 15

4.2.1+

SLES 12

✓

✓

✓

✓

Solaris 11 64-bit

仅社区版本

Ubuntu 18.04

✓

4.0.1+

Ubuntu 16.04

✓

✓

✓

✓

Ubuntu 14.04

✓

✓

✓

Windows Server 2019

✓

Windows 10 / Server 2016

✓

✓

✓

✓

Windows 8.1 / Server 2012 R2

✓

✓

✓

✓

Windows 8 / Server 2012

✓

✓

✓

✓

Windows 7 / Server 2008 R2

✓

✓

✓

✓

Windows Vista

✓

macOS 10.13 和更高版本

✓

✓

macOS 10.12

✓

✓

✓

✓

macOS 10.11

✓

✓

✓

macOS 10.10

✓

✓

ARM64

平台支持的 产品生命期结束通知

Ubuntu 16.04 ARM64

在MongoDB 社区版 4.2+中不再支持。

平台
4.2 社区版和企业版
4.0 社区版和企业版
3.6 社区版和企业版
3.4 社区版和企业版

Ubuntu 18.04

仅社区版

Ubuntu 16.04

仅企业版

✓

✓

✓

PPC64LE (MongoDB 企业版)

平台支持的 产品生命期结束通知

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版本中开始移除

s390x

平台
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 支持各种平台,但建议使用以下操作系统使用产品:

  • Amazon Linux 2

  • Debian 9 and 10

  • RHEL / CentOS 6, 7, and 8

  • SLES 12 and 15

  • Ubuntu LTS 16.04 and 18.04

  • Windows Server 2016 and 2019

另见:

使用最新的稳定包

确保您拥有最新的稳定版本。

MongoDB 文件存储路径

并发

WiredTiger

也可以看看

数据一致性

日志

读操作安全机制

在 version 3.2 中的新内容

写操作安全机制

联网

使用可信网络环境

始终在可信环境中运行 MongoDB,其网络规则阻止从所有未知计算机,系统和网络中进行访问。与依赖于网络访问的任何敏感系统一样,只有需要访问的特定系统才能访问 MongoDB 部署,例如应用服务器,监视服务和其他 MongoDB 组件。

重要

禁用 HTTP 接口

3.6版本中的变化: MongoDB 3.6 移除了 HTTP 接口和 REST API 。

早期版本的 MongoDB 提供了一个 HTTP 接口来检查服务器的状态,还可以选择运行查询。默认情况下禁用 HTTP 接口。不要在生产环境中启用 HTTP 接口。

管理连接池大小

硬件考虑因素

MongoDB 专为商用硬件而设计,几乎没有硬件要求或限制。 MongoDB 的核心组件运行在小端硬件上,主要是 x86/x86_64 处理器。客户端库(例如驱动程序)可以在大端或小端系统上运行。

分配足够的 RAM 和 CPU

WiredTiger

  • 随着并发活动操作数量增加到 CPU 数量,吞吐量会增加。

  • 当并发活动操作的数量超过CPU数量的某个阈值时,吞吐量会降低。

使用 WiredTiger,MongoDB同时使用WiredTiger内部缓存和文件系统缓存。

从MongoDB 3.4开始,默认的WiredTiger内部缓存大小为以下两者中的较大者:

  • 50% 的 (RAM - 1 GB), 或者

  • 256 MB。

例如,在总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB RAM(0.5 (4 GB - 1 GB) = 1.5 GB)。相反,RAM总量为1.25GB的系统将为WiredTiger缓存分配256MB,因为这超过了RAM总量减去1GB(0.5(1.25GB-1GB)=128MB<256MB) 的一半。

注意

在某些情况下,例如在容器中运行时,数据库可能具有低于总系统内存的内存约束。在这种情况下,这个内存限制,而不是整个系统内存,被用作可用的最大RAM。

默认情况下,WiredTiger对所有集合使用snapy块压缩,对所有索引使用前缀压缩。压缩默认值在全局级别上是可配置的,也可以在集合和索引创建期间根据每个集合和每个索引进行设置。

WiredTiger内部缓存中的数据与磁盘上的格式相比使用了不同的表示:

  • 文件系统缓存中的数据与磁盘上的格式相同,包括对数据文件进行任何压缩的好处。操作系统使用文件系统缓存来减少磁盘I/O。

  • 加载在WiredTiger内部缓存中的索引与磁盘上的格式具有不同的数据表示形式,但仍然可以利用索引前缀压缩来减少RAM的使用。索引前缀压缩从索引字段中删除常用前缀。

  • WiredTiger内部缓存中的收集数据是未压缩的,使用与磁盘格式不同的表示形式。块压缩可以显著节省磁盘存储空间,但数据必须解压缩才能由服务器操作。

MongoDB通过文件系统缓存自动使用WiredTiger缓存或其他进程未使用的所有可用内存。

注意

为了适应RAM的其他使用者,您可能必须减小WiredTiger内部缓存的大小。

压缩和加密

也可以看看

使用固态硬盘(SSD)

MongoDB使用SATA SSD能得到很好的效果和很好的性价比。

在可用且经济的情况下请使用SSD。

传统硬盘通常也是个好的选择,因为使用更昂贵的硬盘来提高随机IO性能并不是那么有效(只能是每次2倍)。使用SSD或增加RAM的容量可能对于提升IO更有效率。

MongoDB和NUMA硬件

在运行NUMA的系统中运行MongoDB可能造成一系列问题,包括一段时间内的效率低下和高系统进程使用率。

当在NUMA硬件上运行MongoDB服务器和客户端时,应配置内存交错策略,以便主机以非NUMA方式运行。MongoDB在Linux(2.0版以后)和Windows(2.6版以后)机器上部署时,会在启动时检查NUMA设置。如果NUMA配置可能会降低性能,MongoDB会打印一个警告。

也可以看看

在 Windows 上配置 NUMA

在 Windows 上,必须通过机器的 BIOS 启用内存交叉存取。有关详细信息,请参阅系统文档

在 Linux 上配置 NUMA

  1. 使用以下命令之一禁用内存区域回收:

    echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mod
    sudo sysctl -w vm.zone_reclaim_mode=0
   ps --no-headers -o comm 1
  • 如果是systemd,则您的平台使用 systemd init 系统,您必须按照下面 systemd 选项卡中的步骤来编辑MongoDB服务文件。

  • 如果是init,则平台使用SysV init系统,不需要执行此步骤。SysV init 的默认MongoDB init 脚本默认包含通过numactl 启动 MongoDB 实例的必要步骤。

  • 如果您管理自己的 init 脚本(例如没有使用这两个 init 系统中的任何一个),则必须按照下面自定义 init 脚本选项卡中的步骤编辑自定义 init 脚本。

systemd

  1. 复制默认MongoDB服务文件:

    sudo cp /lib/systemd/system/mongod.service /etc/systemd/system/
  2. 编辑 /etc/systemd/system/mongod.service 文件,首先要更新 ExecStart 语句:

    /usr/bin/numactl --interleave=all

例如

如果现有的 ExecStart 语句为:

   ExecStart=/usr/bin/mongod --config /etc/mongod.conf

将该语句更新为:

   ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod --config /etc/mongod.conf
  1. 将更改应用于 systemd:

    sudo systemctl daemon-reload
  2. 重新启动任何正在运行的 mongod 实例:

    sudo systemctl stop mongod
    sudo systemctl start mongod

自定义初始化脚本

1.如果尚未安装numactl,请为您的平台安装 numactl。有关安装 numactl 包的信息,请参阅操作系统的文档。

  1. 配置每个自定义init脚本以通过numactl启动每个MongoDB实例:

    numactl --interleave=all <path> <options>

其中是 是要启动的程序的路径,也是要传递给该程序的任何可选参数。

例如:

   numactl --interleave=all /usr/local/bin/mongod -f /etc/mongod.conf

磁盘和存储系统

交换

通常,您应该选择以下交换策略之一:

  1. 在系统上分配交换空间,并将内核配置为只允许在高内存负载下进行交换,或者

  2. 不要在系统上分配交换空间,并将内核配置为完全禁用交换

注意

如果MongoDB实例托管在同时运行其他软件(如Web服务器)的系统上,则应选择第一个交换策略。在这种情况下不要禁用交换。如果可能,强烈建议您在MongoDB自己的专用系统上运行MongoDB。

阵列

为了在存储层方面实现最佳性能,请使用 RAID-10 支持的磁盘。 RAID-5 和 RAID-6 通常不提供足够的 性能来支持 MongoDB 部署。

远程文件系统

使用 WiredTiger 存储引擎,如果远程文件系统符合 ISO/IEC 9945-1:1996(POSIX.1),则 WiredTiger 对象 可以存储在远程文件系统上。由于远程文件系统通常比本地文件系统慢,因此使用 远程文件系统进行存储可能会降低性能。

如果决定使用网络文件系统,请在 /etc/fstab 文件中添加以下NFS选项:bg、nolock 和 noatime。

将组件分离到不同的存储设备上

为了提高性能,请考虑根据应用程序的访问和写入模式,将数据库的数据、logs 和 journal 分离到不同的存储设备上。将组件作为单独的文件系统挂载,并使用符号链接将每个组件的路径映射到存储它的设备。

注意

使用不同的存储设备将影响您创建数据快照式备份的能力,因为文件将位于不同的设备和卷上。

调度

虚拟或云主机设备的调度

对于通过虚拟机监视器连接到虚拟机实例或由云托管提供商托管的本地块设备,客户操作系统应使用 noop 调度器以获得最佳性能。noop 调度器允许操作系统将 I/O 调度延缓到底层管理程序。

物理服务器的调度

对于物理服务器,操作系统应使用 _deadline_调度器。_deadline_调度器限制每个请求的最大延迟,并保持良好的磁盘吞吐量,这对于磁盘密集型数据库应用程序来说是最好的。

架构

副本集

分片集群

也可以参阅

压缩

WiredTiger可以使用以下压缩库之一压缩收集数据:

  • 提供比zlib或zstd更低的压缩率,但比任何一种的CPU成本都低。

  • 提供了比 snappy 更好的压缩率,但比 snappy 和 zstd 的CPU成本都要高。

  • 提供比 snappy 和 zlib 更好的压缩率,并且比 zlib 具有更低的CPU成本。

时钟同步

  • 如果任何给定 MongoDB 组件的底层系统时钟偏离同一部署中的其他组件一年或更长时间,则这些成员之间的通信可能变得不可靠或完全停止。

  • 在MongoDB组件之间存在时钟漂移的集群中,依赖于计时的特性可能会有不一致或不可预测的行为。

平台特定注意事项

Kernel and File Systems 内核和文件系统

在Linux上的生产环境中运行MongoDB时,应该使用 Linux 内核版本 2.6.36 或更高版本,并使用 XFS或 EXT4 文件系统。如果可能的话,使用 XFS,因为它通常在 MongoDB 中执行得更好。

  • 一般来说,如果您使用的是 XFS 文件系统,那么至少要使用 2.6.25 版本的Linux内核。

  • 如果使用 EXT4 文件系统,请至少使用 2.6.28 版本的 Linux 内核。

  • 在Red Hat 企业版 Linux 和 CentOS 上,至少使用 2.6.18-194 版 Linux 内核。

系统C库

  • 在 RHEL/CentOS 上,以下命令更新系统提供的 GNU C 库:

    sudo yum update glibc
  • 在Ubuntu/Debian上,以下命令更新系统提供的 GNU C 库:

    sudo apt-get install libc6

目录中的 fsync()

重要

MongoDB要求文件系统对目录支持 fsync()。例如 HGFS 和 Virtual Box 的共享目录不支持这个操作。

将 vm.swappiness 设置为 1 或者 0

“Swappiness” 是一种影响虚拟内存管理器的 Linux 内核设置,vm.swappiness 设置的范围从0到100:该值越高,它越倾向于将内存页交换到磁盘,而不是从RAM中删除页。

  • 设置为1只允许内核交换以避免内存不足问题。

  • 设置60告诉内核经常交换到磁盘,这是许多Linux发行版的默认值。

  • 设置为100将告诉内核尽可能交换到磁盘。

MongoDB 在可以避免或保持最小交换的地方表现最好。因此,您应该根据应用程序需要和集群配置将 vm.swappiness 设置为1或0。

[2] 对于3.5之前的Linux内核版本,或 2.6.32-303 之前的 RHEL/CentOS 内核版本,vm.swappiness 设置为0仍然允许内核在某些紧急情况下进行交换。

注意

如果 MongoDB 实例托管在同时运行其他软件(如Web服务器)的系统上,则应将 vm.swappiness 设置为1。如果可能,强烈建议您在MongoDB自己的专用系统上运行MongoDB。

  • 要检查系统上的当前交换设置,请运行:

    cat /proc/sys/vm/swappiness
  • 要更改系统上的交换设置:

    1. 编辑 /etc/sysctl.conf 文件并添加以下行:

      vm.swappiness = 1
    2. 运行以下命令以应用设置:

      sudo sysctl -p

注意

如果您正在运行 RHEL/CentOS 并使用优化的性能配置文件,则还必须编辑所选配置文件以将vm.swappiness 设置为1或0。

推荐配置

对于所有MongoDB部署:

  • 在主机之间同步时间使用网络时间协议(NTP)。这在分片集群中尤为重要。

对于 WiredTiger 存储引擎,请考虑以下建议:

注意

对于WiredTiger存储引擎:

  • 无论存储介质类型(旋转磁盘、SSD等)如何,将 文件预读的值设置为8到32。

MongoDB 和 TLS/SSL 库

在 Linux 平台上,您可以在 MongoDB 日志中看到以下语句之一:

<path to TLS/SSL libs>/libssl.so.<version>: no version information available (required by /usr/bin/mongod)
<path to TLS/SSL libs>/libcrypto.so.<version>: no version information available (required by /usr/bin/mongod)
objdump -T <path to mongod>/mongod | grep " SSL_"
objdump -T <path to mongod>/mongod | grep " CRYPTO_"

这些操作将返回类似于以下行之一的输出:

0000000000000000      DF *UND*       0000000000000000  libssl.so.10 SSL_write
0000000000000000      DF *UND*       0000000000000000  OPENSSL_1.0.0 SSL_write

此输出中的最后两个字符串是符号版本和符号名。将这些值与以下操作返回的值进行比较,以检测符号版本是否匹配:

objdump -T <path to TLS/SSL libs>/libssl.so.1*
objdump -T <path to TLS/SSL libs>/libcrypto.so.1*

Windows 上的 MongoDB

对于使用 WiredTiger 存储引擎的 MongoDB 实例,Windows 上的性能与 Linux 上的性能相当。

虚拟环境中的MongoDB

本章节描述了在常用虚拟环境中运行MongoDB需要考虑的问题。

AWS EC2(亚马逊弹性计算云)

有两种性能配置需要考虑:

  • 性能测试或基准测试的可复制性能,以及

  • 原始最大性能

要为任一配置优化弹性计算云上的性能,应:

如果您更关心弹性计算云的可重复性能,您还应该:

  • 为存储使用配置的 IOPS,日志和数据使用单独的设备。不要使用大多数实例类型上可用的临时(SSD)存储,因为它们的性能会随时发生变化。(i 系列是一个显著的例外,但非常昂贵。)

  • 禁用 DVFS 和 CPU 节能模式。

也可以看看

  • 禁用超线程。

也可以看看

  • 使用 numactl 将内存局部性绑定到单个套接字。

Azure

默认情况下,Azure 负载平衡器上的 TCP 空闲超时默认为240秒,如果 Azure 系统上的 TCP 长连接大于此值,则会导致它自动断开连接。您应该将 TCP 长连接时间设置为120以改善此问题。

注意

  • 要在 Linux 上查看长连接设置,请使用以下命令之一:

    sysctl net.ipv4.tcp_keepalive_time

    或者:

    cat /proc/sys/net/ipv4/tcp_keepalive_time

    该值以秒为单位。

注意

尽管设置名称包括IPv4 ,但 TCP 长连接时间值同时适用于 IPv4 和 IPv6。

  • 要更改 TCP 长连接时间值,可以使用以下命令之一,以秒为单位提供::

    sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>

    或者:

    echo <value> | sudo tee /proc/sys/net/ipv4/tcp_keepalive_time

这些操作不会在系统重新启动时保持。要保持设置,请将以下行添加到 /etc/sysctl.conf,以秒为单位提供 ,然后重新启动计算机:

  net.ipv4.tcp_keepalive_time = <value>
  • 要在 Windows 上查看长连接设置,请发出以下命令:

    reg query HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime

    默认情况下不存在注册表值。如果该值不存在,则使用系统默认值7200000毫秒或0x6ddd00(十六进制)。

  • 要更改长连接时间值,请在管理员命令提示符中使用以下命令,该命令以十六进制表示(例如120000是0x1d4c0):

    reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>

VMware

MongoDB 与 VMware 兼容。

VMware支持内存过量使用,在这里,您可以为虚拟机分配比物理机可用更多的内存。当内存被过度使用时,管理程序会在虚拟机之间重新分配内存。VMware 的气球驱动(vmmemctl)回收那些被认为价值最低的页面。

气球驱动程序位于客户操作系统中。当气球驱动程序扩展时,可能导致客户操作系统从客户端应用程序中回收内存,从而干扰 MongoDB 的内存管理,影响 MongoDB 的性能。

不要禁用气球驱动程序和内存过载使用功能。这会导致虚拟机监控程序使用其交换,从而影响性能。相反,映射并保留运行 MongoDB 的虚拟机的全部内存。这可以确保,如果管理程序中存在由于过度提交配置而导致的内存压力,则气球不会在本地操作系统中膨胀。

KVM

MongoDB 与 KVM 兼容。

KVM支持内存超载使用,在这里,您可以为虚拟机分配比物理机可用更多的内存。当内存被过度提交时,管理程序会在虚拟机之间重新分配内存。KVM的气球驱动程序回收被认为价值最低的页面。

气球驱动程序位于客户操作系统中。当气球驱动程序扩展时,可能导致客户操作系统从客户端应用程序中回收内存,从而干扰 MongoDB 的内存管理,影响 MongoDB 的性能。

不要禁用气球驱动程序和内存过载使用功能。这会导致虚拟机监控程序使用其交换,从而影响性能。相反,映射并保留运行 MongoDB 的虚拟机的全部内存。这可以确保,如果管理程序中存在由于过度提交配置而导致的内存压力,则气球不会在本地操作系统中膨胀。

性能监控

注意

iostat

在 Linux 上,使用 iostat 命令检查磁盘 I/O 是否是数据库的瓶颈。指定运行 iostat 时的秒数,以避免显示信息为自服务器启动以来的统计信息。

例如,以下命令将每隔一秒显示扩展统计信息和每个显示报告的时间,流量单位为MB/s:

iostat -xmt 1

iostat中的关键字段:

  • %util: 这是快速检查最有用的字段,它表示设备/驱动器使用时间的百分比。

  • avgrq-sz:平均请求大小。此值的较小数字反映了更多的随机IO操作。

bwm-ng

备份

附录

译者:孔令升

是云端的数据库服务。, 是一个托管服务; ,是一个本地解决方案, 提供 MongoDB 实例的监视,备份和自动化。 有关文档,请参阅 , 和 。

在生产环境中运行时,请参阅以获取推荐使用的操作系统。

对于更多的细节,参见。

RHEL/CentOS/Oracle Linux 8.0 and later

RHEL/CentOS/Oracle Linux 7.0 和更高版本

RHEL/CentOS/Oracle Linux 6.2 和更高版本

[1] (, , ) MongoDB 仅支持 Oracle Linux 运行 Red Hat Compatible Kernel (RHCK). MongoDB 不支持Unbreakable Enterprise Kernel (UEK)。

所有 MongoDB 版本都可在 页面获取. 页面可以找到当前稳定版本,即使您通过包管理进行安装。

对于其他 MongoDB 产品,请参阅 页面或者 。

目录中的文件必须与配置的对应。如果 包含由 指定的存储引擎以外的存储引擎创建的数据文件, 将不会启动。

必须对指定的拥有读写权限

支持读写器对对集合中的文档进行并发访问。 客户端可以可以在进行写操作时读取文档,多个线程可以同时修改集合中的不同文档。

提供有关WiredTiger如何利用多个CPU核以及如何提高操作吞吐量的信息。

MongoDB 使用预写式日志方式写入到磁盘。日志记录保证MongoDB可以快速从崩溃或其他严重错误中恢复写入日志但未写入数据文件的 。

从MongoDB 4.0开始,不能为使用WiredTiger存储引擎的副本集成员 选项或者

从 MongoDB 3.6 开始,如果写请求确认,则可以使用来读取您自己的写入。

在 MongoDB 3.6 之前,您必须确保写操作使用了 [{ w: "majority}" ]( ["majority"]( ["linearizable"](

要使用 ["majority"]( ,副本集必须使用。

您可以禁用具有三个成员的主-副-仲裁(PSA)体系结构部署的读安全机制 ["majority"]( 4.0和更早的版本中)和分片集群上的事务有影响。有关更多信息,请参见。

写操作安全机制]() 描述 MongoDB 写操作时确认请求写入的安全机制级别。写操作安全机制的级别会影响写操作返回的速度。当写操作具有较弱的写入安全机制时,它们会快速返回。对于更强的写入安全机制,客户端必须在发送写入操作后等待,直到 MongoDB 在请求的写入安全机制级别上确认写入操作。由于写入安全机制级别不够,写操作可能会显示客户端成功,但在某些服务器故障情况下可能不会缓存。

有关选择适当的写操作安全机制级别的详细信息,请参阅 文档。

默认情况下,未启用, 默认为受信任的环境。根据需要启用 模式。有关 MongoDB 中支持的身份验证机制以及 MongoDB 中的授权的详细信息,请参阅 和 。

有关安全性的其他信息和注意事项,请参阅中的文档,具体如下:

对于 Windows 用户,在 Windows 上部署 MongoDB 时请考虑 。

通过调整连接池大小以适合您的用例,避免重载 和 实例的连接资源。从当前数据库请求的典型数量的 110-115%开始,并根据需要修改连接池大小。请参阅以调整连接池大小。

命令返回有关分片集群中 和 实例的当前数据库打开连接数的信息。

另见 .

至少,确保每个 或者 实例可以访问两个实核或一个多核物理CPU。

存储引擎是多线程的,可以利用额外的 CPU 内核。具体而言,相对于可用CPU的数量,活动线程(即并发操作)的总数会影响性能:

阈值取决于您的应用程序。您可以通过实验和测量吞吐量来确定应用程序的最佳并发活动操作数。 的输出提供(ar | aw)列中活动读/写次数的统计信息。

要查看内存限制,请参阅 。

要调整WiredTiger内部缓存的大小,请参见 和 。避免将WiredTiger内部缓存大小增加到其默认值以上。

限制了wiredTiger内部缓存的大小。操作系统将使用可用的空闲内存进行文件系统缓存,这将允许压缩的MongoDB数据文件保留在内存中。此外,操作系统将使用任何空闲RAM缓冲文件系统块和文件系统缓存。

默认的WiredTiger内部缓存大小值假定每台计算机有一个实例。如果一台机器包含多个MongoDB实例,那么您应该减少设置以适应其他实例。

如果在无法访问系统中所有可用RAM的容器(例如lxc、cgroups、Docker等)中运行,则必须将 设置为小于容器中可用RAM的值。具体数量取决于容器中运行的其他进程。参见 。

要查看缓存和逐出率的统计信息,请参阅从 命令返回的 字段。

当使用加密时,配备AES-NI指令集扩展的CPU可以显示出显著的性能优势。如果将MongoDB 企业版与 一起使用,请选择支持AES-N指令集的CPU以获得更好的性能。

报告, ,它描述了NUMA对数据库造成的影响。这篇文章介绍了NUMA和它的目标,并指出了为什么这些目标和生产环境数据库的需求是不相容的。尽管这篇博文讨论了NUMA对于 MySQL的影响,但是MongoDB的问题是相似的。

。

在 Linux上,您必须禁用内存区域回收,并确保您的 and 实例由 numactl命令启动,numactl 通常是通过平台的 init 系统配置的。您必须执行这两个操作才能正确禁用 NUMA 以便与 MongoDB 一起使用。

2.然后,您应该使用 numactl 来启动 and ,这通常是通过平台的 init 系统配置的。运行以下命令以确定平台上正在使用的init系统:

你必须使用 numactl 启动每个 实例,包括所有 , 实例,和客户端.。如下所示编辑每个系统的默认 systemd 服务文件:

如果适用,对任何 重复这些步骤。

有关更多信息,请参见 。

你必须使用 numactl 启动每个 实例,包括所有 , 实例和客户端。

有关更多信息,请参见 。

MongoDB在可以避免交换或将交换保持在最低限度的地方表现最好,因为从交换中检索数据总是比访问RAM中的数据慢。但是,如果托管 MongoDB 的系统没有RAM,交换可以防止 Linux OOM Killer 终止 进程。

请参阅 以获取有关在Linux系统上按照这些指导原则配置swap的说明。

对于WiredTiger存储引擎,还可以将索引存储在不同的存储设备上。见。

有关副本集部署的体系结构注意事项的概述,请参阅 。

有关建议的用于生产部署的分片集群体系结构的概述,请参阅。

(从 MongoDB 4.2 开始可以使用)

默认情况下,WiredTiger使用 压缩库。要更改压缩设置,请参见。

默认情况下,WiredTiger对所有索引使用 。

MongoDB 保留逻辑时钟以支持与时间相关的操作。使用同步主机时钟来降低组件之间时钟漂移的风险。组件之间的时钟漂移增加了时间相关操作不正确或异常行为的可能性,如下所示:

参数控制组件之间可接受的时钟偏移量。MaxAcceptableLogicalClockDiftSecs值较低的集群对时钟漂移的容忍度相应较低。

对于返回当前集群或系统时间的操作,具有不同系统时钟的两个集群成员可能返回不同的值,例如 , , 和 。

例如,依赖于系统时钟来计算何时删除给定文档。如果两个成员有不同的系统时钟时间,则每个成员可以在不同的时间删除TTL索引覆盖的给定文档。由于保证使用TTL索引来控制它们的寿命,时钟漂移可能导致不一致或不可预测的会话超时行为。

运行 MongoDB 低于 3.4.6 或 3.2.17 的部署需要 NTP 同步,使用 WiredTiger 存储引擎,时钟漂移可能导致。该问题在 MongoDB 和 MongoDB 中得到了修复,并在 MongoDB 3.6、4.0 和 4.2 版本中所有点得到了解决。

对于 ,强烈建议使用 XFS,以避免将 EXT4 与 WiredTiger 一起使用时可能出现的性能问题。

MongoDB在Linux上使用 (glibc)。一般来说,每个Linux发行版都提供了自己经过审查的版本。为了获得最佳结果,请使用此系统提供版本的最新更新。您可以使用系统的包管理器检查是否安装了最新版本。例如:

设置为0将完全禁用交换 。

在包含的存储卷关闭 atime 配置。

按照 设置的推荐,设置描述符限制,-n 和用户进程限制(ulimit),-u 设置为20000以上。当大量使用时,低 ulimit 将影响 MongoDB,并可能产生错误,导致与MongoDB进程的连接失败和服务丢失。

不要使用透明大页,因为MongoDB在标准页中表现更好。参见 .

在BIOS中禁用NUMA。如果做不到,请参考 章节。

如果不使用默认的 MongoDB 目录路径或 ,请为 MongoDB 配置 SELinux。

请参阅 和 以获得所需的配置。

如果您使用的是 SELinux,任何需要 的 MongoDB 操作都会导致段错误。 描述如何禁用服务器端 JavaScript 执行。

较高的预读通常有利于顺序 I/O 操作。由于MongoDB 磁盘访问模式通常是随机的,因此使用更高的文件预读设置提供的好处有限,或者可能会降低性能。因此,为了获得最佳的 MongoDB 性能,请将文件预读的值设置在8到32之间,除非测试在更高的文件预读值中显示出可测量、可重复和可靠的好处。 可以提供关于备用文件预读配置的建议和指导。

这些警告表示系统的 TLS/SSL 库与 编译时所依据的 TLS/SSL 库不同。通常这些消息不需要干预;但是,您可以使用以下操作来确定 期望的符号版本:

这个过程既不精确也不详尽: 从 libcrypto 库中使用的许多符号不是以 CRYPTO_ 开头的。

对于所有平台,请考虑 .

为您的实例启用亚马逊。并非所有实例类型都支持增强的网络。

要了解有关增强联网的更多信息,请参阅。

.

使用。微软Azure提供了两种常见的存储类型:标准存储和高级存储。与标准存储相比,Azure上的MongoDB 在使用高级存储时具有更好的性能。

要使新的系统范围长连接设置生效,您需要重新启动 和进程。

长连接值大于300秒(5分钟)将在 and 套接字上重写,并设置为300秒。

Windows用户应考虑 以获取有关在 Windows系统上设置 MongoDB 部署长连接的详细信息。 and 将忽略大于或等于_600000_毫秒(10分钟)的长连接值。

通过设置VMware的,确保虚拟机留在特定的 ESX/ESXi 主机上。如果必须手动将虚拟机迁移到另一个主机,并且虚拟机上的 实例是,则必须先最重要的实例,然后。

遵循 和 。未能遵循最佳实践可能会导致性能问题,并影响和的高可用性机制。

可以克隆运行 MongoDB 的虚拟机。您可以使用此函数启动新的虚拟主机,将其添加为副本集的成员。如果克隆启用了日志记录的虚拟机,则克隆快照将有效。如果不使用日志记录,首先停止,然后克隆虚拟机,最后重新启动 。

从4.0版开始,MongoDB为标准和副本集提供。有关更多信息,请参阅。

是用于监视网络使用的命令行工具。如果怀疑是基于网络的瓶颈,可以使用 bwm-ng 开始诊断进程。

要备份 MongoDB 数据库,请参阅 。

原文链接:

MongoDB 二进制文件
MongoDB 文件存储路径
并发
数据一致性
联网
硬件注意事项
架构
压缩
时钟同步
平台特定注意事项
性能监控
备份
WiredTiger存储引擎
将单节点更改为WiredTiger
将复制集群更改为WiredTiger
将分片集群更改为WiredTiger
MongoDB Atlas
MongoDB Cloud Manager:官方推出的运维自动化管理系统
Ops Manager:用于监控和备份MongoDB的基础设施服务
Atlas 文档
MongoDB Cloud Manager 文档
Ops Manager 文档
推荐的平台
WT-4018
1
2
3
平台特定注意事项
MongoDB 下载中心
MongoDB 下载中心
MongoDB 下载中心
各自对应文档
dbPath
存储引擎
文件存储路径
--storageEngine
mongod
mongod
文件存储路径
WiredTiger
分配足够的 RAM 和 CPU
日志
写操作
--nojournal
storage.journal.enabled: false
因果一致性会话
https://docs.mongodb.com/manual/reference/write-concern/#writeconcern."majority")写入安全机制,然后对读取操作使用
https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")或
https://docs.mongodb.com/manual/reference/read-concern-linearizable/#readconcern."linearizable")读取安全机制,以确保单个线程可以读取自己的写入。
https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")的级别的
读安全机制
WiredTiger 存储引擎
https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority");但是,这对更改流(仅在MongoDB
Disable Read Concern Majority
https://docs.mongodb.com/manual/reference/write-concern/
写操作安全机制
授权
mongod
authorization
授权
基于角色的访问控制
安全部分
安全检查列表
网络和配置强化
有关TCP配置的Windows Server Technet文章
mongod
mongos
连接池选项
connPoolStats
mongos
mongod
分配足够的 RAM 和 CPU
mongod
mongos
WiredTiger
mongostat
hostInfo.system.memLimitMB
storage.wiredTiger.engineConfig.cacheSizeGB
--wiredTigerCacheSizeGB
storage.wiredTiger.engineConfig.cacheSizeGB
mongod
mongod
mongod
storage.wiredTiger.engineConfig.cacheSizeGB
memLimitMB
serverStatus
wiredTiger.cache
加密存储引擎
并发
MySQL的 “疯狂交换” 问题和 NUMA的影响
NUMA: 综述
mongod
mongos
mongod
mongos
mongod
配置服务器
mongos
mongos
Documentation for /proc/sys/vm/*
mongod
配置服务器
mongos
Documentation for /proc/sys/vm/*
mongod
Set vm.swappiness
storage.wiredTiger.engineConfig.directoryForIndexes
副本集体系结构文档
分片集群生产体系结构
开发清单列表
snappy
zlib
zstd
snappy
storage.wiredTiger.collectionConfig.blockCompressor
前缀压缩
组件
网络时间协议
maxAcceptableLogicalClockDriftSecs
Date()
NOW
CLUSTER_TIME
TTL索引
客户端会话和因果一致性
检查点挂起
3.4.6+
3.2.17+
WiredTiger 存储引擎
GNU C 库
[2]
数据库文件
ulimit
透明大页设置
MongoDB 和 NUMA 硬件
端口
为 MongoDB 配置 SELinux
为 MongoDB 企业版配置 SELinux
服务器端 javaScript
禁用服务器端执行JavaScript
MongoDB 商业支持
mongod
mongod
mongod
调度
增强的网络
AWS 文档
关于处理器状态控制的Amazon文档
亚马逊关于禁用超线程的博客文章
高级存储
mongod
mongos
mongod
mongos
Windows服务器 Technet 关于长连接时间值的文章
mongod
mongos
关联规则
mongod
最重要的
逐步关闭
关闭实例
vMotion的网络最佳实践
VMKernel
副本集
分片集群
mongod
mongod
免费云监控
免费监控
bwm-ng
MongoDB 备份方法概述
https://docs.mongodb.com/manual/administration/production-notes/
[1]
[1]
[1]