在redis群集中节点关闭时重新分配密钥

时间:2015-04-13 21:32:26

标签: redis

假设我有一个带有节点10.0.0.1,10.0.0.2,10.0.0.3和10.0.0.4的redis集群,我将其用作缓存。

然后,无论出于何种原因,节点10.0.0.4失败并关闭。这降低了整个集群:

2713:M 13 Apr 21:07:52.415 * FAIL message received from [id1] about [id2]
2713:M 13 Apr 21:07:52.415 # Cluster state changed: fail

这导致任何查询被关闭“CLUSTERDOWN群集已关闭”。

但是,由于我将群集用作缓存,因此我并不关心节点是否出现故障。密钥可以重新分配到不同的节点并丢失其内容而不会影响我的应用程序。

有没有办法设置这样的自动重新分片?

2 个答案:

答案 0 :(得分:1)

我找到了足够接近我需要的东西。

通过将cluster-require-full-coverage设置为" no",群集的其余部分将继续响应查询,但客户端需要处理重定向到故障节点的可能性。

然后我可以通过运行:

替换损坏的节点
redis-trib.rb call 10.0.0.1:6379 cluster forget [broken_node_id]
redis-trib.rb add-node 10.0.0.5:6379 10.0.0.1:6379
redis-trib.rb fix 10.0.0.1:6379

其中10.0.0.5:6379是将替换损坏的节点。

答案 1 :(得分:0)

假设您当前群集中只有主节点,那么肯定会出现群集关闭错误,因为没有down master的副本,Redis认为群集不安全并触发错误。

<强>解决方案

  • 创建一个新节点(使用所需参数创建redis.conf。)
  • 将该节点加入群集

    redis-trib.rb add-node 127.0.0.1:6379 EXISTING_MASTER_IP:EXISTING_MASTER_PORT

  • 使节点从属为10.0.0.4

    redis-cli -p 6379 cluster replicate NODE_ID_OF_TARGET_MASTER

测试

  • 首先要确保群集状态良好。(所有插槽均已覆盖,节点已就配置达成一致。)

    redis-trib.rb check 127.0.0.1:6379 (On any master)

  • 杀死10.0.0.4的过程

  • 等待Slave成为新的主人。(它很快就会发生。分配给10.0.0.4的插槽将自动重新分配给Slave。)
  • 检查群集并确保所有广告位都已移至新主广告

    redis-trib.rb check 127.0.0.1:6379 (On any master)

无需手动操作。此外,如果群集中有更多的奴隶,他们也可以被提升为其他大师的新主人。 (例如,您设置了3个主站,3个从站.Master1关闭,Slave1变为新的主站.Slave1关闭,Slave1可以是Master1的新主站。)