经过一番周折,我陷入了僵局。我正试图在一个t2.micro上设置一个包含3个主节点和3个从节点的redis群集。我在本地主机上的设置工作得很好,但当我尝试在EC2上运行它时,我遇到了一个奇怪的问题,我的客户端(在单独的t2.micro上使用ioredis)似乎可以找到并连接,但如果我的客户端在http中,则会反复抛出许多错误,如“ioredis:连接错误:错误:connect ECONREFUSE”。如果切换到https,则会出现其他不同的超时错误和“手动关闭”错误(尝试在群集选项中设置TLS标志无效)。
TL;博士
如果你正在阅读这篇文章,并与redis作斗争,下面的要点列表可以作为谷歌和stackoverflow首页上几乎所有提议的redis解决方案的一个很好的总结。好好利用它们!
在阅读了几个类似的主题后,我发现他们都没有解决这个问题。这是我尝试过的;
./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
已解决:在客户端和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
文件微服务,作为文件管理中间层,实现基于云服务存储和分发的业务的解耦。