从现有Redis群集中删除主节点

时间:2015-11-10 13:07:41

标签: redis

我想从现有的Redis群集中删除主节点。我尝试按照http://redis.io/topics/cluster-tutorial的说明操作,但无法关注。帮助??

2 个答案:

答案 0 :(得分:0)

根据先前的答案,要删除主节点,该节点必须为空。这意味着我们必须flushall数据或将哈希槽迁移到另一个现有的母版。

但是正如redis reconfigurationredis cluster resharding所说,在上一个答案的第5步之后可能需要添加其他步骤。

根据redis官方文档,适用于我的解决方案如下。这里的顺序很重要。

我们将拥有哈希槽当前所有权的节点称为源节点,并将要迁移目的地节点的节点称为。 >

对于每个插槽:

  1. 发送CLUSTER SETSLOT <slot> IMPORTING <source-node-id>目的地节点,将广告位设置为导入状态。
  2. 发送CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>源节点以将广告位设置为正在迁移状态。
  3. 使用CLUSTER GETKEYSINSLOT命令从源节点获取密钥,然后使用以下MIGRATE命令将其移至目标节点

    MIGRATE target_host target_port key target_database_id timeout

    在Redis Cluster中,无需指定0以外的数据库,但是MIGRATE是通用命令,可用于不涉及Redis Cluster的其他任务。

  4. 迁移过程最终完成后,在源节点目标节点中都使用CLUSTER SETSLOT <slot> NODE <destination-node-id>,以便将插槽再次设置为正常状态。通常会将同一命令发送给所有其他节点,以避免等待新配置在集群中自然传播。

这里也提供了一个简单的bash脚本示例:

source-ip:172.17.0.5。来源ID:1f70a5107e0042a7d33a9efaf88dbdfecd78076a

destination-ip:172.17.0.4。 destination-id:7e428bae84697a3882ecad19bd0d13ac7ee97d02

另一个主IP:172.17.0.7

for i in `seq 0 5460`; do
    redis-cli -c -h 172.17.0.4 cluster setslot ${i} importing 1f70a5107e0042a7d33a9efaf88dbdfecd78076a
    redis-cli -c -h 172.17.0.5 cluster setslot ${i} migrating 7e428bae84697a3882ecad19bd0d13ac7ee97d02
    while true; do
        key=`redis-cli -c -h 172.17.0.5 cluster getkeysinslot ${i} 1`
        if [ "" = "$key" ]; then
            echo "there are no key in this slot ${i}"
            break
        fi
        redis-cli -h 172.17.0.5 migrate 172.17.0.4 6379 ${key} 0 5000
    done
    redis-cli -c -h 172.17.0.5 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
    redis-cli -c -h 172.17.0.4 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
    redis-cli -c -h 172.17.0.7 cluster setslot ${i} node 7e428bae84697a3882ecad19bd0d13ac7ee97d02
done

答案 1 :(得分:-1)

节点在删除之前应为空。因此,我们需要在删除节点之前移动数据和插槽。

按照以下步骤进行迁移:

  1. 连接目标节点:

  2. 群集public function onOpen(ConnectionInterface $conn) { // ... $this->players->append(new Player($conn, x, y)); } (插槽号)导入(源节点ID)

  3. 连接到源节点:

    1. 群集setslot(插槽号)迁移(目标节点ID)

    2. 迁移(目标IP)(目标端口)密钥(目标数据库)(超时)

    3. 连接目标节点:

      1. cluster setslot(slot no)节点(dest节点)
      2. 我们可以在循环中为所有插槽和键执行上述操作,然后删除源节点。