经过一番折腾,我陷入了僵局。我正在尝试在单个 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 解决方案。好好利用它们!
在阅读了几个类似的主题后,我发现他们都没有解决这个问题。这是我尝试过的;
- 检查我的 EC2 安全组以确保在我的 redis t2.micro 和客户端 t2.micro 之间打开了正确的端口。确保 redis 端口+10,000(用于总线)也已打开。
- 检查了我的 AWS vpc、互联网网关、子网和 acl,以确保流量可以在两个实例之间流动
- 运行了一些 netstat,看起来我可以连接到正确的端口,并且 redis 正在侦听正确的端口
- 在每个节点的 redis.conf 文件中确保保护模式(设置为 no)、绑定(注释掉)和密码字段(注释掉)不会阻止通信。起初,这是问题的一部分。有一次,我将它们全部关闭,但最终仍然出现相同的错误。
- 我删除了所有旧的 aof、dump.rdb、node.conf 文件并启动了新实例。我确保每个节点都有自己的文件夹(不共享 node.conf 文件)。
- 我尝试使用环回 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。
- 一旦我让集群在 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