問題タブ [ioredis]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
amazon-web-services - EC2 t2.micro 上の Redis Cluster 3.2.0 (Elasticache なし)
苦労の末、私は行き詰まりました。単一の 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 時間かかると思っていましたが、今もここに座って頭をかきむしっています。
潜在的に役立つコード:
クラスタ コード:
30010 ノード.conf
クライアント エラー: sudo DEBUG=ioredis:* node app.js
redis t2.micro と netstat に SSH 接続します。正しいポート (30010-30015) でリッスンしているようです
クライアント t2.micro に SSH 接続し、redis リモート サーバーからクラスター ノードをリモートで呼び出すと、正しいループバック セットアップが返されます。
-------------------------------------------------- -----
想い?? redis-trib を使用して (127.0.0.1 ではなく) publicIP でクラスターを作成できないのはなぜですか? これは私の問題を解決するように見えるか、ファイアウォールのようにここに欠けていることが明らかな何かがあります...
................................ アップデート
redis サーバーでローカルに redis-trib.rb チェックを実行したところ、すべてが適切であることが示されました。
しかし、redis publicIP を使用して別のインスタンスでクライアントから実行すると、次のようになります。
そのため、その 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
node.js - hset と hget のテスト時に ioredis または node_redis を使用すると奇妙な動作が発生する
誰かがこれに光を当てることができることを願っています。私は一生、問題が何であるかを見つけることができません。
問題:
hset を使用して 1 つのファイルで Redis に値を追加し、hgetを使用して別のファイルでその値を取得しようとしています。テスト ケースで最終的に発生するのは、値が設定されているにもかかわらず、 hgetが何もなかったかのように null を返すことです。
試み:
同じファイルに値を設定した直後に値を取得しようとすると、本当に奇妙な部分が発生します。実際は普通に使えます!これをチェックしてください...
ルートが単純であることがわかります...
テスト ケースのhsetのすぐ下にそのhgetを挿入すると、値が完全に取得されます。これを修正する方法について誰かアイデアがありますか?
ノート:
誰かが提案する前に、私はすでに接続されたイベントをリッスンしていますが、hsetのすぐ下の値を取得でき、それが機能するため、それは問題ではありません。この問題は、約束されたnode_redisインストールでも持続します。
ありがとう!
node.js - IOREDIS で ZRank を送信する方法
Nodejs は初めてで、 ioredisを使用して redis コマンドをクラスターに送信しています。
基本的な「get」および「set」コマンドを除いて、ioredis で zrank コマンドを使用する方法の ioredis サンプルが見つかりませんでした。
ioredis がそれを実装していることは知っていますが、パラメーターとコールバックは私にとって謎です。
質問が重複している可能性がある場合は、ありがとうございます。
node.js - Nodejs 閉鎖の問題
ノード Web アプリケーションで、RedisStore で Express-Session を使用しています。
NodeJs バージョン: 4.2.4 JS: Es6
"express": "^4.13.3", "express-session": " https://github.com/echorohit/session/tarball/1d22749aa46280a24a4ee3a993ba0772e6e1e2df ", "ioredis": "^1.13.0", "connect-redis ": "^3.0.1",
時々、セッションがユーザー間で混同されていることに気付きました。私はいくつかのメトリクスをログに記録するためにnewrelicの洞察を使用していたので、それを使用して問題をデバッグしました。
これが私の発見です。
express-session の store.js からのコード スニペット
チェックポイント1でreq.sessionIDは正しかったが、奇妙にチェックポイント2で req.sessionID が新しい遺物ログで同時に実行されている他のリクエストに対して出力されました。
これがセッションの混乱の原因であると確信しています。しかし、根本的な原因を見つけるためにさらにデバッグすることはできません。問題の根本原因を突き止めるためのヒントを教えてください。これが本当にクロージャー スコープの問題であるかどうかはわかりません。
javascript - redis 接続を永続的に維持する必要がありますか?
API アプリケーションのキー値ストアとして redis を使用することを検討しています。API は基本的に、redis へのクライアント接続を 1 つだけ必要とします。よくわからないのは、接続を永久に開いたままにしておくべきですか? または、redis から値を設定または取得する必要がある場合にのみ、接続を開く必要がありますか?
接続を開くのは高価な操作だと考える人もいるかもしれません。一方、接続を常に開いたままにしておくことは、必要なときにのみ開くことほど安全ではありません。また、長い接続を開いたままにしておくと、タイムアウトが発生する可能性があります。何らかの理由で接続が失敗した場合、redis は再接続を試みますか? redis は長時間開いている接続をどの程度うまく処理できますか? どんな助けでも大歓迎です!
node.js - Redis クラスターとノード ioredis: 開発用のリモート Redis クラスターに接続します。
アプリをローカルのリモート Redis クラスターに接続するのに問題があります。単一のノード/接続を使用すると、非常に簡単です。
ssh -f -N -L6379:localhost:6379 user@{{ remote_ip }}
そして、redis はローカル ポート 6379 を介して直接接続できます。
ただし、マルチノード クラスターのセットアップでは同じことは機能しません。すべてのノードに対して上記のコード行を使用して各ポートを転送しようとしまし6379, 6380, 6381, etc.
たが、クラスター接続を確立できません。これは、クラスター ノードの構成が必然的にリモート サーバーの実際のプライベート IP を参照するため、ローカル ポートを相互に接続できないためだと思います。
これは私がredisに接続する方法です:
ENV.MARKET_REDIS_HOST
dev では localhost に設定され (機能しません)、prod では実際のプライベート IP に設定されます (これは機能します)。
node.js - node.js は redis クラスターからデータを取得します。ioredis では、zrange メソッドが正しい数のデータを返しません。
私はこれを使用します:redisClient.zrange(key, 1, 1)
そのキーですべてのデータを取得しようとしますが、リストから一部のデータが欠落している場合がありますが、redisデータをチェックインすると、c#クライアントでもすべて問題ありません。何か案は?
node.js - Nodejs IOREDIS:キーの有効期限を設定する方法は?
以下のコードを使用してRedisセンチネルに接続しています
次のコードを使用してキーの値を設定しています。
キー値の有効期限を 12 時間などに設定する方法を教えてください。