mongodb最佳实践
官方文档对限制的描述:
https://docs.mongodb.com/manual/reference/limits/
表数据不可能无限大,主要基于,
1,表大了运维会带来困难,比如balance。备份还原。副本集同步。冷启动。刷脏页。传输带宽。这些需要全量高IO操作的都会需要很长时间,影响可用性。
2,表大了不可避免的对性能有影响,主要看热数据在内存中的容量。
一些建议:
表数据不可以无限大下去。在实际使用中我们也发现,数据量大之后有些运维动作会很不方便,最典型的有:
- 重新同步从节点
- 从备份恢复数据
所以为了日常运维方便,建议数据量维持在一定量之内。
这个量我们的经验值是每个节点2TB。注意是节点,不是表。
再注意这里说的2TB是数据容量,不是存储容量。由于压缩的存在,存储容量会比数据容量小得多。
数据容量可以在各个库上执行db.stats().dataSize获得。
副本集每个实例建议数据不要超过4T,数据量大备份恢复时间会很长
最大文档大小有助于确保单个文档不会使用过多的RAM或在传输过程中占用过多的带宽。要存储大于最大大小的文档,MongoDB提供了GridFS API。
MongoDB支持BSON文档嵌套的级别不超过100。
单表行数,如果做限制参数,那不要超过2的32次方,就是42亿。如果不设定现在参数,那么默认行数不限制。
If you specify a maximum number of documents for a capped collection using the max
parameter to create
, the limit must be less than 2 32 documents.
If you do not specify a maximum number of documents when creating a capped collection, there is no limit on the number of documents.
-----------------------------------------------------------------------------------------------------------------------------------------------------
预估项目mongo集群规模:
获取单个文档大小,单位 bytes
PRIMARY> Object.bsonsize(db.result.findOne())
9739 完全数据一个document差不多9KB大小,如果6亿行,那就是5T大小
一天50w的扫描量计算,
1年2亿条数据,那就是1.6T的数据,5个分片,每个分片就是300G数据
1个季度5000万条数据,总共0.4T数据,400多G数据,分5片,每片80G数据,1000万行。
mongos> Object.bsonsize(db.sha256_test.findOne())
329 只是白名单数据一个document差不多329b
白名单30亿行数据以上,分5片,每片6亿行,一行329b大小,一共180G大小,总共差不多1T的数据。
如果内存按表数据大小的30%给与,那么就是54g
源数据是,7片,一片300g,一共2T数据。
综上,
1季度,日扫描50w量的数据+白名单历史数据,一共0.4T+1T=1.4T数据。
单分片行数1000万+6亿行=6亿行数据,单分片大小80G+180G=260G数据。分5片
mongo qps 预估400到500,结合s目前近100的qps使用6G内存,申请8G内存先跑起来观察产品运行情况
结论:
需要集群环境:
2个路由节点,3个配置节点,5个分片节点,每组分片是一个副本集
集群配置:
路由节点与配置节点可以按照标准配置
分片节点,8G内存,500G磁盘