外观
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/*.conf2. 配置文件层级
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.conf2. 验证配置文件语法
bash
# 验证配置文件语法
mongod --config /etc/mongod.conf --check
# 或
mongod -f /etc/mongod.conf --check3. 运行时查看配置
javascript
// 连接到 MongoDB
mongosh
// 查看运行时配置
db.adminCommand({ getCmdLineOpts: 1 })
// 查看特定配置项
db.adminCommand({ getParameter: 1, wiredTigerEngineRuntimeConfig: 1 })配置文件的变更管理
1. 配置变更流程
- 备份当前配置文件:
cp /etc/mongod.conf /etc/mongod.conf.bak - 修改配置文件:使用文本编辑器修改配置项
- 验证配置语法:
mongod --config /etc/mongod.conf --check - 重启 MongoDB 服务:
sudo systemctl restart mongod - 验证配置生效:连接到 MongoDB,查看运行时配置
- 测试功能:确保修改后的配置不影响 MongoDB 功能
- 记录变更:将配置变更记录到变更管理系统
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 :27017或netstat -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: off2. 生产环境复制集配置
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: 1003. 分片集群配置服务器配置
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.confQ5: 如何优化 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
