当前位置: 首页 > 知识库问答 >
问题:

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

葛承教
2023-03-14

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

TL;博士

如果你正在阅读这篇文章,并与redis作斗争,下面的要点列表可以作为谷歌和stackoverflow首页上几乎所有提议的redis解决方案的一个很好的总结。好好利用它们!

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

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

./redis-trib.rb创建--副本1127.0.0.1:30010127.0.0.1:30011127.0.0.1:30012127.0.0.1:30013127.0.0.1:30014127.0.0.1:30015

仍然有来自客户的错误。然后尝试了redis t2.micro的aws公共主机地址,然后是公共IP,然后是私有IP。当我启动节点(使用ps-ef确保它们在守护程序模式下运行)并尝试使用公共IP创建/redis trib create--replicas 1 publicIP:30010..等时,它看起来将创建集群,但随后挂起在“

还是不行。当我设置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'
}]);

30010nodes.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)

SSHRedist2.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,它允许我从客户端连接到单个节点,但当它试图查找其他节点时,它一定认为它们是本地的

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

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

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

更新4:

这似乎是AWSt2.micro实例的问题。我已经向AWS支持发送了请求: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

共有1个答案

贺自明
2023-03-14

已解决:在客户端和redis-trib创建命令中使用私有IP地址解决了这个问题。我在客户端配置中尝试了私有IP,但错误地认为我已经尝试了redis trib。

对其他人来说=

 类似资料:
  • Micro 满足了在云中构建服务的关键要求。它利用微服务架构模式并提供一组服务,这些服务充当平台的构建块。Micro解决了分布式系统的复杂性,并提供了更简单的可编程抽象作为基础。 Features 以下是构成Micro的核心组件。 服务器 Micro是作为微服务架构构建的,可以抽象出基础架构的复杂性。我们将其作为对用户的单个逻辑服务器进行组合,但是将其分解为可以插入到任何基础系统中的各种构建基元。

  • 需求 各个项目上云之后,每一个项目作为一个【微前端的应用】是独立开发的,通过权限确定允许使用的模块,各个应用中的模块可以同时运行在云平台中。 定义 微前端架构可以理解为使用不同 JavaScript 框架为多个团队构建现代 Web 应用程序的技术,策略和方法。 微前端架构旨在解决单体应用在一个相对长的时间跨度下,由于参与的人员、团队的增多、变迁,从一个普通应用演变成一个巨石应用(Frontend

  • TP-Micro 是一个基于 Teleport 定制的、简约而强大的微服务框架。 安装 go version > 1.9 go get -u -f -d github.com/xiaoenai/tp-micro/...cd $GOPATH/src/github.com/xiaoenai/tp-micro/cmd/microgo install 特性 支持服务自动发现 支持自定义服务链接选择器 支持

  • Micro 是一款简单易用、直观的终端文本编辑器。 主要特性: 易于使用 常用快捷键(ctrl-s, ctrl-c, ctrl-v, ctrl-z...) 鼠标操作支持友好 交叉平台 语法高亮显示 ,支持超过 75 种语言 支持多种配色方案 搜索和替换 撤消和重做 Unicode 支持 拷贝和粘贴与系统剪贴板 小而简单 可定制 效果图:

  • Micro Tetris 是基于 1989 年国际C语言代码比赛最好的游戏而开发的简单俄罗斯方块游戏。特别适合只带有串口或者 SSH 控制台访问的嵌入式设备使用。该项目没有使用 curses 和其他重的开发包实现,只有 ANSI 转义序列和 Unix 的 stty 命令。 命令: j    Leftk    Rotatel    RightSPC  Dropp    Pauseq    Quit

  • 文件微服务,作为文件管理中间层,实现基于云服务存储和分发的业务的解耦。