2012-07-22 59 views
4

我试图确保理解将新碎片(副本集)添加到现有碎片集群时会发生什么情况。当我添加这些新成员并且发现有新的Shard成员可用时,Mongo开始重新安排这些块,以便它可以利用新成员正确的优势?发生这种情况时会对您造成什么样的影响?和往常一样,我会假设你想尝试添加这些成员,只要你开始看到不利的性能数字(如果其他调优选项没有帮助)。MongoDB将碎片添加到现有集群 - 会发生什么?

只是为了更好地理解当群集已经存在时添加碎片时会发生什么。

感谢,

小号

回答

4

当您添加一个碎片到现有群集,它会自动成为每一个分片收集的最低数块碎片。这意味着它将成为迁移的默认目标(从块的数量最多的碎片),直到事情变得更加平衡。但是,每个碎片主(它负责迁移)一次只能参与一次迁移。因此,平衡将需要一段时间,特别是如果事情处于负载状态。

就迁移本身而言,您已经在当前的集群中看到了它们,因此如何判断它们的影响。您可以在日志中查看最近的迁移,或者你可以看看更新日志(10MB的上限集合,其中包含最新的迁移/拆分等):

// connect to a mongos, switch to the config DB 
use config 
// look at the changelog 
db.changelog.find() 

在用什么操作发生方面,以及移动块:

  1. 组成该块的文件必须在源碎片被读入内存,如果不是已经存在(这样比较规范的读)
  2. 然后将它们发送到目的地碎片(相当标准的插入/写入)
  3. 最后,元数据更新后,它们从源分片中删除。

步骤3是一个删除操作,它需要源分片上的写入锁定,但它应该非常快 - 文档已经在迁移的内存中。

增加迁移的频率的另外一个影响是,碎片的版本将被更频繁地更新 - 特别是主要碎片版本(所以它有一个长达块到碎片的最新地图

这意味着你将会看到更多关于mongos的日志消息,这些消息需要刷新它的配置并更新其碎片版本。在启动像Map/Reduce或findAndModify这样的长时间运行操作之前运行flushRouterConfig command也是个好主意。

如果你的碎片有低使用率的时期,你会看到迁移发生得更快,你也可以考虑使用balancer window选项只在某些时间运行平衡,如果您发现有重大影响。

+0

感谢亚当我欣赏信息 – scarpacci 2012-07-22 20:58:03

3

一如往常我会假设你想尝试,一旦你开始添加这些成员看到不利的性能数字

这是我的经验,你要在预期加碎片的增加交通。特别是如果碎片数量很少(大约< 6)。将数据迁移到新节点会增加现有节点上的IO,同时也会增加网络流量。

所以,如果你已经遇到IO问题,增加一个分片会让事情变得更糟。您最终可能会使用“平衡器”窗口选项进行“保姆”移植。事实上,平衡器窗口选项的存在会告诉你一些关于平衡过程的强度。

发生这种情况时会给您带来什么样的影响?

这里的另一个不寻常的副作用是通常不在内存中的数据可能被拉入内存。例如,如果您的历史数据一天中大部分时间都处于未触及的状态,那么即使您的客户没有主动阅读它,也可以将其移至被移动的位置。

同样,这将回到IO和我上面的评论。

当我添加这些新成员,它看到有一个新的碎片会员提供蒙戈然后开始重新安排块...

注意,这仅发生于那些集合分片并有分片键。无毛的收藏根本不动。这有时会在雷达之下飞行,直到流量开始累积在一个碎片上,原因不明。

对于未硬化的数据,您可能希望将其保留在单独的副本集上以确保您的碎片按预期行为。

+0

感谢@GatesVP非常有帮助的信息! – scarpacci 2012-07-23 16:43:59

相关问题