2012-07-05 83 views
0

我已经建立了分片集群一台机器上,按照这里提到的步骤:

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

但我不明白“--chunkSize”选项:

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

随氮素碎片,每个碎片应该有1/N数量的文档,将所述分片密钥的范围分成N几乎相等的部分,是吗?这会自动修复块大小/分片大小。上面的命令然后处理哪个块?

此外,还可以手动分割集合中的某个特定值的密钥,然后将块迁移到您需要的任何其他分片。这可以手动完成,甚至可以通过“平衡器”自动处理。它是否与分片设置冲突并混淆了配置服务器,或者它们是否立即被报告有关此类移动?拆分键,CHUNKSIZE和预裂

感谢您的任何帮助。

回答

2

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

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

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

虽然有一些有效的用例可以手动分割和移动块。例如,您可能需要手动执行此操作,以便从冷启动(预分割)开始准备群集以实现非常高的峰值负载。通常情况下,您将编写一个脚本来执行此操作,或者从性能测试中加载已经运行良好的分割。此外,您可以监视热块,以便根据应用程序监视的“加载”分割/移动这些块,以均匀分布。

希望有所帮助。

0

太好了,谢谢!我想我现在得到它..如果我错了,请纠正我:

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

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

How to define sharding range for each shard in Mongo?

从“块”的定义文档,我认为它被认为仅仅是数据迁移的一个单元。当我们在N个服务器之间分割一个集合时,总共没有。大块不一定是N.而且它们不需要具有相同的大小。

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

+1

好,techincally来讲它并不试图平衡块,它试图跨越碎片平衡碎片键。但最终结果通常是相同的。 – 2012-07-06 09:16:13

+0

好吧,你是指当节点进入或退出时,平衡器迁移块,以使关键分配均匀。 – 2012-07-06 09:31:35

+0

那么我的意思是它基于分片键而不是块数量进行平衡。那是什么让当有碎片密钥分发热点它正确地平衡(例如很多关于碎片键值的有限范围的数据),基于块分布 – 2012-07-06 10:37:46