- 使用Mongodb的时候需要考虑的事情:
MongoDB关注内存而不是CPU,计算负载不高,理想是所有数据的都能放在内存中
退而其次确保内存能把常用数据集都放下(索引+热数据)
- replica set + auto-sharding
做好不易,特别注意sharding key的优选,要克服的问题:shard 不均衡,数据波动, 另外
做好mongos可靠性的评估, 另外可以考虑多库/多RS, no-sharding 并且每个instance
可以考虑放多个mongod, Primary/Secondary 尽量交叉部署, 适当的使用Arbitor来参
与选举。
- 注意事项
1)预分配数据文件, 在运行中分配会导致超时现象,另外通过预测可以一次性将db的data file创建达到预设
head -c 2146435072 /dev/zero > db.02
cp db.02 db.03 ...
2)时刻关注数据碎片情况
db.collection.stats() => paddingFactor
update/remove 导致碎片产生
定期reIndex可改善减少碎片
3)repair vs compact
都能对数据文件碎片处理, compact的速度快,可单独collection, 但无法释放多余空间, 实用性
有限;而db.repairDatabase速度缓慢,但处理彻底,paddingFactor重置,更新速度会下降。所以
当要需要释放多余空间的时候可以定期要对Primary进行repair,采用Primary step down -> repair database -> 切回
4)mongostat
重点关注 locked, faults, 其中faults > 100, 内存非常不足;locked > 30, 写锁问题严重
5)DB profiling (可以记录慢操作,比如>200ms的操作)
db.setProfilingLevel(1,200)
db.system.profile.find().sort({$natural:-1})
排查:
查询 => nscanned很大(无索引)
更新:moved(doc需要重写,碎片), 而不是fast modify
6)创建新文档时做padding(尽量保证更新操作是in place update。避免数据迁移)
对于空白的字符采用字段占位
变长字段放置最后
BinData可用于占位padding
7)对于更新操作可以考虑使用Read-Update模式可以提高索引命中,加热索引纪录;尽量使用multi为
true同时更新多个documents(避免write-lock占用时间太长)
8)实时数据推送可以考虑使用capped collection实现的tailable cursor
9)Web server可以根据自己的业务场景在Nginx, OpenResty 或者Nodejs之间选择。
MongoDB关注内存而不是CPU,计算负载不高,理想是所有数据的都能放在内存中
退而其次确保内存能把常用数据集都放下(索引+热数据)
- replica set + auto-sharding
做好不易,特别注意sharding key的优选,要克服的问题:shard 不均衡,数据波动, 另外
做好mongos可靠性的评估, 另外可以考虑多库/多RS, no-sharding 并且每个instance
可以考虑放多个mongod, Primary/Secondary 尽量交叉部署, 适当的使用Arbitor来参
与选举。
- 注意事项
1)预分配数据文件, 在运行中分配会导致超时现象,另外通过预测可以一次性将db的data file创建达到预设
head -c 2146435072 /dev/zero > db.02
cp db.02 db.03 ...
2)时刻关注数据碎片情况
db.collection.stats() => paddingFactor
update/remove 导致碎片产生
定期reIndex可改善减少碎片
3)repair vs compact
都能对数据文件碎片处理, compact的速度快,可单独collection, 但无法释放多余空间, 实用性
有限;而db.repairDatabase速度缓慢,但处理彻底,paddingFactor重置,更新速度会下降。所以
当要需要释放多余空间的时候可以定期要对Primary进行repair,采用Primary step down -> repair database -> 切回
4)mongostat
重点关注 locked, faults, 其中faults > 100, 内存非常不足;locked > 30, 写锁问题严重
5)DB profiling (可以记录慢操作,比如>200ms的操作)
db.setProfilingLevel(1,200)
db.system.profile.find().sort({$natural:-1})
排查:
查询 => nscanned很大(无索引)
更新:moved(doc需要重写,碎片), 而不是fast modify
6)创建新文档时做padding(尽量保证更新操作是in place update。避免数据迁移)
对于空白的字符采用字段占位
变长字段放置最后
BinData可用于占位padding
7)对于更新操作可以考虑使用Read-Update模式可以提高索引命中,加热索引纪录;尽量使用multi为
true同时更新多个documents(避免write-lock占用时间太长)
8)实时数据推送可以考虑使用capped collection实现的tailable cursor
9)Web server可以根据自己的业务场景在Nginx, OpenResty 或者Nodejs之间选择。