分片键,chunkSize和预分割

时间:2012-07-05 14:21:06

标签: mongodb sharding

我已按照此处提到的步骤在一台机器上设置了分片群集:

http://www.mongodb.org/display/DOCS/A+Sample+Configuration+Session

但我不明白'--chunkSize'选项:

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

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

此外,还可以手动将集合拆分为特定的key值,然后将块迁移到所需的任何其他分片。这可以手动完成,甚至可以通过'平衡器'自动处理。它是否与分片设置发生冲突并混淆配置服务器,或者是否会立即报告任何此类动作?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

希望有所帮助。

答案 1 :(得分:0)

太好了,谢谢!我想我现在明白了......如果我错了,请更正我:

我以为如果有N台服务器,那么集合的第1 /第N部分(= chunk1)会去shard1,第二个1 / Nth(= chunk2)将转到shard2,依此类推。当你说没有这样的“公式”时,我搜索了一下,发现这些链接为
{{{ 3}}

MongoDB sharding, how does it rebalance when adding new nodes?

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

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

相关问题