如何解决redis集群“等待集群加入”的问题?

我有 3 台机器并为 redis 集群创建了 6 个节点,几个月前我已经成功创建它,但现在它掉线了,我尽力修复它,但它不起作用,所以我清理所有数据并从零重新创建它,当我使用以下命令创建集群时,它在这里阻塞,并等待节点加入集群,我对其进行了一些研究,我清理了我的数据,一次又一次地记录,一次又一次地做,但它仍然不起作用。

redis-trib.rb create --replicas 1 10.2.1.208:6379 10.2.1.208:6380 10.2.1.209:6379 10.2.1.209:6380 10.2.1.15:6379 10.2.1.15:6380

show the result

redis-trib.rb create --replicas 1 10.2.1.208:6379 10.2.1.208:6380 10.2.1.209:6379 10.2.1.209:6380 10.2.1.15:6379 10.2.1.15:6380
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.2.1.208:6379
10.2.1.209:6379
10.2.1.15:6379
Adding replica 10.2.1.209:6380 to 10.2.1.208:6379
Adding replica 10.2.1.208:6380 to 10.2.1.209:6379
Adding replica 10.2.1.15:6380 to 10.2.1.15:6379
M: 73b3b99bb17de63aa99eaf592376f0a06feb3d66 10.2.1.208:6379
   slots:0-5460 (5461 slots) master
S: 05b33ed6691797faaf7ccec1541396472b9d2866 10.2.1.208:6380
   replicates f14702ebb1462b313dd7eb4809ec50e30e4eef36
M: f14702ebb1462b313dd7eb4809ec50e30e4eef36 10.2.1.209:6379
   slots:5461-10922 (5462 slots) master
S: 3a9f433a8503281b0ddfc6ec69016908735053b8 10.2.1.209:6380
   replicates 73b3b99bb17de63aa99eaf592376f0a06feb3d66
M: 2fd97e8842828dba6b425b6a30e764fb06915737 10.2.1.15:6379
   slots:10923-16383 (5461 slots) master
S: c46db592d49bc1e9d8b5efb27b9799929c5186a4 10.2.1.15:6380
   replicates 2fd97e8842828dba6b425b6a30e764fb06915737
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...........................................................................^C/usr/local/bin/redis-trib.rb:652:in `sleep': Interrupt
        from /usr/local/bin/redis-trib.rb:652:in `wait_cluster_join'
        from /usr/local/bin/redis-trib.rb:1305:in `create_cluster_cmd'
        from /usr/local/bin/redis-trib.rb:1695:in `<main>'
stack overflow How to solve redis cluster "Waiting for the cluster to join" issue?
原文答案

答案:

作者头像

来自 the cluster tutorial on the official Redis website

每个 Redis 集群节点都需要打开两个 TCP 连接。服务客户端的普通Redis TCP端口,比如6379,加上数据端口加上10000得到的端口,例子中是16379。

第二个 high 端口用于集群总线,即使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等。客户端不应该尝试与集群总线端口通信,而始终使用正常的 Redis 命令端口,但请确保在防火墙中打开这两个端口,否则 Redis 集群节点将无法通信。

命令端口和集群总线端口偏移量是固定的,始终为 10000。

我使用了 AWS,但没有打开导致此问题的端口 16379 和 16380。

作者头像

如果这 6 个节点之间没有防火墙问题,您可以检查 bind 中的 redis.conf 设置。

当然,你应该在局域网 IP 上绑定 redis 服务,但还有一件事:

删除 127.0.0.1 或将 127.0.0.1 移到 LAN IP 后的末尾!

就像这样: bind 10.2.1.x 127.0.0.1bind 10.2.1.x

当我在 3 个服务器上的 3 个节点之间创建一个集群时,我遇到了这个问题, waiting for cluster to join 永远。当您将 127.0.0.1 放在 LAN IP 的前面时,这可能是 redis 中的一个错误,至少在 Redis 5.0 中。

作者头像

这些答案都不适合我,但我发现以下博客有所帮助:

https://linux.m2osw.com/redis-infamous-waiting-cluster-join-message

问题是因为我创建了一台原始服务器并将其克隆为生成其他两个节点。克隆的节点使用相同的节点ID,而Redis不喜欢那样。

解决方案是停止redis服务器,然后删除nodes.conf文件,该文件在redis.conf文件中为其定义了实际名称。我的实际上称为Nodes-6379.conf。然后重新启动Redis服务器。在所有节点上执行此操作。

作者头像

如果您使用 127.0.0.1 作为主机名而不是使用 IP 地址,您也可能会看到此问题。在这种情况下,您需要将其更改为使用 IP 地址作为主机名。 https://stackoverflow.com/a/36080707/5159284

作者头像

这可能是因为使用预装的Redis复制VM/容器。安装REDIS时,它会创建具有预先创建的ID的配置,并出现相同的配置:

# cat /etc/redis/redis.conf
...
cluster-config-file nodes-6379.conf
...

您可以检查并删除如果是这样:

# rm /var/lib/redis/nodes-6379.conf

然后重新启动Redis。这些路径适用于Ubuntu。链接到有助于我 https://linux.m2osw.com/redis-infamous-waiting-cluster-join-message 的帖子。

作者头像

cluster-announce-ip 中的 redis.config 设置为与 bind 相同的值。

我在这里尝试了所有可能的建议,但这最终在我的 kubernetes / docker 设置中对我有用。

事实上,在 redis.conf 部分我发现:

########################## CLUSTER DOCKER/NAT support  ########################

> # In certain deployments, Redis Cluster nodes address discovery fails, because
> # addresses are NAT-ted or because ports are forwarded (the typical case is
> # Docker and other containers).
> #
> # In order to make Redis Cluster working in such environments, a static
> # configuration where each node knows its public address is needed. The
> # following four options are used for this scope, and are:
> #
> # * cluster-announce-ip ...