Linux环境下MongoDB配置的关键技巧
/usr/local/mongodb/bin
)添加到系统PATH
中,可通过修改~/.bashrc
(用户级)或/etc/bashrc
(系统级)文件实现,使用source
命令使更改立即生效,方便全局调用mongod
、mongo
等命令。/var/lib/mongodb
用于数据存储、/var/log/mongodb
用于日志存储),并通过chown -R mongodb:mongodb
命令将所有权赋予MongoDB运行用户(通常为mongodb
),确保进程有读写权限。WiredTiger
(MongoDB默认存储引擎),支持文档级锁定、事务及数据压缩(默认压缩比为50%),配置storage.wiredTiger.engineConfig.cacheSizeGB
参数调整缓存大小(建议为服务器物理内存的50%-75%,避免占用过多内存影响系统及其他应用)。systemLog.logAppend: true
),指定日志路径(systemLog.path: /var/log/mongodb/mongod.log
);设置合理的日志刷新间隔(storage.journal.commitIntervalMs
,默认100ms),平衡数据持久性与I/O性能。net.bindIp: 127.0.0.1
仅本地访问,或0.0.0.0
允许远程访问),设置端口(默认27017
,可根据业务需求调整)。security.authorization: enabled
),强制用户登录;若需副本集,设置replication.replSetName
(如rs0
)。storage.wiredTiger.engineConfig.cacheSizeGB
参数限制WiredTiger使用的内存(如cacheSizeGB: 4
表示使用4GB内存),避免缓存过大导致系统内存不足。需根据服务器内存容量(如16GB服务器可设置8-12GB)及业务负载调整。echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
命令禁用,并在/etc/rc.local
中添加开机自启。swappiness
:降低系统使用交换分区(Swap)的概率(如vm.swappiness=0
),减少磁盘I/O压力,提升数据库性能。/etc/security/limits.conf
,添加mongodb hard nofile 100000
、mongodb soft nofile 100000
,避免连接数过多导致进程崩溃。db.collection.createIndex({ field: 1 })
),避免全表扫描;使用复合索引优化多字段查询(如db.collection.createIndex({ field1: 1, field2: -1 })
);定期通过db.collection.explain("executionStats")
分析查询性能,删除未使用的索引。db.collection.find({ field: 1 }, { _id: 0, field: 1 })
)只返回必要字段,减少数据传输量;采用分页查询(limit()
与skip()
组合)避免一次性返回大量数据;避免在where
子句中使用函数或运算符(如db.collection.find({ field: { $gt: 100 } })
优于db.collection.find({ $where: "this.field > 100" })
)。ext4
或XFS
文件系统(XFS对大文件支持更好,推荐用于MongoDB)。rs.initiate()
命令初始化副本集,实现主节点故障时的自动选举,提升数据可靠性与读取性能(从节点可处理读请求)。sh.shardCollection("database.collection", { field: 1 })
),选择均匀分布的分片键(如user_id
、timestamp
),避免数据倾斜;添加分片节点时,使用sh.addShard()
命令将新节点加入集群。mongostat
(监控每秒操作数、读写延迟等)、mongotop
(监控集合级读写时间)命令实时查看数据库性能;使用db.serverStatus()
命令查看内存、连接、锁等详细信息。grep "slow" /var/log/mongodb/mongod.log
),找出慢查询;开启慢查询日志(operationProfiling.mode: slowOp
,设置slowOpThresholdMs
阈值,如100ms),记录执行时间超过阈值的查询。db.repairDatabase()
命令修复损坏的数据库;定期重建索引(db.collection.reIndex()
),优化索引结构;清理无用数据(如过期日志、临时集合),释放磁盘空间。security.authorization: enabled
,强制用户登录;创建管理员用户(use admin; db.createUser({ user: "admin", pwd: "yourPassword", roles: ["userAdminAnyDatabase"] })
),分配最小必要权限(如readWrite
、dbAdmin
)。net.bindIp
限制访问IP(如仅允许应用服务器IP访问);使用防火墙(如ufw
、firewalld
)开放MongoDB端口(默认27017);避免使用默认端口(如修改为27018
),降低被扫描的风险。