4

我有 4 个节点,3 个是主节点,其中 1 个是从节点。我正在尝试通过添加一个简单的字符串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
4

4 回答 4

6

只是为了加起来并简化@neuront 所说的内容。

Redis 将数据存储在哈希槽中。要理解这一点,您需要了解 Hasmap 或 Hashtable 的工作原理。作为我们的参考,redis 有一个常量 16384 个插槽,用于分配和分发给所有主服务器。

现在,如果我们查看您发布的节点配置并使用redis 文档进行参考,您会看到结尾编号表示分配给主节点的插槽。

在你的情况下,这就是它的样子

... 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:哈希槽编号或范围。从参数号 9 开始,但总共可能有多达 16384 个条目(从未达到限制)。这是此节点服务的哈希槽列表。如果条目只是一个数字,则按此方式解析。如果是范围,则形式为 start-end,表示该节点负责从 start 到 end 的所有 hash slot,包括 start 和 end 值。

特别是在您的情况下,当您使用键foo存储一些数据时,它必须已分配给未在集群中注册的其他插槽。

由于您在 Windows 中,因此您必须手动设置分发。为此,您必须做这样的事情(这是在 Linux 中,转换为 windows 命令)

for slot in {0..5400}; do redis-cli -h master1 -p 6379 CLUSTER ADDSLOTS $slot; done;

取自这篇文章

希望它有所帮助。

于 2017-04-13T05:21:25.400 回答
3

仅分配了 11 个插槽,因此您的集群已关闭,就像消息告诉您的那样。插槽16380位于192.168.2.35:700016381at192.168.2.33:70001-8 16383at 127.0.0.1:7000

当然,直接原因是您需要将所有 16384 个插槽(0-16383)分配给集群,但我认为这是由配置错误引起的。

您有一个具有 localhost 地址的节点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.*.*这次使用它们的地址。

于 2017-04-13T01:51:51.310 回答
1

@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
于 2018-03-19T11:19:17.197 回答
0

您应该通过执行全部刷新和集群重置来重新创建集群,并在下一个集群设置中确保您验证所有插槽已分配给主服务器或未使用 > 集群插槽

于 2020-08-13T03:49:31.377 回答