事与愿违,我陷入僵局。我正试图在一个t2.micro上设置一个由3个主节点和3个从节点组成的redis集群。我在本地主机上的设置工作得很好,但当我尝试在EC2上运行它时,我遇到了一个奇怪的问题,我的客户端(在一个单独的t2.micron上使用ioredis)似乎可以找到并连接,但如果我有客户端,就会重复抛出许多错误,比如"ioredis:connection error:connect ECONNREFUSED"在http。如果我切换到https,我会得到其他不同的超时错误和"手动关闭"错误(尝试在集群选项中设置TLS标志无效)。
TL;博士
想法??为什么我不能使用redis-trib创建带有publicIP(而不是127.0.0.1)的集群?这似乎可以解决我的问题,或者我在这里是否缺少了一些明显的东西,比如防火墙
如果你正在阅读这篇文章并与redis作斗争,下面的要点列表可以很好地总结谷歌和stackoverflow首页上几乎所有提出的redis解决方案。好好使用它们!
在阅读了几个类似的主题后,我发现它们都没有解决这个问题。以下是我尝试过的;
- 检查了我的EC2安全组,以确保在我的redis t2.micro和客户端t2.micro.之间打开了正确的端口。确保redis端口+10000(用于总线)也打开
- 检查了我的AWS vpc、互联网网关、子网和acl,以确保流量可以在两个实例之间流动
- 运行了一些netstat,看起来我可以连接到正确的端口,并且redis正在侦听正确的端口
- 在每个节点的redis.conf文件中确保受保护模式(设置为no)、绑定(注释掉)和密码字段(注释掉了)不会阻止通信。起初,这是问题的一部分。有一次,我把所有的都关掉了,结果还是犯了同样的错误
- 我删除了所有旧的aof、dump.rdb、node.conf文件,并启动了新的实例。我确保每个节点都有自己的文件夹(不共享node.conf文件)
- 我尝试使用环回127.0.0.1连接redis集群,如下所示:
/redis-trib.rb创建--复制品1 127.0.0.1:30010 127.0.0.1:300011 127.0.0.1:30012 127.0.0.1:3013 127.0.0.1:00014 127.0.0.1:310015
并且仍然存在来自客户端的错误。于是尝试了redis t2.micro的aws公共主机地址,然后是公共IP,然后是私有IP。当我启动节点(使用ps-ef确保它们在守护进程模式下运行),然后尝试/redis-trib create--副本1 publicIP:30010。。等使用公共IP时,它看起来会创建集群,但随后会挂起">>>创建集群",直到它失败并表示无法连接到第一个节点。它不允许我使用publicIP而不是127.0.0.1创建集群(我怀疑这是我的客户端无法连接的问题)。其他人似乎已经成功地连接了它,但在这种情况下没有(我也试图从我的客户端运行redis-trib,它会连接并生成redis-t2.micro上的aof和node.conf,但它也会挂起,最终说找不到节点…)
- 一旦我在127.0.0.1下启动并运行了集群,节点就会通信,redis-cli会将PONG返回到我的ping,但要设置一个键,它会给出"(error)MOVED 16164 127.0.0.1:30012","get"也是如此。因此,我尝试通过发送一个"cluster-meet"手动设置publicIP,如本例所示:redis-cli重定向到127.0.0.1
还是不行。当我设置meet时,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 nodes.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检查,结果显示一切正常:
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.
但是,当我在另一个实例上使用redispublicIP从客户端运行它时,我会得到:
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创建集群时出现连接错误?
更新3:这篇文章非常接近,但我不理解他的解决方案:src/redis-trib.rb创建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支持部门发送请求:https://forums.aws.amazon.com/thread.jspa?messageID=647509
已解决:它在客户端和redis-trib-create命令中都使用了私有IP地址。我在客户端配置中尝试了私有IP,但错误地认为我已经尝试了redis-trib。
对于其他人:第一课:使用redisEC2实例的私有IP。感谢这段视频帮助我了解:https://www.youtube.com/watch?v=s4YpCA2Y_-Q
已解决:正是在客户端和redis-trib-create命令中使用了私有IP地址才解决了这个问题。我在客户端配置中尝试了私有IP,但错误地认为我已经尝试了redis-trib。
对于其他人=>教训:使用redis-trib加入集群时,使用redisEC2实例的私有IP,而不是公共IP。感谢这段视频帮助我了解:https://www.youtube.com/watch?v=s4YpCA2Y_-Q