1

苦労の末、私は行き詰まりました。単一の 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 ソリューションの優れた要約として役立つ可能性があります。上手に使おう!

いくつかの同様のトピックを読んだ後、どれも問題に対処していないことがわかりました。これが私が試したことです。

  1. EC2 セキュリティ グループをチェックして、redis t2.micro とクライアント t2.micro の間で適切なポートが開いていることを確認しました。redis ポート +10,000 (バス用) も開いていることを確認しました。
  2. AWS vpc、インターネット ゲートウェイ、サブネット、および ACL をチェックして、2 つのインスタンス間でトラフィックが流れることを確認しました
  3. いくつかのnetstatを実行したところ、正しいポートに接続でき、redisが正しいポートでリッスンしているようです
  4. 各ノードの redis.conf ファイルで、保護モード (no に設定)、バインド (コメント アウト)、およびパスワード フィールド (コメント アウト) が通信を阻害していないことを確認しました。最初はこれが問題の一部でした。ある時点で、それらすべてをオフにしましたが、それでも同じエラーが発生しました。
  5. 古い aof、dump.rdb、node.conf ファイルをすべて削除し、新しいインスタンスを開始しました。各ノードに独自のフォルダーがあることを確認しました (node.conf ファイルの共有はありません)。
  6. 次のように、ループバック 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 を接続して生成しました。

  1. クラスターを起動して 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

4

1 に答える 1