【问题标题】:Deleting master node from existing Redis Cluster从现有 Redis 集群中删除主节点
【发布时间】:2018-10-03 11:47:17
【问题描述】:

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

【问题讨论】:

  • 要删除一个主节点,它必须是空的,所以你必须将数据槽移动到其他节点。是这样吗?
  • Rabee AbdelWahab - 由于我是 Redis 新手,将数据槽移动到其他节点意味着重新分片?无论如何,当我尝试删除节点时,它会给我一个错误,即任一节点连接到另一个节点或在数据库 0 中有一些键。

标签: redis


【解决方案1】:

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

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

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

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

对于每个插槽:

  1. 发送CLUSTER SETSLOT <slot> IMPORTING <source-node-id>目标节点,将slot设置为importing状态。
  2. 源节点发送CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>,将slot设置为正在迁移状态。
  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 脚本:

源IP:172.17.0.5。源ID:1f70a5107e0042a7d33a9efaf88dbdfecd78076a

目标 IP:172.17.0.4。目的地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

【讨论】:

    【解决方案2】:

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

    按照以下步骤进行迁移:

    1. 连接到目标节点:

    2. 集群setslot(插槽号)导入(源节点ID)

    连接到源节点:

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

    2. migrate (destination ip) (destination port) key (destination db) (timeout)

    连接到目标节点:

    1. 集群setslot(槽号)节点(目的节点)

    我们可以对所有的槽和键循环执行上述操作,然后删除源节点。

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 2018-07-19
      • 2019-03-05
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      相关资源
      最近更新 更多