在使用MongoDB过程中从片键的选择、分片配置等方面总结了以下一些经验。
片键的选择
- 如果在某集合中一个键有N个值,那就只能有N个数据块,因此只能有N个分片。所以避免使用单一的小基数片键,如果要使用小基数片键,务必使用组合片键。
- 如果一个集合有生命周期,使用该生命周期作为片键。
- 不要使用升序键,这会使所有新插入的数据都插入到最后一个分片上。
- 每个键上都有索引,而索引数量的增加会使写操作变慢。
- 一般性的好的片键的片键公式:{coarseLocality:1,search:1};前者控制数据局部化,后者为常用索引字段
个人理解的热点:单一且不可分散的进行频繁读写操作的分片
总结:实际过程中要想选择出一个好的片键,需要充分了解数据特征,再结合以上几点原则。
配置服务器
- 通常运行1个或3个配置服务器(1:测试环境;3:生产环境)
- mongos–configdb configsvr1, configsvr2, configsvr3
分片
- 添加分片时用addshard的maxSize选项处理服务器容量失衡
- 在还有足够调度空间的时候就开始添加分片;在非忙时段(服务器负载量较小的时段)添加分片,减少服务器负担
- 新添加的分片可以非空,我们可以把多个系统交叉使用集中起来攒成一个大的分片集群(一个集群使用的是foo数据库,另一个集群使用bar数据库,他们可以运行在同一集群上)
- 如果想修改集群中某个副本集中的服务器,可绕开mongos,直接连接该服务器来修改服务器配置
管理
- connectto configserver,use config,查看config数据库,里面记载了所有集群配置信息。
- 注意查看config.changelog内容
- Mongostat-最全面的监控工具,能返回大量与服务器运行有关的信息。可用参数:qr|qw,ar|aw
- http://localhost:port/_replSet,web管理界面
查询优化
- 当返回结果为总体数据的一小部分的时候,使用索引会有很明显的优化效果,否则有可能会适得其反
- 索引覆盖查询
- 组合索引加快多个查询
- 索引会增加很多额外的写入,因此在插入大量数据时会严重影响插入速度,此问题暂时还没有找到好的解决办法。
- And型查询:将查询条件更苛刻的项放在前面,可大量减少需要查看的文档数。
- Or型:与And型相反,将匹配最多的放在最前面
查询只返回某一字段
例:查询avIrd为138的文档,只返回fId,其他字段不返回
db.type2.find({avIrd:138},{"_id":0,fId:1})
注:_id默认返回,所以要显示定义其不返回
MongoDB使用心得
最新推荐文章于 2024-04-09 15:51:08 发布