1

经过一番折腾,我陷入了僵局。我正在尝试在单个 t2.micro 上设置一个由 3 个主节点和 3 个从属节点组成的 redis 集群。我在本地主机上的设置效果很好,但是当我尝试在 EC2 上运行它时,我遇到了一个奇怪的问题,我的客户端(在使用 ioredis 的单独 t2.micro 上)似乎可以找到并连接,但随后会反复抛出许多错误,例如“ioredis :连接错误:错误:连接 ECONNREFUSED”如果我的客户端位于 http 中。如果我切换到 https,我会收到其他不同的超时错误和“手动关闭”错误(尝试在集群选项中设置 TLS 标志无济于事)。


TL;博士

想法??为什么我无法使用 redis-trib 创建具有 publicIP(而不是 127.0.0.1)的集群?这似乎可以解决我的问题,或者我在这里缺少一些明显的东西,比如防火墙?...

如果您正在阅读本文并在使用 redis 时遇到困难,那么下面的要点列表可以很好地总结 google 和 stackoverflow 的首页上几乎所有提出的 redis 解决方案。好好利用它们!

在阅读了几个类似的主题后,我发现他们都没有解决这个问题。这是我尝试过的;

  1. 检查我的 EC2 安全组以确保在我的 redis t2.micro 和客户端 t2.micro 之间打开了正确的端口。确保 redis 端口+10,000(用于总线)也已打开。
  2. 检查了我的 AWS vpc、互联网网关、子网和 acl,以确保流量可以在两个实例之间流动
  3. 运行了一些 netstat,看起来我可以连接到正确的端口,并且 redis 正在侦听正确的端口
  4. 在每个节点的 redis.conf 文件中确保保护模式(设置为 no)、绑定(注释掉)和密码字段(注释掉)不会阻止通信。起初,这是问题的一部分。有一次,我将它们全部关闭,但最终仍然出现相同的错误。
  5. 我删除了所有旧的 aof、dump.rdb、node.conf 文件并启动了新实例。我确保每个节点都有自己的文件夹(不共享 node.conf 文件)。
  6. 我尝试使用环回 127.0.0.1 连接 redis 集群,如下所示:

./redis-trib.rb 创建 --replicas 1 127.0.0.1:30010 127.0.0.1:30011 127.0.0.1:30012 127.0.0.1:30013 127.0.0.1:30014 127.0.0.1:30015

并且仍然有来自客户的错误。于是又试了redis t2.micro的aws公网主机地址,然后公网IP,再私网IP。当我启动节点(使用 ps -ef 确保它们以守护程序模式运行)然后尝试使用公共 IP 的 ./redis-trib create --replicas 1 publicIP:30010 ..etc 时,它看起来会创建集群但随后挂在“>>>创建集群”,直到它失败并说它无法连接到第一个节点。它不会让我使用 publicIP 而不是 127.0.0.1 创建集群(我怀疑这是我的客户端无法连接的问题)。似乎其他人已经成功连接它,但在这种情况下没有(我也尝试从我的客户端运行 redis-trib,它会连接并在 redis t2 上生成 aof 和 node.conf。

  1. 一旦我让集群在 127.0.0.1 下启动并运行,节点就会进行通信,redis-cli 会将 PONG 返回给我的 ping,但要设置一个密钥,它会给出“(错误)MOVED 16164 127.0.0.1:30012”,对于 '得到'。所以我尝试通过发送“集群会议”来手动设置公共IP,如下例所示:redis-cli redirected to 127.0.0.1

还是不行。当我设置满足时,一些 127.0.0.1 仍然存在,或者我用 publicIP 设置的那些似乎在我完成所有节点的运行时切换回来。

唯一需要考虑的是 AWS 是否在某处阻塞了端口。我尝试打开两个 t2.micro 实例的所有端口,并向任何人开放它们,但它仍然无法正常工作。我考虑过在 EC2 实例上查看 iptables,但鉴于存在安全组(而且我没有过多地使用 iptables),因此不应设置它们。我以为这需要我一个小时,但现在我仍然坐在这里摸不着头脑。

一些可能有用的代码:

集群代码:

export var cluster = new Redis.Cluster([{
  port: 30010,
  host: '52.36.xxx.xxx'
}, {
  port: 30011,
  host: '52.36.xxx.xxx'
},{
  port: 30012,
  host: '52.36.xxx.xxx'
}]);

30010 节点.conf

337e0c0152cc88590d73048a6f97120934d94da8 127.0.0.1:30010 myself,master - 0 0 1 connected 0-5460
8f7cf7a0016c372ebaaffd76b903e26e47f2a513 127.0.0.1:30014 slave 882fed6d144b6dea1531691deb323a3ae0b52936 0 1471601371978 5 connected
2c36b871bbdb6f8b98a2562ff315bf79ca524ec5 127.0.0.1:30013 slave 337e0c0152cc88590d73048a6f97120934d94da8 1471601372982 1471601368969 4 connected
265b166b7231a7c0a8017f4f7fad90261d59fb96 127.0.0.1:30015 slave 42e5b9b8ab9e1d2eefe1832e118085b4e44ae65d 0 1471601367966 6 connected
882fed6d144b6dea1531691deb323a3ae0b52936 127.0.0.1:30011 master - 0 1471601369972 2 connected 5461-10922
42e5b9b8ab9e1d2eefe1832e118085b4e44ae65d 127.0.0.1:30012 master - 0 1471601370977 3 connected 10923-16383
vars currentEpoch 6 lastVoteEpoch 0





127.0.0.1:30010> cluster nodes
337e0c0152cc88590d73048a6f97120934d94da8 127.0.0.1:30010 myself,master - 0 0 1 connected 0-5460
8f7cf7a0016c372ebaaffd76b903e26e47f2a513 127.0.0.1:30014 slave 882fed6d144b6dea1531691deb323a3ae0b52936 0 1471601610630 5 connected
2c36b871bbdb6f8b98a2562ff315bf79ca524ec5 127.0.0.1:30013 slave 337e0c0152cc88590d73048a6f97120934d94da8 0 1471601611632 4 connected
265b166b7231a7c0a8017f4f7fad90261d59fb96 127.0.0.1:30015 slave 42e5b9b8ab9e1d2eefe1832e118085b4e44ae65d 0 1471601609627 6 connected
882fed6d144b6dea1531691deb323a3ae0b52936 127.0.0.1:30011 master - 0 1471601612634 2 connected 5461-10922
42e5b9b8ab9e1d2eefe1832e118085b4e44ae65d 127.0.0.1:30012 master - 0 1471601607622 3 connected 10923-16383

客户端错误:sudo DEBUG=ioredis:* node app.js

ioredis:redis status[127.0.0.1:30010]: close -> end +1ms
  ioredis:redis status[127.0.0.1:30012]: wait -> connecting +0ms
  ioredis:connection error: Error: connect ECONNREFUSED 127.0.0.1:30012 +0ms
  ioredis:redis status[127.0.0.1:30012]: connecting -> close +0ms
  ioredis:connection skip reconnecting because `retryStrategy` is not a function +0ms
  ioredis:redis status[127.0.0.1:30012]: close -> end +0ms
  ioredis:cluster status: connect -> close +0ms
  ioredis:cluster status: close -> reconnecting +0ms
  ioredis:delayqueue send 1 commands in failover queue +94ms
REDIS222 CONNECT error Error: Failed to refresh slots cache.
node error Error: timeout
    at Object.exports.timeout (/home/ubuntu/main2/node_modules/ioredis/lib/utils/index.js:153:36)
    at Cluster.getInfoFromNode (/home/ubuntu/main2/node_modules/ioredis/lib/cluster/index.js:552:32)
    at tryNode (/home/ubuntu/main2/node_modules/ioredis/lib/cluster/index.js:347:11)
    at Cluster.refreshSlotsCache (/home/ubuntu/main2/node_modules/ioredis/lib/cluster/index.js:362:3)

SSH 到 redis t2.micro 和 netstat。似乎正在侦听正确的端口(30010-30015

    ubuntu@ip-xxx-xx-xx-xxx:~$ sudo netstat -ntlp | grep LISTEN
tcp        0      0 0.0.0.0:40013           0.0.0.0:*               LISTEN      1328/redis-server *
tcp        0      0 0.0.0.0:40014           0.0.0.0:*               LISTEN      1334/redis-server *
tcp        0      0 0.0.0.0:40015           0.0.0.0:*               LISTEN      1336/redis-server *       
tcp        0      0 0.0.0.0:30010           0.0.0.0:*               LISTEN      1318/redis-server *
tcp        0      0 0.0.0.0:30011           0.0.0.0:*               LISTEN      1322/redis-server *
tcp        0      0 0.0.0.0:30012           0.0.0.0:*               LISTEN      1324/redis-server *
tcp        0      0 0.0.0.0:30013           0.0.0.0:*               LISTEN      1328/redis-server *
tcp        0      0 0.0.0.0:30014           0.0.0.0:*               LISTEN      1334/redis-server *
tcp        0      0 0.0.0.0:30015           0.0.0.0:*               LISTEN      1336/redis-server *
tcp        0      0 0.0.0.0:40010           0.0.0.0:*               LISTEN      1318/redis-server *
tcp        0      0 0.0.0.0:40011           0.0.0.0:*               LISTEN
1322/redis-server *
tcp        0      0 0.0.0.0:40012           0.0.0.0:*               LISTEN      

SSH 到客户端 t2.micro 并从 redis 远程服务器远程调用集群节点,它返回正确的环回设置:

ubuntu@ip-xxx-xx-xx-x:~/redis-3.2.2/src$ ./redis-cli -h 52.36.237.185 -p 30010 cluster nodes
337e0c0152cc88590d73048a6f97120934d94da8 127.0.0.1:30010 myself,master - 0 0 1 connected 0-5460
8f7cf7a0016c372ebaaffd76b903e26e47f2a513 127.0.0.1:30014 slave 882fed6d144b6dea1531691deb323a3ae0b52936 0 1471629274223 5 connected
2c36b871bbdb6f8b98a2562ff315bf79ca524ec5 127.0.0.1:30013 slave 337e0c0152cc88590d73048a6f97120934d94da8 0 1471629275225 4 connected
265b166b7231a7c0a8017f4f7fad90261d59fb96 127.0.0.1:30015 slave 42e5b9b8ab9e1d2eefe1832e118085b4e44ae65d 0 1471629272217 6 connected
882fed6d144b6dea1531691deb323a3ae0b52936 127.0.0.1:30011 master - 0 1471629276228 2 connected 5461-10922
42e5b9b8ab9e1d2eefe1832e118085b4e44ae65d 127.0.0.1:30012 master - 0 1471629277231 3 connected 10923-16383

-------------------------------------------------- -----

想法??为什么我无法使用 redis-trib 创建具有 publicIP(而不是 127.0.0.1)的集群?这似乎可以解决我的问题,或者我在这里缺少一些明显的东西,比如防火墙......

................................ 更新

我在 redis 服务器上本地运行了 redis-trib.rb check,它显示一切都很好:

ubuntu@ip-172-xx-xx-xxx:~/redis-3.2.2/src$ ./redis-trib.rb check 127.0.0.1:30010 
>>> Performing Cluster Check (using node 127.0.0.1:30010)

...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

但是,当我使用 redis publicIP 从我的客户端在不同的实例上运行它时,我得到:

ubuntu@ip-172-xx-xx-x:~/redis-3.2.2/src$ ./redis-trib.rb check redispublicIP:30010
[ERR] Sorry, can't connect to node 127.0.0.1:30014
[ERR] Sorry, can't connect to node 127.0.0.1:30013
[ERR] Sorry, can't connect to node 127.0.0.1:30015
[ERR] Sorry, can't connect to node 127.0.0.1:30011
[ERR] Sorry, can't connect to node 127.0.0.1:30012
>>> Performing Cluster Check (using node redispublicIP:30010)
M: 337e0c0152cc88590d73048a6f97120934d94da8 redispublicIP:30010
   slots:0-5460 (5461 slots) master
   0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.

所以看起来我需要切换 127.0.0.1。如果我使用 publicIP:port,它允许我从客户端连接到单个节点,但是当它尝试查找其他节点时,它必须认为它们是本地节点

更新 2:似乎这是我的问题,但我已经仔细检查了 6 个 redis.conf 文件中的任何一个都没有设置密码: 使用 redis-trib.rb 创建集群时出现连接错误?

Update3:这篇文章非常接近,但我不明白他的解决方案:src/redis-trib.rb create 127.0.0.1:6379 127.0.0.1:6380 h2:p1 h2:p2 h3:p1 h3:p2

具体为什么他在 h2:p1 h2:p2 h3:p1 h3:p2 之后声明主机和端口


更新4:

看来这可能是 AWS t2.micro 实例的问题。我已向 AWS Support 发送请求: https ://forums.aws.amazon.com/thread.jspa?messageID=647509


已解决:它在客户端和 redis-trib create 命令中都使用了私有 IP 地址。我曾在客户端配置中尝试过私有 IP,但错误地认为我已经尝试过使用它的 redis-trib。

对于其他人:课程:使用 redis EC2 实例的私有 IP。感谢这个视频帮助我了解:https: //www.youtube.com/watch?v=s4YpCA2Y_ -Q

4

1 回答 1

0

已解决:它在客户端和解决问题的 redis-trib create 命令中都使用了私有 IP 地址。我曾在客户端配置中尝试过私有 IP,但错误地认为我已经尝试过使用它的 redis-trib。

对于其他人=> 课程:使用 redis-trib 加入集群时,使用 redis EC2 实例的私有 IP 而不是公共 IP。感谢这个视频帮助我了解:https: //www.youtube.com/watch?v=s4YpCA2Y_ -Q

于 2016-08-20T02:07:34.297 回答