mongodb --平衡器

Mongodb 平衡器

        

1.      概念

         均衡器会周期的检查分片是否存在不平衡,每隔几秒,mongos就会尝试成为平衡器,s会对整个集群加锁,以防止配置服务器对集群进行修改。均衡并不会影响Mongos的正常路由,使用Mongos的客户端不会受到影响.

当Mongos成为均衡器之后,判断各个分片中使用块的数量,不关心数据量的大小。只有在分片数量不对称的时候,才会启动。移动过程发生在块数最大与最小的分片之间。

在数据的迁移过程中,所有的读写请求会被路由到旧的块中。一旦元数据更新之后,指向旧块的读操作将会失败,这个时候Mongos会将这些请求到新块中,即再次执行请求,这部分工作对于用户来说是透明的。

2.      数据迁移过程:

1.      平衡器进程发送movechunk命令到源分片中

2.      原分片开始启动moveChunk命令,在移动的过程中,所有的操作都还是会指向原来的分片。

3.      目标分片开始创建所需要的索引

4.      目标分片开始向原分片请求数据,并复制数据

5.      当数据全部写入到目标分片中,目标分片连接并更新config数据库中的对应块的元数据信息

6.      最后,原分片将这部分块删除。

 在3.4版本中,mongodb可以并行的移动块,如果有N个块的分片,可以同时进行n/2的块迁移任务。

为了将平衡器产生的影响降低到最小,根据块数的不同,阈值也会不同。当分片中的集合数目小于2或者移动出现失败,平衡器会停止。平衡器不会等待当前块删除之后开始新的块移动。在一些情况下,删除过程会持续很久,如果很多的删除过程在排队,没有完成,那么副本集中的主节点可能会出现问题。

因此在分片集群中经常会出现:

moveChunk failed to engage TO-shard in the data transfer: can'taccept new chunks because there are still XXX deletes from previous migration

可以采用_waitForDelete,等待上一个操作结束后,再进行下一个数据块的移动。但是这个参数的设置将会使得后面的操作被阻塞,如果等待删除的块比较多,最好的方式是那个可以解决很多问题的步骤:重启。

3.      影响

       均衡过程会增加系统负载:目标分片必须查询源分片块中的所有文档,将文档插入目标块中,需要删除源分片。向集群中添加新分片时,均衡器会试图向该分片写入数据,会有一个数据迁移的过程。那么对应的措施:

1、  为均衡器指定一个时间窗口,指定在某个特定的时间内执行数据移动操作。

2、  手动进行均衡,但是这种做法要非常小心。

4.      特大块

如果块中的文档数超过了250,000或者块的大小大于配置文件中的chunkSize大小的1.3倍。

5.      启动与禁止平衡器

         默认情况下,在任何需要移动块的时候,平衡器都会进行工作。可以使用sh.stopBalancer()来禁止平衡器,通过sh.getBalancerState()来观察当前平衡器的状态。启动平衡器:sh.setBalancerState(true)

        如果mongodb正在移动数据,不要尝试去改变分片集群中的元数据,不应该采取任何可能会修改元数据的操作。比如,创建或者删除数据库,创建或者删除集合,或者使用任何分片的命令,否则可能会得到不一致的快照结果。

         当平衡器在运行的时候也不要进行备份,应该将其禁止。可以设置平衡窗口,这样子在备份期间得到的数据才会是正确的。但是在禁止平衡器时,它不一定马上就停止,会等到当前的平衡过程终止。所以在备份之前一定要确保平衡器没有在运行。对应的命令为:sh.getBalancerState(),sh.isBalancerRunning()

         禁止平衡器的操作可以应用于某个特定的集合。Sh.enableBalancing()。利用这个操作是否可以实现在运行期间,将数据库禁止平衡,但是允许某个集合进行平衡,可以对正在运行的数据库进行备份,不影响整体的性能。那么是否可以设置某个集合禁止平衡。

猜你喜欢

转载自blog.csdn.net/tang_jin2015/article/details/70231570