优化Ubuntu环境下MongoDB存储的核心策略
MongoDB默认使用WiredTiger存储引擎(推荐),其支持文档级锁定、事务和高效压缩(Snappy/Zlib/LZ4),比旧版MMAPv1更适合大多数场景。若应用为纯读密集型且无需事务,可考虑MMAPv1,但WiredTiger仍是主流选择。
WiredTiger的cacheSizeGB参数需合理设置,建议为物理内存的50%-75%(避免占用过多内存导致系统或其他进程卡顿)。例如,16GB内存的服务器可设置为8GB:
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 8
充足的内存能缓存更多数据和索引,减少磁盘I/O,显著提升查询性能。
WiredTiger支持Snappy(默认,平衡压缩率与性能)、Zlib(高压缩率,适合归档数据)和LZ4(低延迟,适合高频读写)算法。在配置文件中启用压缩:
storage:
wiredTiger:
collectionConfig:
blockCompressor: snappy # 或zlib/lz4
压缩后存储空间可减少30%-70%(具体取决于数据类型),但会增加少量CPU开销,需根据业务需求权衡。
deleteMany()删除;createdAt)创建TTL索引,自动删除过期文档(例如日志集合设置7天过期):db.logs.createIndex({ createdAt: 1 }, { expireAfterSeconds: 604800 }) // 7天=604800秒
可避免手动清理,减少存储压力。--smallfiles选项创建较小初始文件(适用于小数据量场景),或手动设置storage.smallFiles: true;storage.journal.enabled: true(默认开启),提升数据持久性(崩溃后快速恢复);logRotate工具定期分割日志文件(如按天分割),避免日志文件过大占用磁盘空间。username、email),避免过度索引(每个索引会增加写操作开销和存储空间);find({ status: "active", age: { $gt: 18 } })),创建复合索引并按查询频率排序(选择性高的字段在前):db.users.createIndex({ status: 1, age: 1 }) // status过滤频率高,放在前面
find({ username: "john" }, { username: 1, _id: 0 })可使用{ username: 1 }索引);reIndex()重建碎片化索引(如db.users.reIndex()),提升查询效率。对于海量数据(如TB级),使用MongoDB分片功能将数据分布到多个服务器(分片集群),每个分片存储部分数据。分片键选择需均匀分布数据(如user_id、order_id),避免热点问题。分片可显著提升存储容量和查询并发能力。
使用MongoDB自带工具(mongostat查看操作速率、mongotop查看集合级IO)或第三方工具(如Percona PMM)监控存储使用情况、索引命中率等指标。根据监控结果调整配置(如增加cacheSizeGB、优化索引),确保存储系统始终处于最佳状态。