Mongodb技术沙龙@admaster

- 使用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技术沙龙@admaster)