2012-03-14 78 views
1

当平衡器想要移动它时,数据如何从源分片移动到目标分片?这些数据是否会从源分片移动到monogoS然后插入到来自mongoS的目标分片中,或者源分片和目标分片是否会打开一个专用连接并在它们自己和mongoS之间移动数据来监视它?平衡器数据管道

如果这是第二种情况,这是否意味着每个分片上都有一个平衡器逻辑运行?

回答

2

平衡发生在mongos。 Mongos将每15秒触发一次平衡运行。如果发现块分布不均匀,则会选择一个块进行迁移并启动该迁移。一旦达到这一点,mongos /平衡器就完成了。从这里开始,数据的实际迁移发生在两个mongod实例/碎片之间。

因此,在分片上没有运行平衡逻辑,但分片一旦由平衡器启动就会在它们自己之间执行迁移。

+0

那么它是运行迁移逻辑还是源碎片的目标碎片?什么机制被使用?我的意思是迁移逻辑使用通用monogd API来加载块,然后移动它?我基本上想了解迁移是如何发生的,因为它在我的快速批插入过程中发生,并导致大量页面错误并放慢我的批插入。 – iCode 2012-03-15 19:06:33

+0

源分片运行逻辑。目标碎片“盲目”信任源碎片指令。它不使用通用API,但使用内部多阶段提交和重试系统来确保迁移安全完成,并且不会导致不一致的情况。正如你可以想象的那样,有不少边缘案例需要考虑。它会减慢批量插入的速度,因为它必须将所有对写入热块的写入保持迁移到目标碎片上移动的版本。在某些时候,它会将写入操作锁定到源块并拒绝写入。 – 2012-03-16 16:06:01

+0

请注意,当我说“拒绝写入”时,意味着mongos被通知尝试写入一个陈旧的块,并且它会自动重试写入接收块/碎片。页面错误等是接收方必须将适当的磁盘段/页面交换到内存中的自然结果。如果有帮助,您可以将平衡配置为仅在特定时间间隔发生。 – 2012-03-16 16:07:24