0

我已经按照这里提到的步骤在一台机器上设置了一个分片集群:

http

://www.mongodb.org/display/DOCS/A+Sample+Configuration+Session 但我不明白'--chunkSize ' 选项:

$ ./mongos --configdb localhost:20000 --chunkSize 1 > /tmp/mongos.log &

对于 N 个分片,每个分片应该有 1/N 个文档,将 shard-key 的范围分成 N 个几乎相等的部分,对吧?这会自动修复 chunkSize/shard-size。上面的命令处理的是哪个块?

此外,还可以按照特定的键值手动拆分集合,然后将一个块迁移到您想要的任何其他分片。这可以手动完成,甚至由“平衡器”自动处理。不'

谢谢你的帮助。

4

2 回答 2

2

你可能会混淆一些事情。--chunkSize 参数设置进行拆分的块大小。“config”数据库中的“settings”集合与_id“chunksize”查看当前值(如果已设置)。--chunkSize 选项将仅设置此值,或对系统进行更改,如果尚未设置值,否则将被忽略。

块大小是以兆字节为单位的大小,高于该大小系统将保留块。这是在两个地方完成的,1)当写入通过 mongos 实例时,2)在平衡期间将块移动到另一个分片之前。因此,它不遵循“数据大小/分片数”公式。您的每块 1Mb 的示例几乎总是一个坏主意。

您确实可以手动拆分和移动块,尽管这可能会导致块分布不太理想,但它永远不会混淆或破坏配置元数据和平衡器。原因比较简单;平衡器使用相同的命令并遵循相同的代码路径。从 MongoDB 的角度来看,平衡器进程拆分和移动块与您执行此操作之间没有显着差异。

不过,有一些有效的用例可用于手动拆分和移动块。例如,您可能希望手动执行此操作,以便从冷启动(预拆分)开始为非常高的峰值负载准备集群。通常,您将编写一个脚本来执行此操作,或者从已经运行良好的性能测试中加载拆分。此外,您可以根据应用程序监控的“负载”观察热块以拆分/移动这些块以均匀分布。

希望有帮助。

于 2012-07-05T15:34:41.727 回答
0

十分感谢!我想我现在明白了..如果我错了,请纠正我:

我在想如果有 N 个服务器,那么集合的前 1/N 部分(=chunk1)将进入 shard1,第二个 1/N ( =chunk2) 会去 shard2 等等。。当你说没有这样的“公式”时,我搜索了一下,发现这些链接

MongoDB 分片,添加新节点时如何重新平衡?

如何在 Mongo 中为每个分片定义分片范围?

从文档中对“块”的定义来看,我认为它只是一个数据迁移的单元。当我们在 N 个服务器之间对一个集合进行分片时,总编号。块的数量不一定是 N。它们也不必大小相同。

一个块的最大大小已经在配置数据库的设置集合中设置为默认值(通常为 64MB),或者可以通过使用 --chunkSize 参数指定值来手动设置,如上面的代码所示。根据分片键的值,一个分片可能比另一个分片有更多的块。但是 MongoDB 使用了一个平衡器进程,试图将这些块均匀地分布在分片之间。通过均匀分布,我的意思是它倾向于拆分块并将它们迁移到其他分片,如果它们变得大于它们的限制或者如果一个特定的分片负载很重。这也可以手动完成,方法是遵循平衡器进程使用的同一组命令。

于 2012-07-05T18:02:53.183 回答