首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis集群故障

Redis集群故障
EN

Stack Overflow用户
提问于 2018-10-31 09:41:12
回答 1查看 2.1K关注 0票数 5

我们在我们的生产环境中广泛使用redis集群。我们目前有一个30个节点集群(15个主服务器,15个从节点),我们正试图增加集群,因为我们已经创建了新的服务器&将它们加入到集群中。到目前为止一切都很好。

下一个-我们正在努力重新分配给新主人的位置。我们使用redis-trib reshard命令编写了一个这样做的脚本。

但是,迁移在中途(但距离开始并不太远)失败,出现了以下错误:[ERR] Calling MIGRATE: ERR Target instance replied with error: BUSYKEY Target key name already exists.

这种情况时有发生,有时在失败之前移动一些插槽,有时在第一个插槽上失败。每一次这样的故障都需要手动修复操作,这使得reshard操作很难管理。

我们没有找到这方面的任何具体例子,也没有任何关于如何防止这种情况的想法,只有停机时的迁移。我们正在努力避免。

版本:

redis服务器4.0.2

redis 3.3.3 (在此问题之后降级为4.0.2:redis集群reshard [ ERR ]调用迁移:ERR语法错误)

我们的下一步是升级到最新的redis (4.0.11),尽管我们没有在这个问题的发行说明中找到任何迹象。

希望听到我们做错了什么,以及如何修复它,还是红色集群不是为实时重建而建的?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-11-01 12:45:17

在为我们自己的项目提供redis集群支持时,我遇到了类似的问题。我发现redis-trib reshard命令有问题。如果没有将密钥存储在从一个主机迁移到另一个主机的插槽中,则工作正常。

但是redis-5 (还在开发,还不稳定)有自己的“redis-cli”,我认为重发命令没有问题。只有较低版本的5发生这种情况。

如果您查看redis的官方文档,比如红系重构红系簇重分配,您会发现它们在内部对reshard做了什么。

因此,我通过运行bash脚本来解决这个问题,而不是运行redis-trib reshard命令。

假设您希望从主节点到其他主节点重新分配一些插槽。我们将调用具有当前哈希槽所有权的节点源节点,以及要迁移目标节点的节点。

对于每个插槽,请执行以下步骤:

请记住,根据redis官方文档,这些步骤的顺序在这里很重要。

  1. CLUSTER SETSLOT <slot> IMPORTING <source-node-id>发送到目标节点,将时隙设置为导入状态。
  2. CLUSTER SETSLOT <slot> MIGRATING <destination-node-id>发送到源节点,将时隙设置为迁移状态。
  3. 使用源节点命令获取密钥,并使用下面的迁移命令将它们移动到目标节点中。 MIGRATE target_host target_port key target_database_id timeout 在Redis集群中,不需要指定除0以外的数据库,但是迁移是一个通用命令,可以用于其他不涉及Redis集群的任务。
  4. 当迁移过程最终完成时,在源节点目标节点中都使用,以便将时隙再次设置为正常状态。通常向所有其他节点发送相同的命令,以避免等待新配置在集群中的自然传播。

这里还给出了一个简单的bash脚本示例:

来源-ip:172.17.0.5.来源-id:1f70a5107e0042a7d33a9efaf88dbdfecd78076a

目的地-ip:172.17.0.4.目的地-id:7e428bae84697a3882ecad19bd0d13ac7ee97d02

另一个主ip:172.17.0.7

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53080371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档