无法向 Redis 集群添加值 - 集群已关闭
Cannot add values to Redis cluster - The cluster is down
我有4个节点,3个是master,1个是slave。我试图通过 set foo bar
添加一个简单的字符串,但每当我这样做时,我都会收到此错误:
(error) CLUSTERDOWN The cluster is down
下面是我的集群信息
127.0.0.1:7000cluster info
cluster_state:fail
cluster_slots_assigned:11
cluster_slots_ok:11
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:4
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:3
cluster_stats_messages_sent:9262
cluster_stats_messages_received:9160
我正在使用 Redis-x64-3.0.503。请让我知道如何解决这个问题
集群节点:
87982f22cf8fb12c1247a74a2c26cdd1b84a3b88 192.168.2.32:7000 slave bc1c56ef4598fb4ef9d26c804c5fabd462415f71 1492000375488 1492000374508 3 connected
9527ba919a8dcfaeb33d25ef805e0f679276dc8d 192.168.2.35:7000 master - 1492000375488 1492000374508 2 connected 16380
ff999fd6cbe0e843d1a49f7bbac1cb759c3a2d47 192.168.2.33:7000 master - 1492000375488 1492000374508 0 connected 16381
bc1c56ef4598fb4ef9d26c804c5fabd462415f71 127.0.0.1:7000 myself,master - 0 0 3 connected 1-8 16383
只分配了 11 个插槽,因此您的集群已关闭,就像消息告诉您的那样。这些插槽是 192.168.2.35:7000
处的 16380
、192.168.2.33:7000
处的 16381
和 127.0.0.1:7000
处的 1-8 16383
。
当然直接原因是你需要将所有16384个slot(0-16383
)分配给集群,但我认为是配置错误导致的
您有一个本地主机地址为 127.0.0.1:7000
的节点。但是,192.168.2.33:7000
也是一个 127.0.0.1:7000
,而 192.168.2.35:7000
也是一个 127.0.0.1:7000
。这个本地主机地址问题使得一个节点无法将自己与另一个节点区分开来,我认为这会导致混乱。
我建议您通过cluster reset
命令重置所有节点并重新创建集群,并确保这次您使用的是它们的192.168.*.*
地址。
只是加起来并简化@neuront 所说的内容。
Redis 将数据存储在哈希槽中。要理解这一点,您需要了解 Hasmaps 或 Hashtables 的工作原理。在这里供我们参考,redis 有一个常量 16384 个插槽来分配和分配给所有主服务器。
现在,如果我们查看您发布的节点配置并使用 redis documentation 引用它,您会看到结束编号表示分配给主节点的插槽。
你的情况是这样的
... slave ... connected
... master ... connected 16380
... master ... connected 16381
... master ... connected 1-8 16380
所以所有的机器都连接起来形成集群,但并不是所有的哈希槽都被分配来存储信息。应该是这样的
... slave ... connected
... master ... connected 1-5461
... master ... connected 5462-10922
... master ... connected 10923-16384
你看,现在我们正在分配所有哈希槽的范围,就像文档中说的那样
slot:
A hash slot number or range. Starting from argument number 9, but there may be up to 16384 entries in total (limit never reached). This is the list of hash slots served by this node. If the entry is just a number, is parsed as such. If it is a range, it is in the form start-end, and means that the node is responsible for all the hash slots from start to end including the start and end values.
对于您的具体情况,当您使用键 foo 存储一些数据时,它一定已分配给未在集群中注册的其他槽。
由于您在 Windows,因此您必须手动设置分发。为此你必须做这样的事情(这是在Linux,翻译成windows命令)
for slot in {0..5400}; do redis-cli -h master1 -p 6379 CLUSTER ADDSLOTS $slot; done;
取自此 article
希望对您有所帮助。
@user1829319 这是添加插槽的 windows 等价物:
for /l %s in (0, 1, 8191) do redis-cli -h 127.0.0.1 -p 6379 CLUSTER ADDSLOTS %s
for /l %s in (8192, 1, 16383) do redis-cli -h 127.0.0.1 -p 6380 CLUSTER ADDSLOTS %s
您应该通过刷新所有和重置集群来重新创建您的集群,并在下一个集群设置中确保您验证所有插槽是否已分配给主节点或未使用 > 集群插槽
我有4个节点,3个是master,1个是slave。我试图通过 set foo bar
添加一个简单的字符串,但每当我这样做时,我都会收到此错误:
(error) CLUSTERDOWN The cluster is down
下面是我的集群信息
127.0.0.1:7000cluster info
cluster_state:fail
cluster_slots_assigned:11
cluster_slots_ok:11
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:4
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:3
cluster_stats_messages_sent:9262
cluster_stats_messages_received:9160
我正在使用 Redis-x64-3.0.503。请让我知道如何解决这个问题
集群节点:
87982f22cf8fb12c1247a74a2c26cdd1b84a3b88 192.168.2.32:7000 slave bc1c56ef4598fb4ef9d26c804c5fabd462415f71 1492000375488 1492000374508 3 connected
9527ba919a8dcfaeb33d25ef805e0f679276dc8d 192.168.2.35:7000 master - 1492000375488 1492000374508 2 connected 16380
ff999fd6cbe0e843d1a49f7bbac1cb759c3a2d47 192.168.2.33:7000 master - 1492000375488 1492000374508 0 connected 16381
bc1c56ef4598fb4ef9d26c804c5fabd462415f71 127.0.0.1:7000 myself,master - 0 0 3 connected 1-8 16383
只分配了 11 个插槽,因此您的集群已关闭,就像消息告诉您的那样。这些插槽是 192.168.2.35:7000
处的 16380
、192.168.2.33:7000
处的 16381
和 127.0.0.1:7000
处的 1-8 16383
。
当然直接原因是你需要将所有16384个slot(0-16383
)分配给集群,但我认为是配置错误导致的
您有一个本地主机地址为 127.0.0.1:7000
的节点。但是,192.168.2.33:7000
也是一个 127.0.0.1:7000
,而 192.168.2.35:7000
也是一个 127.0.0.1:7000
。这个本地主机地址问题使得一个节点无法将自己与另一个节点区分开来,我认为这会导致混乱。
我建议您通过cluster reset
命令重置所有节点并重新创建集群,并确保这次您使用的是它们的192.168.*.*
地址。
只是加起来并简化@neuront 所说的内容。
Redis 将数据存储在哈希槽中。要理解这一点,您需要了解 Hasmaps 或 Hashtables 的工作原理。在这里供我们参考,redis 有一个常量 16384 个插槽来分配和分配给所有主服务器。
现在,如果我们查看您发布的节点配置并使用 redis documentation 引用它,您会看到结束编号表示分配给主节点的插槽。
你的情况是这样的
... slave ... connected
... master ... connected 16380
... master ... connected 16381
... master ... connected 1-8 16380
所以所有的机器都连接起来形成集群,但并不是所有的哈希槽都被分配来存储信息。应该是这样的
... slave ... connected
... master ... connected 1-5461
... master ... connected 5462-10922
... master ... connected 10923-16384
你看,现在我们正在分配所有哈希槽的范围,就像文档中说的那样
slot:
A hash slot number or range. Starting from argument number 9, but there may be up to 16384 entries in total (limit never reached). This is the list of hash slots served by this node. If the entry is just a number, is parsed as such. If it is a range, it is in the form start-end, and means that the node is responsible for all the hash slots from start to end including the start and end values.
对于您的具体情况,当您使用键 foo 存储一些数据时,它一定已分配给未在集群中注册的其他槽。
由于您在 Windows,因此您必须手动设置分发。为此你必须做这样的事情(这是在Linux,翻译成windows命令)
for slot in {0..5400}; do redis-cli -h master1 -p 6379 CLUSTER ADDSLOTS $slot; done;
取自此 article
希望对您有所帮助。
@user1829319 这是添加插槽的 windows 等价物:
for /l %s in (0, 1, 8191) do redis-cli -h 127.0.0.1 -p 6379 CLUSTER ADDSLOTS %s
for /l %s in (8192, 1, 16383) do redis-cli -h 127.0.0.1 -p 6380 CLUSTER ADDSLOTS %s
您应该通过刷新所有和重置集群来重新创建您的集群,并在下一个集群设置中确保您验证所有插槽是否已分配给主节点或未使用 > 集群插槽