MongoDB中的自动分片是否适用于具有许多小集合/小数据库的分片

MongoDB中的自动分片是否适用于具有许多小集合/小数据库的分片,mongodb,replication,sharding,Mongodb,Replication,Sharding,在MongoDB的自动切分文档中,它说:“切分是在每个集合的基础上执行的。小集合不需要切分。” 我们的业务有许多数据库(~100个),有许多小集合(~30个),每个数据库的文档数为1-3000。我们的数据库系统每月的页面浏览量约为100000000次 在这种情况下,将永远激活切分,因为集合永远不会足够大,即使数据库使用率和站点流量肯定很高,需要负载平衡。从这些文档中,我似乎找不到一个明确的答案。使用shard是否有意义取决于您是否对数据库进行了大部分写入或读取。分片主要用于写扩展,但是如果您没有

在MongoDB的自动切分文档中,它说:“切分是在每个集合的基础上执行的。小集合不需要切分。”

我们的业务有许多数据库(~100个),有许多小集合(~30个),每个数据库的文档数为1-3000。我们的数据库系统每月的页面浏览量约为100000000次


在这种情况下,将永远激活切分,因为集合永远不会足够大,即使数据库使用率和站点流量肯定很高,需要负载平衡。从这些文档中,我似乎找不到一个明确的答案。

使用shard是否有意义取决于您是否对数据库进行了大部分写入或读取。分片主要用于写扩展,但是如果您没有进行大量的写操作,那么简单地使用带有“slaveook”的ReplicaSet进行读操作也可以


从您提供的数字来看,您似乎获得了大约900万份文档,但它们是大型文档吗?如果它们很容易放入内存中,那么除了故障切换功能之外,很可能根本不需要复制集。

如果不了解您的用例,这很难回答,但我会试一试

你确定你需要切分吗?你的插入率是多少

如果您要有一个静态的数据集,或者甚至是一个相对静态的数据集,那么您可能不需要切分,您可以简单地使用更多的二级数据集并启用slaveOK读取。读取内容将分发到各个辅助设备,并扩展您的读取容量

如果情况并非如此,并且您确实需要切分,那么还有一些选择。但首先,简要地从高层次解释自动切分是如何工作的:

mongos进程通常负责分割和迁移块。这是两个独立的操作-拆分和平衡

  • 当mongos看到 已写入最大块大小,如果存在,则会启动拆分 事实上,有足够的数据来证明这一点。随着时间的推移,有足够的数据 写入时,块的数量会增加
  • 当块(当前为8英寸)不平衡时,会发生平衡 2.0,但在2.2)中采用了更具动态性的启发式方法。均衡器在碎片周围迁移块,直到达到平衡
因此,您需要相对于最大块大小(2.0中的默认值为64MB)写入足够的数据,以生成平衡器适当移动它们所需的块。如果您的数据不会出现这种情况,那么您可以查看:

  • 减小块大小(也有缺点-)
  • 手动分割/移动块
  • 有关手册说明,请参阅:


    在这个场景中,我们可能正在进行9:1读/写操作,因此看起来切分是完全不必要的。我正在调查副本集,以及它们是否能够为我们提供必要的负载平衡。