如何在硬故障的情况下恢复redis集群中特定节点的哈希槽?

How to resume hash slots of a particular node in redis cluster in case of hard failure?

所以我正在测试redis集群。我有一个包含 3 个主站和 3 个从站的设置。现在,如果一个节点面临硬故障(主从都宕机),集群仍然可以正常工作,除了故障节点提供的哈希槽。现在,在测试这种情况时,我看到 reads/writes 对这些哈希槽提供的键进行操作失败并出现异常,这很好(顺便说一句,我正在使用 jedis)。但是,如果我使用 redis 集群作为缓存,我希望这些哈希槽由其他节点提供服务。 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. 而失败。那么最好的方法是什么,来处理我无法启动我的原始节点但希望这些哈希槽由其他节点提供服务的场景(假设我什至可以在旧节点上丢失数据)?理想情况下,能够删除该节点(集群中的主节点和从节点并将这些哈希槽分配给其他节点)。

它通过将故障节点服务的所有槽添加到一些可连接的节点来修复集群。方法是使用我们团队开发的cluster addslots command, but of course it's somehow difficult to do it manually so I suggest this 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

之后,新节点将服务于所有失败的插槽,以便集群状态正常。