本文档风哥主要介绍MongoDB WiredTiger引擎优化,包括WiredTiger引擎基础概念、引擎特性、引擎架构、引擎规划、硬件要求、优化建议、引擎配置、引擎调优、引擎监控、优化实战案例、性能测试实战、维护实战等内容,风哥教程参考MongoDB官方文档WiredTiger Storage Engine内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 WiredTiger引擎基础概念
WiredTiger是MongoDB 3.2及以上版本的默认存储引擎,提供高性能、高可靠性和丰富的功能。更多视频教程www.fgedu.net.cn
- 缓存(Cache):用于存储热点数据,提高读写性能
- 事务(Transaction):支持ACID特性的事务处理
- 压缩(Compression):支持多种压缩算法,减少存储空间
- 并发控制(Concurrency Control):使用乐观并发控制,提高并发性能
- 检查点(Checkpoint):定期将内存中的数据持久化到磁盘
1.2 WiredTiger引擎特性
WiredTiger引擎具有以下特性:
## 性能特性
– 高并发读写性能
– 低延迟操作
– 支持多线程处理
– 优化的内存使用
## 存储特性
– 支持多种压缩算法(Snappy、zlib、zstd)
– 前缀压缩索引
– 列式存储格式
– 空间回收机制
## 事务特性
– 支持ACID事务
– 乐观并发控制
– 多版本并发控制(MVCC)
– 原子操作支持
## 可靠性特性
– 检查点机制
– 预写日志(WAL)
– 崩溃恢复
– 数据一致性保证
1.3 WiredTiger引擎架构
WiredTiger引擎的架构主要包括以下组件:
## 核心组件
– **缓存层(Cache Layer):** 管理内存中的数据和索引
– **事务层(Transaction Layer):** 处理事务和并发控制
– **存储层(Storage Layer):** 管理数据的持久化存储
– **索引层(Index Layer):** 管理数据索引
## 存储结构
– **数据文件:** 存储实际数据
– **索引文件:** 存储索引数据
– **日志文件:** 存储预写日志
– **元数据文件:** 存储引擎元数据
## 工作原理
1. 数据读写首先通过缓存层
2. 事务层处理并发控制
3. 定期通过检查点将数据持久化到磁盘
4. 预写日志确保数据一致性
Part02-生产环境规划与建议
2.1 WiredTiger引擎规划
在生产环境中,需要对WiredTiger引擎进行合理规划:
## 缓存规划
– 缓存大小:一般为系统内存的50%
– 内存预留:为操作系统和其他进程预留足够内存
– 缓存监控:定期监控缓存使用情况
– 缓存调优:根据实际情况调整缓存大小
## 存储规划
– 存储类型:推荐使用SSD
– 存储容量:根据数据量和增长趋势规划
– 存储布局:数据文件和日志文件分离
– 存储监控:定期监控存储使用情况
## 压缩规划
– 压缩算法:根据数据特性选择合适的压缩算法
– 压缩级别:根据性能和空间需求调整
– 压缩监控:评估压缩效果和性能影响
## 并发规划
– 连接数:根据服务器资源调整
– 线程数:根据CPU核心数调整
– 并发控制:优化事务处理
2.2 WiredTiger引擎硬件要求
WiredTiger引擎的硬件要求取决于数据量和并发访问量:
## 内存
– 小型部署:8GB+ RAM
– 中型部署:16GB-32GB RAM
– 大型部署:64GB+ RAM
## CPU
– 小型部署:4核+ CPU
– 中型部署:8核+ CPU
– 大型部署:16核+ CPU
## 存储
– 小型部署:100GB+ SSD
– 中型部署:500GB+ SSD
– 大型部署:1TB+ SSD
## 网络
– 小型部署:千兆网卡
– 中型部署:千兆网卡
– 大型部署:万兆网卡
2.3 WiredTiger引擎优化建议
WiredTiger引擎的优化建议:
## 缓存优化
– 合理设置缓存大小
– 监控缓存使用情况
– 避免内存交换
– 确保足够的内存
## 存储优化
– 使用SSD存储
– 启用压缩
– 定期整理碎片
– 合理规划存储布局
## 索引优化
– 创建适当的索引
– 使用前缀压缩
– 避免过多的索引
– 定期重建索引
## 事务优化
– 合理使用事务
– 避免长事务
– 优化事务隔离级别
– 监控事务性能
## 并发优化
– 调整连接数
– 优化线程池
– 合理设计应用程序
– 避免锁竞争
Part03-生产环境项目实施方案
3.1 WiredTiger引擎配置
3.1.1 基础配置
## 配置文件
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
storage:
dbPath: /mongodb/fgdata
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 8
directoryForIndexes: true
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
EOF
## 启动MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
3.1.2 高级配置
## 配置文件
$ cat > /mongodb/conf/mongod.conf << EOF
# mongod.conf
storage:
dbPath: /mongodb/fgdata
journal:
enabled: true
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 16
directoryForIndexes: true
maxCacheOverflowFileSizeGB: 4
checkpointSizeMB: 256
statisticsLogDelaySecs: 0
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
sortInterleaved: true
EOF
## 重启MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf --shutdown
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
3.2 WiredTiger引擎调优
3.2.1 缓存调优
## 查看当前缓存配置
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> db.serverStatus().wiredTiger.cache
## 调整缓存大小
# 在配置文件中设置
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 16
## 监控缓存使用情况
fgedu.net.cn> db.serverStatus().wiredTiger.cache
{
“application threads page read from disk to cache count”: 1000,
“application threads page read from disk to cache time (usecs)”: 50000,
“application threads page write from cache to disk count”: 500,
“application threads page write from cache to disk time (usecs)”: 25000,
“bytes allocated for cache”: 17179869184,
“bytes currently in cache”: 8589934592,
“bytes dirty in cache prior to flush”: 0,
“bytes read into cache”: 104857600,
“bytes written from cache”: 52428800,
“cache overflow writer thread count”: 0,
“cache overflow writer thread page write from cache to disk count”: 0,
“cache overflow writer thread page write from cache to disk time (usecs)”: 0,
“cache resize status”: “completed”,
“compact calls”: 0,
“current cache size”: 16384,
“current maximum cache size”: 16384,
“dirty bytes in the cache”: 0,
“eviction server candidate queue size”: 0,
“eviction server evicting pages”: 0,
“eviction server pages evicted from cache to disk”: 0,
“eviction server pages selected for eviction”: 0,
“eviction server thread count”: 4,
“eviction server unevictable queue size”: 0,
“eviction server worker thread count”: 4,
“eviction statistics”: {
“eviction walk target pages deduplicated”: 0
},
“hazard pointer blocked page eviction”: 0,
“maximum bytes configured”: 17179869184,
“maximum cache size”: 16384,
“page split during eviction deepened the tree”: 0,
“page split during eviction shrank the tree”: 0,
“pages currently held in the cache”: 100000,
“pages read into cache”: 1000,
“pages read into cache requiring cache overflow pages”: 0,
“pages requested from the cache”: 5000,
“pages written from cache to disk”: 500,
“pages written to cache”: 1000,
“rows inserted into cache”: 10000,
“rows read from cache”: 50000,
“rows written from cache”: 10000
}
3.2.2 压缩调优
## 查看当前压缩配置
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> db.collection.stats()
## 调整压缩算法
# 在配置文件中设置
storage:
wiredTiger:
collectionConfig:
blockCompressor: zstd
## 压缩算法比较
– **Snappy:** 压缩速度快,压缩率适中
– **zlib:** 压缩率高,压缩速度较慢
– **zstd:** 压缩率和速度平衡
## 测试压缩效果
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.createCollection(“test_collection”, {storageEngine: {wiredTiger: {configString: “block_compressor=zstd”}}})
fgedu.net.cn> for (let i = 0; i < 10000; i++) {
... db.test_collection.insertOne({name: "test" + i, data: "x".repeat(1000)})
... }
fgedu.net.cn> db.test_collection.stats()
3.3 WiredTiger引擎监控
3.3.1 监控命令
## 查看WiredTiger状态
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> db.serverStatus().wiredTiger
## 查看缓存状态
fgedu.net.cn> db.serverStatus().wiredTiger.cache
## 查看连接状态
fgedu.net.cn> db.serverStatus().connections
## 查看操作统计
fgedu.net.cn> db.serverStatus().opcounters
## 查看存储统计
fgedu.net.cn> db.serverStatus().wiredTiger.storage
## 查看集合统计
fgedu.net.cn> db.collection.stats()
## 查看数据库统计
fgedu.net.cn> db.stats()
3.3.2 监控工具
## MongoDB Compass
– 图形化监控工具
– 查看数据库状态
– 查看集合统计
– 查看操作性能
## mongostat
– 命令行监控工具
– 实时监控MongoDB状态
– 查看操作统计
– 查看内存使用情况
## mongotop
– 命令行监控工具
– 查看集合读写情况
– 实时监控操作延迟
## 第三方监控工具
– Prometheus + Grafana
– Datadog
– New Relic
– SolarWinds
Part04-生产案例与实战讲解
4.1 WiredTiger引擎优化实战案例
以下是WiredTiger引擎优化的实战案例:
## 环境信息
– MongoDB版本:5.0.13
– 操作系统:Oracle Linux 9.3
– 内存:32GB
– 存储:SSD 1TB
## 优化步骤
### 1. 配置WiredTiger缓存
$ cat > /mongodb/conf/mongod.conf << EOF
storage:
wiredTiger:
engineConfig:
cacheSizeGB: 16
EOF
### 2. 启用压缩
$ cat > /mongodb/conf/mongod.conf << EOF
storage:
wiredTiger:
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
EOF
### 3. 调整检查点
$ cat > /mongodb/conf/mongod.conf << EOF
storage:
wiredTiger:
engineConfig:
checkpointSizeMB: 256
EOF
### 4. 重启MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf --shutdown
$ sudo -u mongodb /mongodb/app/bin/mongod --config /mongodb/conf/mongod.conf
### 5. 监控优化效果
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 --authenticationDatabase admin
fgedu.net.cn> db.serverStatus().wiredTiger.cache
fgedu.net.cn> db.serverStatus().opcounters
4.2 WiredTiger引擎性能测试实战
以下是WiredTiger引擎性能测试的实战案例:
## 环境信息
– MongoDB版本:5.0.13
– 操作系统:Oracle Linux 9.3
– 内存:32GB
– 存储:SSD 1TB
## 测试步骤
### 1. 准备测试数据
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.createCollection(“test_performance”)
### 2. 插入测试数据
fgedu.net.cn> var start = new Date()
fgedu.net.cn> for (let i = 0; i < 100000; i++) {
... db.test_performance.insertOne({
... id: i,
... name: "test" + i,
... value: Math.random() * 1000,
... data: "x".repeat(1000),
... created_at: new Date()
... })
... }
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“插入时间: ” + (end – start) + “毫秒”)
插入时间: 15000毫秒
### 3. 查询测试
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.test_performance.find({id: {$gt: 50000}}).limit(1000)
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“查询时间: ” + (end – start) + “毫秒”)
查询时间: 50毫秒
### 4. 创建索引后查询测试
fgedu.net.cn> db.test_performance.createIndex({id: 1})
fgedu.net.cn> var start = new Date()
fgedu.net.cn> db.test_performance.find({id: {$gt: 50000}}).limit(1000)
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“索引后查询时间: ” + (end – start) + “毫秒”)
索引后查询时间: 10毫秒
### 5. 更新测试
fgedu.net.cn> var start = new Date()
fgedu.net.cn> for (let i = 0; i < 10000; i++) {
... db.test_performance.updateOne({id: i}, {$set: {value: Math.random() * 1000}})
... }
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“更新时间: ” + (end – start) + “毫秒”)
更新时间: 10000毫秒
### 6. 删除测试
fgedu.net.cn> var start = new Date()
fgedu.net.cn> for (let i = 0; i < 10000; i++) {
... db.test_performance.deleteOne({id: i})
... }
fgedu.net.cn> var end = new Date()
fgedu.net.cn> print(“删除时间: ” + (end – start) + “毫秒”)
删除时间: 5000毫秒
4.3 WiredTiger引擎维护实战
以下是WiredTiger引擎维护的实战案例:
## 环境信息
– MongoDB版本:5.0.13
– 操作系统:Oracle Linux 9.3
## 维护步骤
### 1. 整理碎片
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.runCommand({ compact: “fgedu_collection” })
### 2. 重建索引
fgedu.net.cn> db.fgedu_collection.reIndex()
### 3. 检查数据库
fgedu.net.cn> db.runCommand({ dbStats: 1 })
### 4. 检查集合
fgedu.net.cn> db.fgedu_collection.stats()
### 5. 监控缓存
fgedu.net.cn> db.serverStatus().wiredTiger.cache
### 6. 监控存储
fgedu.net.cn> db.serverStatus().wiredTiger.storage
### 7. 备份数据
$ /mongodb/app/bin/mongodump -u fgedu -p fgedu123 –authenticationDatabase admin –db fgedudb –out /backup/mongodb
### 8. 清理日志
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf –logRotate reopen
$ sudo rm -f /mongodb/log/mongod.log.*
Part05-风哥经验总结与分享
5.1 WiredTiger引擎最佳实践
WiredTiger引擎的最佳实践建议:
## 缓存配置
– 合理设置缓存大小(系统内存的50%)
– 监控缓存使用情况
– 避免内存交换
– 确保足够的内存
## 存储配置
– 使用SSD存储
– 启用压缩(推荐snappy或zstd)
– 数据文件和日志文件分离
– 定期监控存储使用情况
## 索引配置
– 创建适当的索引
– 使用前缀压缩
– 避免过多的索引
– 定期重建索引
## 事务管理
– 合理使用事务
– 避免长事务
– 优化事务隔离级别
– 监控事务性能
## 监控管理
– 定期监控WiredTiger状态
– 监控缓存使用情况
– 监控存储使用情况
– 监控操作性能
## 维护管理
– 定期整理碎片
– 定期重建索引
– 定期备份数据
– 定期检查数据库状态
5.2 WiredTiger引擎故障排查
WiredTiger引擎故障排查的建议:
## 缓存问题
– 症状:内存使用过高,性能下降
– 解决方案:
– 调整缓存大小
– 监控缓存使用情况
– 检查内存泄漏
– 优化查询和索引
## 存储问题
– 症状:磁盘空间不足,I/O性能下降
– 解决方案:
– 清理无用数据
– 启用压缩
– 扩展存储容量
– 使用更快的存储设备
## 索引问题
– 症状:查询性能下降,索引使用不当
– 解决方案:
– 分析查询计划
– 创建适当的索引
– 重建索引
– 优化查询语句
## 事务问题
– 症状:事务冲突,死锁
– 解决方案:
– 优化事务逻辑
– 减少事务范围
– 调整事务隔离级别
– 监控事务性能
## 崩溃恢复
– 症状:MongoDB崩溃后无法启动
– 解决方案:
– 使用–repair选项修复
– 从备份恢复
– 检查硬件故障
– 检查日志文件
5.3 WiredTiger引擎版本升级
WiredTiger引擎版本升级的实战步骤:
## 升级前准备
– 备份数据库
– 检查当前版本
– 下载目标版本
– 阅读升级文档
## 升级步骤
### 1. 停止MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf –shutdown
### 2. 备份数据
$ sudo cp -r /mongodb/fgdata /backup/mongodb/fgdata-$(date +%Y%m%d)
### 3. 安装新版本
$ sudo yum update -y mongodb-org
### 4. 启动MongoDB服务
$ sudo -u mongodb /mongodb/app/bin/mongod –config /mongodb/conf/mongod.conf
### 5. 验证升级
$ /mongodb/app/bin/mongod –version
### 6. 运行升级检查
$ /mongodb/app/bin/mongosh -u fgedu -p fgedu123 –authenticationDatabase admin
fgedu.net.cn> db.adminCommand({ getParameter: 1, featureCompatibilityVersion: 1 })
fgedu.net.cn> db.adminCommand({ setFeatureCompatibilityVersion: “5.0” })
### 7. 测试功能
fgedu.net.cn> use fgedudb
fgedu.net.cn> db.fgedu_collection.find()
fgedu.net.cn> db.fgedu_collection.insertOne({name: “test”, age: 20})
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
