redis cluster源码研究--reshard

      reshard是redis cluster另一核心功能,它通过迁移哈希槽来达到负载匀衡和可扩展目的。

      用户同样可以用运维工具redis-trib.rb完成reshard工作,具体步骤如下:

   (1)输入如下命令:

        ./redis-trib.rb reshard 127.0.0.1:7000

        其中127.0.0.1:7000是集群里任一节点。

   (2)接着要求输入需要迁移的哈希槽数目,提示如下:

        How many slots do you want to move (from 1 to 16384)?

        假如输入100

   (3)接着要求输入迁入哈希槽的目的节点ID,提示如下:

        What is the receiving node ID?

        假如输入ID:1

   (4)接着要求输入迁出哈希槽的源节点ID,提示如下:

       Please enter all the source node IDs.

         Type 'all' to use all the nodes as source nodes for the hash slots.

         Type 'done' once you entered all the source nodes IDs.

       这里可以输入多个节点ID或选择所有节点(all),这里注意源节点ID不能是目的节点ID。

   (5)接着redis-trib.rb会根据上面信息制定迁移计划,并输出如下:

       Resharding plan:

          Moving slot $slot1 from $sourceid1

          Moving slot $slot2 from $sourceid2   

       Do you want to proceed with the proposed reshard plan (yes/no)?

       这里输入yes

   (6)接着等待数据迁移完成,至此reshard工作结束。


二、实现原理

    通过分析./redis-trib.rb reshard命令,上述(1)~(5)步骤都是在redis-trib.rb脚本完成,到第(6)步才真正发命令给redis cluster,前五步比较简单理解,这里就不分析了,下面主要分析第(6)步骤的实现。

    第六步使用了个五集群命令:cluster setslot imporing、cluster setslot migrating、cluster getkeysinslot、migrate和setslot node,下面对这四个命令进行分析:

(1)cluster setslot $slot imporing $sourceid

    该命令是对target节点设置的,target节点收到该命令,会记录该$slot有一个迁入源$sourceid,该节点在收到对该$slot的请求时会进行处理。

(2)cluster setslot $slot migrating $targetid

    该命令是对source节点设置的,source节点收到该命令,会记录该$slot有一个接收节点$targetid,该节点在处理对该$slot的请求时,如果发现key不在,则会回包给用户,让用户重定用到$targetid。为什么要重定向?这是因为在迁移slot过程中,一是要让新的key写入$targetid,二是正因为该slot的新key写入$targetid,读新key时也需要重定向到$targetid才能获取新key数据。

(3)cluster getkeysinslot $slot $count

    该命令是发给source节点的,目的是获取该$slot的$count个keys。 

(4)migrate $host $port $key $destination-db $timeout

    该命令是发给source节点的,作用是原子地把$key原子地从source节点迁到target节点。通过(3)和(4)可以把该$slot所有keys迁到target节点。

(5)setslot $slot node $targetid

    该命令是发给所有集群节点,让所有集群节点更新该$slot的归属为$targetid,同时清除importing和migrating状态,这里因为会更新哈希槽的归属,故target节点会更新epochconfig值,以保证其他节点更新为该epochconfig值的哈希配置。


总结: 

   通过上面五个操作,就可以完美的迁移slot,迁移过程中不用停止redis cluster对外服务,只要用户能处理重定向情况,就可以完全感知不到迁移slot。





   

你可能感兴趣的:(redis cluster源码研究--reshard)