假设我有一个带有节点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群集已关闭”。
但是,由于我将群集用作缓存,因此我并不关心节点是否出现故障。密钥可以重新分配到不同的节点并丢失其内容而不会影响我的应用程序。
有没有办法设置这样的自动重新分片?
答案 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-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的过程
检查群集并确保所有广告位都已移至新主广告
redis-trib.rb check 127.0.0.1:6379 (On any master)
无需手动操作。此外,如果群集中有更多的奴隶,他们也可以被提升为其他大师的新主人。 (例如,您设置了3个主站,3个从站.Master1关闭,Slave1变为新的主站.Slave1关闭,Slave1可以是Master1的新主站。)