首页 文章

如果出现硬故障,如何在redis群集中恢复特定节点的哈希槽?

提问于
浏览
1

所以我正在测试redis集群 . 我有3个主人和3个奴隶的设置 . 现在,如果节点面临硬故障(主节点和从节点都关闭),则集群仍然可用,禁止故障节点提供服务的散列插槽 . 现在,在测试这样的场景时,我发现对这些哈希槽服务的密钥进行操作的读/写操作会因异常而失败,这很好(我似乎在 redis-trib 实用程序中存在) .

我无法重新设置群集以移动这些哈希插槽,因为 ./redis-trib.rb reshard 失败了 [ERR] Not all #{ClusterHashSlots} slots are covered by nodes. . 我也无法从集群中删除节点,因为 ./redis-trib.rb del-node[ERR] Node #{node} is not empty! Reshard data away and try again. 而失败 . 那么,最好的方法是处理我无法启动原始节点但希望这些散列槽由其他节点提供服务的场景(假设我在旧节点上丢失数据时甚至没问题)?理想情况下,可以删除该节点(集群中的主节点和从节点,并将这些散列插槽分配给其他节点) .

1 回答

  • 1

    它通过将故障节点所服务的所有插槽添加到某些可连接节点来修复集群 . 方法是使用cluster addslots命令,但当然手动操作很难,所以我建议我们的团队开发这个tool .

    用法(在shell中):

    # it requires Python2.7; install it via pip
    pip install redis-trib
    
    # suppose one of the accessible nodes is serving at 172.0.0.1:7000
    # start a cluster-mode Redis that is not involved in any cluster
    # suppose its address is 172.0.0.5:8000
    redis-trib.py rescue --existing-addr 172.0.0.1:7000 --new-addr 172.0.0.5:8000
    

    之后,新节点将为所有失败的插槽提供服务,以便集群状态变为正常 .

相关问题