关于mongodb分片的问题

公司原本使用Mongodb单节点存储一些文档内容,现在要部署成分片副本的形式。自己在网上看了相关的一些文章,这里遇到这样的问题。比如创建了一个数据库,然后执行sh.enableSharing(数据库名) 然后sh.shardCollection一个集合名,之后使用mongorestore向这个数据库中恢复一个集合(就是原先的某天的业务数据)
片键设置的是 _id 以hashed的形式
然后sh.status()
看到图片描述

里面有autoSplit 为yes,下面还显示3个分片都有chunks,这应该是该数据库已经处于分片的模式,然后按照下面use verbose if you want to force print来打印详细的信息
为何又显示
图片描述

说数据库并没有设置分片呢?
另外原先是每天以时间戳的形式向MONGODB中创建一个新的集合,然后插入相应的数据。而我看分片配置,都是先设置数据库,然后设置集合。能否设置该数据库之后所有集合都进行分片处理。

另外,我阅读了一些文章,说道设置片键可以影响文档在分片中的存储情况,比如按顺序存储,或者使用哈希进行随机存储。那如果固定百分比存储片键,应该如何设置片键呢?比如说分片一存储三分之二数据,而分片二存储三分之一数据。

阅读 3.2k
1 个回答

然后按照下面use verbose if you want to force print来打印详细的信息

printShardingStatus的用法请参考文档:db.printShardingStatus()。你看到的介绍这个方法的文章可能讲错了(或者是很老的版本?),最近几个版本都没有截图这样的用法。

能否设置该数据库之后所有集合都进行分片处理。

不能。集合内容都不知道,片键也不确定,怎么可能自动就设置分片了呢?但是分片的命令sh.shardCollection是可以反复执行的,所以不确定的时候可以多执行一遍不会造成危害。

另外,我阅读了一些文章,说道设置片键可以影响文档在分片中的存储情况

这个话题可能展开讲有点大,官方文档对于分片的选择原则讲解很详细,参考一下文档:Shard Keys
按照这些原则来选择分片,能够让你的数据尽可能均匀地分散在不同的片上。你要的功能叫做Tag Aware Sharding,即是按shard key的范围把数据通过Tag分配到不同的片上,这个功能在文档中也有很详细的介绍,参考上面的链接。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进