CLUSTERDOWN The cluster is down in redis

Els*_*yed 6 caching redis

I am running 6 redis nodes ,3 masters and 3 slaves , every master has 1 slave .

Master[0] -> Slots 0 - 5460

Master[1] -> Slots 5461 - 10922

Master[2] -> Slots 10923 - 16383

Adding replica 172.17.0.5:6382 to 172.17.0.2:6379

Adding replica 172.17.0.6:6383 to 172.17.0.3:6380

Adding replica 172.17.0.7:6384 to 172.17.0.4:6381
Run Code Online (Sandbox Code Playgroud)

The clustering is running and I can SET and GET Keys.

I shutdown master1 172.17.0.2:6379 , slave1 (172.17.0.5:6382) has became master ,cluster is still running .

I shutdown slave1 (172.17.0.5:6382) , I tried to SET keys I have got this error

(error) CLUSTERDOWN The cluster is down

What I expected when I shutdown master1 and slave1 , cluster will still running and accepts redis operations but the opposite has happened.

What is the reason behind this ?

Is it applicable to solve this problem without starting master1 or slave1 again ?

for*_*ack 7

因为有些slot是存放在master1和slave1中的,如果两个slot都宕机了,这些slot就不会再被集群中的任何节点覆盖了。发生这种情况时,默认情况下,集群已关闭。您可以通过更改cluster-require-full-coverage选项来修改行为。

引自redis.conf

默认情况下,如果 Redis 集群节点检测到至少有一个哈希槽未被覆盖(没有可用的节点为其提供服务),它们将停止接受查询。这样,如果集群部分关闭(例如不再覆盖一定范围的哈希槽),所有集群最终都将变得不可用。一旦所有插槽再次被覆盖,它就会自动返回可用。

但是,有时您希望正在工作的集群子集继续接受对仍被覆盖的密钥空间部分的查询。为此,只需将 cluster-require-full-coverage 选项设置为 no。

cluster-require-full-coverage 是

更新

为了保证所有的slot都被覆盖,通常情况下,你可以建立一个有Nmaster和N + 1slave的集群。然后为每个主设备分配一个从设备,即N -> N。额外的从站可以从随机主站复制数据。当其中一个 master 宕机时,对应的 slave 将成为新的 master。然后你可以让额外的从站从新的主站复制数据。

总之,你必须确保每个master在任何时候都至少有一个slave。