Skip to content

MongoDB 核心配置文件指南

配置文件基本结构

1. 配置文件示例

yaml
# MongoDB 配置文件示例

# 数据存储设置
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4

# 系统日志设置
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
  logRotate: reopen

# 网络设置
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.100
  tls:
    mode: disabled

# 复制集设置
replication:
  replSetName: rs0

# 分片设置
sharding:
  clusterRole: shardsvr

# 安全设置
security:
  authorization: enabled
  keyFile: /etc/mongodb/keyfile

# 进程管理设置
processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid

# 操作分析器设置
operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100

# 设置文件包含
# include: /etc/mongod.d/*.conf

2. 配置文件层级

MongoDB 配置文件采用层级结构,主要包含以下顶级配置部分:

配置部分描述
storage数据存储相关配置
systemLog日志相关配置
net网络相关配置
replication复制集相关配置
sharding分片相关配置
security安全相关配置
processManagement进程管理相关配置
operationProfiling性能分析器相关配置
setParameter运行时参数配置
include包含其他配置文件

核心配置参数详解

1. storage 配置

storage.dbPath

  • 作用:指定 MongoDB 数据文件的存储路径
  • 默认值:/data/db(Linux/macOS),C:\data\db(Windows)
  • 示例dbPath: /var/lib/mongodb
  • 最佳实践:使用高速 SSD 存储,确保足够的磁盘空间

storage.journal

  • 作用:控制日记功能的启用和配置
  • 默认值:enabled: true
  • 示例
    yaml
    journal:
      enabled: true
      commitIntervalMs: 100
  • 最佳实践:生产环境必须启用日记功能,确保数据一致性

storage.engine

  • 作用:指定存储引擎类型
  • 允许值:wiredTiger(默认)、inMemory
  • 示例engine: wiredTiger
  • 最佳实践:默认使用 WiredTiger,适合大多数场景

storage.wiredTiger

  • 作用:WiredTiger 存储引擎的详细配置
  • 示例
    yaml
    wiredTiger:
      engineConfig:
        cacheSizeGB: 4
        directoryForIndexes: true
      collectionConfig:
        blockCompressor: snappy
      indexConfig:
        prefixCompression: true
  • 最佳实践:根据系统内存大小调整 cacheSizeGB(建议为系统内存的 50%)

2. systemLog 配置

systemLog.destination

  • 作用:指定日志输出目标
  • 允许值:file、syslog、console
  • 示例destination: file
  • 最佳实践:生产环境建议输出到文件,便于日志管理和分析

systemLog.path

  • 作用:指定日志文件路径(仅当 destination 为 file 时有效)
  • 示例path: /var/log/mongodb/mongod.log
  • 最佳实践:确保日志目录存在且有写入权限

systemLog.logAppend

  • 作用:指定日志是否追加到现有文件
  • 默认值:false
  • 示例logAppend: true
  • 最佳实践:生产环境建议设为 true,避免日志丢失

systemLog.logRotate

  • 作用:指定日志轮转方式
  • 允许值:rename、reopen
  • 示例logRotate: reopen
  • 最佳实践:与日志管理工具(如 logrotate)配合使用时,建议设为 reopen

3. net 配置

net.port

  • 作用:指定 MongoDB 监听的端口
  • 默认值:27017
  • 示例port: 27017
  • 最佳实践:生产环境建议使用默认端口,便于管理

net.bindIp

  • 作用:指定 MongoDB 绑定的 IP 地址
  • 默认值:127.0.0.1
  • 示例bindIp: 127.0.0.1,192.168.1.100
  • 最佳实践:生产环境建议绑定特定 IP,而非 0.0.0.0(允许所有 IP 访问)

net.tls

  • 作用:TLS/SSL 配置
  • 示例
    yaml
    tls:
      mode: requireTLS
      certificateKeyFile: /etc/mongodb/mongod.pem
      CAFile: /etc/mongodb/ca.pem
  • 最佳实践:生产环境建议启用 TLS/SSL 加密

4. replication 配置

replication.replSetName

  • 作用:指定复制集名称
  • 示例replSetName: rs0
  • 最佳实践:复制集必须配置此参数才能启用复制功能

replication.oplogSizeMB

  • 作用:指定 oplog 的大小(MB)
  • 默认值:自动计算(通常为磁盘空间的 5%)
  • 示例oplogSizeMB: 10240
  • 最佳实践:根据写入量调整 oplog 大小,确保足够的历史数据

5. sharding 配置

sharding.clusterRole

  • 作用:指定 MongoDB 实例在分片集群中的角色
  • 允许值:configsvr(配置服务器)、shardsvr(分片)
  • 示例clusterRole: shardsvr
  • 最佳实践:仅在分片集群环境中配置

6. security 配置

security.authorization

  • 作用:启用或禁用访问控制
  • 允许值:disabled(默认)、enabled
  • 示例authorization: enabled
  • 最佳实践:生产环境必须启用访问控制

security.keyFile

  • 作用:指定用于复制集认证的密钥文件路径
  • 示例keyFile: /etc/mongodb/keyfile
  • 最佳实践:复制集环境必须配置此参数,确保密钥文件权限为 400

7. processManagement 配置

processManagement.fork

  • 作用:指定 MongoDB 是否以守护进程方式运行
  • 默认值:false
  • 示例fork: true
  • 最佳实践:生产环境建议设为 true,便于后台运行

processManagement.pidFilePath

  • 作用:指定 PID 文件路径(仅当 fork 为 true 时有效)
  • 示例pidFilePath: /var/run/mongodb/mongod.pid
  • 最佳实践:确保 PID 目录存在且有写入权限

8. operationProfiling 配置

operationProfiling.mode

  • 作用:指定性能分析器模式
  • 允许值:off(默认)、slowOp、all
  • 示例mode: slowOp
  • 最佳实践:生产环境建议设为 slowOp,仅记录慢操作

operationProfiling.slowOpThresholdMs

  • 作用:指定慢操作阈值(毫秒)
  • 默认值:100
  • 示例slowOpThresholdMs: 100
  • 最佳实践:根据业务需求调整,通常为 100-500 毫秒

配置文件最佳实践

1. 环境分离

  • 为不同环境(开发、测试、生产)使用不同的配置文件
  • 使用配置管理工具(如 Ansible、Chef、Puppet)管理配置文件
  • 版本控制配置文件,便于追踪变更

2. 安全性配置

  • 生产环境必须启用访问控制(authorization: enabled)
  • 复制集必须配置 keyFile
  • 启用 TLS/SSL 加密连接
  • 限制 bindIp 到必要的 IP 地址
  • 定期轮换密钥和证书

3. 性能配置

  • 根据系统内存大小调整 WiredTiger 缓存大小(cacheSizeGB)
  • 启用日记功能,确保数据一致性
  • 配置合适的慢查询阈值
  • 考虑使用 directoryForIndexes 将索引和数据分开存储

4. 可靠性配置

  • 配置合适的 oplog 大小,确保足够的历史数据
  • 启用日志追加(logAppend: true)
  • 配置合理的日志轮转策略
  • 监控配置文件变更,及时发现异常

5. 可维护性配置

  • 使用清晰的注释说明配置项的用途
  • 按功能分组配置项,便于查找和管理
  • 使用 include 指令包含其他配置文件,实现配置模块化
  • 定期备份配置文件

配置文件的加载和验证

1. 加载配置文件

bash
# 使用指定配置文件启动 MongoDB
mongod --config /etc/mongod.conf

# 或使用 -f 参数
mongod -f /etc/mongod.conf

2. 验证配置文件语法

bash
# 验证配置文件语法
mongod --config /etc/mongod.conf --check

# 或
mongod -f /etc/mongod.conf --check

3. 运行时查看配置

javascript
// 连接到 MongoDB
mongosh

// 查看运行时配置
db.adminCommand({ getCmdLineOpts: 1 })

// 查看特定配置项
db.adminCommand({ getParameter: 1, wiredTigerEngineRuntimeConfig: 1 })

配置文件的变更管理

1. 配置变更流程

  1. 备份当前配置文件cp /etc/mongod.conf /etc/mongod.conf.bak
  2. 修改配置文件:使用文本编辑器修改配置项
  3. 验证配置语法mongod --config /etc/mongod.conf --check
  4. 重启 MongoDB 服务sudo systemctl restart mongod
  5. 验证配置生效:连接到 MongoDB,查看运行时配置
  6. 测试功能:确保修改后的配置不影响 MongoDB 功能
  7. 记录变更:将配置变更记录到变更管理系统

2. 热更新配置

某些配置项支持热更新,无需重启 MongoDB 服务:

javascript
// 设置慢查询阈值
db.adminCommand({ setParameter: 1, slowms: 200 })

// 设置 profiling 级别
db.setProfilingLevel(1, { slowms: 200 })

支持热更新的配置项可以通过 db.adminCommand({ getParameter: 1, configurableParameter: 1 }) 查看。

常见配置问题及解决方案

1. 配置文件语法错误

症状:MongoDB 无法启动,日志中显示 "Error parsing YAML config file"

解决方案

  • 检查 YAML 语法,确保缩进正确
  • 验证配置项名称拼写正确
  • 检查引号使用是否正确
  • 使用 mongod --config /etc/mongod.conf --check 验证语法

2. 权限问题

症状:MongoDB 无法访问数据目录或日志文件

解决方案

  • 确保数据目录和日志目录存在
  • 检查目录权限,确保 mongod 用户有读写权限
  • 密钥文件权限必须为 400:chmod 400 /etc/mongodb/keyfile

3. 端口占用

症状:MongoDB 无法启动,日志中显示 "Address already in use"

解决方案

  • 检查端口是否被其他进程占用:lsof -i :27017netstat -tuln | grep 27017
  • 停止占用端口的进程,或修改 MongoDB 端口

4. 绑定 IP 问题

症状:无法从远程连接到 MongoDB

解决方案

  • 检查 bindIp 配置,确保允许远程 IP 访问
  • 检查防火墙设置,确保允许 MongoDB 端口
  • 测试网络连接:telnet <mongodb-host> 27017

5. TLS/SSL 配置错误

症状:MongoDB 无法启动,或客户端无法连接,日志中显示 TLS/SSL 相关错误

解决方案

  • 检查证书和密钥文件是否正确
  • 验证证书链是否完整
  • 检查 TLS 版本和密码套件配置
  • 测试 TLS 连接:openssl s_client -connect <mongodb-host>:27017 -tls1_2

不同环境的配置示例

1. 开发环境配置

yaml
storage:
  dbPath: /data/mongodb
  journal:
    enabled: true

systemLog:
  destination: console
  logAppend: true

net:
  port: 27017
  bindIp: 127.0.0.1

processManagement:
  fork: false

operationProfiling:
  mode: off

2. 生产环境复制集配置

yaml
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 8
      directoryForIndexes: true

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
  logRotate: reopen

net:
  port: 27017
  bindIp: 192.168.1.101
  tls:
    mode: requireTLS
    certificateKeyFile: /etc/mongodb/mongod.pem
    CAFile: /etc/mongodb/ca.pem

replication:
  replSetName: rs0
  oplogSizeMB: 20480

security:
  authorization: enabled
  keyFile: /etc/mongodb/keyfile

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100

3. 分片集群配置服务器配置

yaml
storage:
  dbPath: /var/lib/mongodb/config
  journal:
    enabled: true

net:
  port: 27019
  bindIp: 192.168.1.201

replication:
  replSetName: configReplSet

sharding:
  clusterRole: configsvr

security:
  authorization: enabled
  keyFile: /etc/mongodb/keyfile

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/config.pid

常见问题(FAQ)

Q1: 配置文件中可以使用环境变量吗?

A1: MongoDB 配置文件本身不支持直接使用环境变量。但可以通过以下方式实现:

  • 使用配置管理工具(如 Ansible、Chef)在部署时替换配置文件中的变量
  • 使用脚本动态生成配置文件
  • 使用 Docker 环境变量替换配置文件中的变量

Q2: 如何备份和恢复配置文件?

A2: 备份和恢复配置文件的方法:

  • 备份cp /etc/mongod.conf /path/to/backup/mongod.conf.$(date +%Y%m%d)
  • 恢复cp /path/to/backup/mongod.conf /etc/mongod.conf,然后重启 MongoDB 服务

Q3: 如何监控配置文件的变更?

A3: 监控配置文件变更的方法:

  • 使用文件监控工具(如 inotify-tools)监控配置文件的变更
  • 将配置文件纳入版本控制,定期检查变更
  • 使用配置管理工具管理配置文件,确保只有授权变更

Q4: 配置文件中的 include 指令有什么作用?

A4: include 指令用于包含其他配置文件,实现配置模块化:

yaml
# 包含所有 .conf 文件
include: /etc/mongod.d/*.conf

# 包含特定配置文件
include: /etc/mongod.security.conf

Q5: 如何优化 MongoDB 配置以提高性能?

A5: 优化 MongoDB 配置的方法:

  • 调整 WiredTiger 缓存大小(cacheSizeGB),通常为系统内存的 50%
  • 启用 directoryForIndexes,将索引和数据分开存储
  • 配置合适的 oplog 大小,确保足够的历史数据
  • 启用压缩(blockCompressor、prefixCompression)
  • 配置合适的慢查询阈值

Q6: 生产环境必须配置哪些安全选项?

A6: 生产环境必须配置的安全选项:

  • security.authorization: enabled:启用访问控制
  • security.keyFile:配置复制集认证密钥文件
  • net.tls.mode: requireTLS:启用 TLS/SSL 加密
  • 限制 net.bindIp 到必要的 IP 地址

Q7: 如何查看 MongoDB 的默认配置?

A7: 查看 MongoDB 默认配置的方法:

bash
# 查看所有默认配置选项
mongod --help

# 查看特定配置组的默认选项
mongod --help | grep -A 20 "Storage Options"

Q8: 配置文件和命令行参数有什么区别?

A8: 配置文件和命令行参数的区别:

  • 配置文件:集中管理所有配置选项,便于版本控制和变更管理
  • 命令行参数:适合临时调整配置,优先级高于配置文件
  • 优先级:命令行参数 > 配置文件 > 默认值

Q9: 如何调试配置文件问题?

A9: 调试配置文件问题的方法:

  • 使用 mongod --config /etc/mongod.conf --check 验证语法
  • 查看 MongoDB 日志文件,查找错误信息
  • 尝试使用最小化配置文件,逐步添加配置项
  • 检查文件权限和路径是否正确

Q10: 配置文件中的注释有什么要求?

A10: YAML 配置文件的注释要求:

  • 使用 # 开头表示注释
  • 注释可以单独一行,也可以在配置项后面
  • 注释不能嵌套
  • 注释不能出现在字符串内部

配置文件管理工具

1. 配置管理工具

  • Ansible:使用模板生成配置文件,支持批量部署和管理
  • Chef:使用食谱(Recipe)管理配置文件
  • Puppet:使用清单(Manifest)管理配置文件
  • SaltStack:使用状态文件(State File)管理配置文件

2. 版本控制工具

  • Git:将配置文件纳入 Git 版本控制,便于追踪变更
  • SVN:传统的集中式版本控制
  • Mercurial:分布式版本控制

3. 配置验证工具

  • yamllint:验证 YAML 文件的语法和格式
  • MongoDB 内置验证mongod --config /etc/mongod.conf --check