Amazon web services EC2 t2.micro上的Redis Cluster 3.2.0(无弹性)

Amazon web services EC2 t2.micro上的Redis Cluster 3.2.0(无弹性),amazon-web-services,redis,cluster-computing,ioredis,Amazon Web Services,Redis,Cluster Computing,Ioredis,经过一番周折,我陷入了僵局。我正试图在一个t2.micro上设置一个包含3个主节点和3个从节点的redis群集。我在本地主机上的设置工作得很好,但当我尝试在EC2上运行它时,我遇到了一个奇怪的问题,我的客户端(在单独的t2.micro上使用ioredis)似乎可以找到并连接,但如果我的客户端在http中,则会反复抛出许多错误,如“ioredis:连接错误:错误:connect ECONREFUSE”。如果切换到https,则会出现其他不同的超时错误和“手动关闭”错误(尝试在群集选项中设置TLS标

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


TL;博士

思想??为什么我不能使用redis trib使用publicIP(而不是127.0.0.1)创建集群?这似乎解决了我的问题,或者我在这里缺少了什么明显的东西,比如防火墙?。。。 如果你正在阅读这篇文章并与redis抗争,下面列出的几点可以很好地总结google和stackoverflow顶部页面上几乎所有建议的redis解决方案。好好利用它们

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

  • 检查了我的EC2安全组,以确保在我的redis t2.micro和客户端t2.micro之间打开了正确的端口。确保redis端口+10000(用于总线)也已打开
  • 检查了我的AWS vpc、internet网关、子网和ACL,以确保流量可以在两个实例之间流动
  • 运行了一些netstat,看起来我可以连接到正确的端口,并且redis正在正确的端口上侦听
  • 在每个节点的redis.conf文件中,确保受保护模式(设置为否)、绑定(注释掉)和密码字段(注释掉)不会阻止通信。起初,这是问题的一部分。在某一点上,我关闭了所有这些功能,但仍然出现了相同的错误
  • 我删除了所有旧的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: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..等时,它看起来将创建集群,但随后挂起在“>>>创建集群”,直到失败并表示无法连接到第一个节点。它不允许我使用publicIP而不是127.0.0.1创建集群(我怀疑这就是为什么我的客户端无法连接的问题)。似乎其他人已经成功连接了它,但在这种情况下没有成功(我也尝试从我的客户端运行redis trib,它将连接并生成redis t2.micro上的aof和node.conf,但它也会挂起,并最终说找不到节点…)

  • 一旦集群在127.0.0.1下启动并运行,节点将进行通信,redis cli将PONG返回到我的ping,但要设置它给出的键“(错误)移动16164 127.0.0.1:30012”,对于“get”也是如此。因此,我尝试通过发送“群集会议”手动设置publicIP,如本例所示:
  • 还是不行。当我设置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.
    
    但当我使用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文件中没有设置密码:

    更新3:本文非常接近,但我不理解他的解决方案: src/redis-trib.rb创建127.0.0.1:6379 127.0.0.1:6380 h2:p1 h2:p2 h3:p1 h3:p2

    特别是为什么他在h2:p1h2:p2h3:p1h3:p2之后声明主机和端口


    更新4:

    这可能是AWS t2.micro实例的问题。我已向AWS支持部门发送了一个请求:


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