苦労の末、私は行き詰まりました。単一の t2.micro で 3 つのマスター ノードと 3 つのスレーブの redis クラスターをセットアップしようとしています。私のローカルホストでのセットアップはうまく機能しますが、EC2 で実行しようとすると、クライアント (ioredis を使用する別の t2.micro 上) が見つけて接続しているように見えますが、「ioredis」のように多くのエラーを繰り返しスローするという奇妙な問題が発生します。 :connection error: Error: connect ECONNREFUSED" クライアントが http. https に切り替えると、追加のさまざまなタイムアウト エラーと「手動で閉じた」エラーが発生します (クラスター オプションで TLS フラグを無効に設定しようとしました)。
TL;DR
想い?? redis-trib を使用して (127.0.0.1 ではなく) publicIP でクラスターを作成できないのはなぜですか? これは私の問題を解決するように見えますか、それともファイアウォールのようにここに欠けていることが明らかな何かがありますか?...
これを読んでいて、redis に苦労している場合、以下のポイントのリストは、google と stackoverflow のトップ ページで提案されているほぼすべての redis ソリューションの優れた要約として役立つ可能性があります。上手に使おう!
いくつかの同様のトピックを読んだ後、どれも問題に対処していないことがわかりました。これが私が試したことです。
- EC2 セキュリティ グループをチェックして、redis t2.micro とクライアント t2.micro の間で適切なポートが開いていることを確認しました。redis ポート +10,000 (バス用) も開いていることを確認しました。
- AWS vpc、インターネット ゲートウェイ、サブネット、および ACL をチェックして、2 つのインスタンス間でトラフィックが流れることを確認しました
- いくつかのnetstatを実行したところ、正しいポートに接続でき、redisが正しいポートでリッスンしているようです
- 各ノードの redis.conf ファイルで、保護モード (no に設定)、バインド (コメント アウト)、およびパスワード フィールド (コメント アウト) が通信を阻害していないことを確認しました。最初はこれが問題の一部でした。ある時点で、それらすべてをオフにしましたが、それでも同じエラーが発生しました。
- 古い aof、dump.rdb、node.conf ファイルをすべて削除し、新しいインスタンスを開始しました。各ノードに独自のフォルダーがあることを確認しました (node.conf ファイルの共有はありません)。
- 次のように、ループバック 127.0.0.1 を使用して redis クラスターを接続しようとしました。
./redis-trib.rb create --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 を試すと、クラスターが作成されるように見えますしかし、失敗して最初のノードに接続できないと表示されるまで、">>>クラスターの作成" でハングします。127.0.0.1 の代わりに publicIP を使用してクラスターを作成することはできません (これは、クライアントが接続できない理由であると思われます)。他の人が接続に成功したようですが、この場合は成功しませんでした (クライアントから redis-trib を実行しようとしたところ、redis t2 で aof と node.conf を接続して生成しました。
- クラスターを起動して 127.0.0.1 で実行すると、ノードが通信し、redis-cli が ping に PONG を返しますが、キーを設定すると、「(エラー) MOVED 16164 127.0.0.1:30012」が返され、「得る'。そこで、次の例のように「クラスター ミート」を送信して publicIP を手動で設定しようとしました: redis-cli redirected to 127.0.0.1
まだ行きません。ミーティングを設定している間、127.0.0.1 の一部が残っているか、publicIP で設定したものが、すべてのノードの実行が終了するまでに元に戻ったように見えました。
考えなければならない唯一のことは、AWS がどこかでポートをブロックしているかどうかです。両方の t2.micro インスタンスへのすべてのポートを開いてみましたが、それらを誰に対しても広く開いていましたが、それでも機能しませんでした。EC2 インスタンスで iptables を調べることを考えましたが、セキュリティ グループがあることを考えると、設定しないでください (そして、iptables をあまりいじっていません)。これには 1 時間かかると思っていましたが、今もここに座って頭をかきむしっています。
潜在的に役立つコード:
クラスタ コード:
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)
redis t2.micro と netstat に SSH 接続します。正しいポート (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
クライアント t2.micro に SSH 接続し、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 を使用して (127.0.0.1 ではなく) publicIP でクラスターを作成できないのはなぜですか? これは私の問題を解決するように見えるか、ファイアウォールのようにここに欠けていることが明らかな何かがあります...
................................ アップデート
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 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 サポートにリクエストを送信しました: 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