1

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

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

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

4

2 回答 2

0

分片是否有意义在某种程度上取决于您是否主要对数据库进行写入或读取。分片主要用于写入扩展,但如果您不进行大量写入,那么简单地使用带有“slaveOkay”的副本集进行读取也可能同样有效。

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

于 2012-04-06T10:40:26.560 回答
0

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

你确定分片是你需要的吗?你的插入率是什么样的?

如果您要拥有一组静态数据,甚至是相对静态的数据集,那么您可能不需要分片,您可以简单地使用更多辅助节点并启用 slaveOK 读取。读取将被分发到各种辅助设备并扩大您的读取容量。

如果不是这种情况,并且您确实需要分片,那么有一些选择。但首先,简要地解释一下自动分片是如何工作的:

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

  • 当 mongos 看到最大块大小的某个部分已被写入时,就会发生拆分,如果实际上有足够的数据来保证它,它就会启动拆分。随着时间的推移,写入足够多的数据后,块的数量就会增加。
  • 当块不平衡时会发生平衡(目前 2.0 中有 8 个,尽管在 2.2 中转向更动态的启发式)。平衡器在分片周围迁移块,直到达到平衡。

因此,您需要写入与最大块大小相关的足够数据(在 2.0 中默认为 64MB),以生成平衡器适当移动它们所需的块。如果您的数据不会发生这种情况,那么您可以查看:

  1. 减小块大小(也有缺点 - http://www.mongodb.org/display/DOCS/Sharding+Administration#ShardingAdministration-ChunkSizeConsiderations
  2. 手动拆分/移动块

有关手册说明,请参阅:

http://www.mongodb.org/display/DOCS/Splitting+Shard+Chunks

http://www.mongodb.org/display/DOCS/Moving+Chunks

于 2012-04-06T10:40:43.110 回答