
VUE3.0 をすぐに始める方法:
nodejsでのredisクラスター機能の使用について学習しましょう 比較的完全でわかりやすい記事が見つからなかったので、開発とデバッグ中にかなり寄り道しました。プロセス。
この記事では、次回の寄り道を回避して開発と作業の効率を向上させるために、ローカルで Redis クラスターを構築する方法とクライアントでクラスターを使用する方法を詳しく紹介し、構築プロセス中に発生した問題とエラーを要約して説明します。
クラスターを使用する背景としては、Redis シングルトンモードでは、ユーザー数や訪問数の増加に伴い、qps 値が急激に上昇し、大量のio操作によりcpu(100%)ためです。同時に、バッチ処理 Redis やその他の方法は症状を治療するだけで、根本的な原因を解決することはできず、サーバーのパフォーマンスのボトルネックを解決することはできません。したがって、クラスター ソリューションを使用するか、Redis インスタンスを追加することが不可欠です。
クラスターは一般にサーバークラスターを指します。これは、クライアントの観点からは、同じサービスを実行するために多数のサーバーが集まっているように見えます。クラスタでは、複数のコンピュータを並列コンピューティングに使用して高いコンピューティング速度を実現できます。また、複数のコンピュータをバックアップに使用できるため、いずれかのマシンが故障した場合でも、システム全体が正常に実行できます。 ( redis3.0 より前は、センチネル モードが一般的に使用されていましたが、センチネルの構成が若干複雑で、パフォーマンスと高可用性は平均的です。)
投票フォールト トレランス メカニズムにより、半分以上のノードは、特定のノードに障害が発生したと考えています。そのため、2 つのノードでクラスターを形成することはできません。そのため、Redis クラスターには少なくとも 3 つのノードが必要です。
クラスターの高可用性を確保するには、各ノードにスレーブ ノード (つまり、バックアップ ノード) が必要であるため、 Redisクラスターには少なくとも 6 台のサーバーが必要です。 (3 つのマスターと 3 つのスレーブ、3 つのデポジットと 3 つの取得、高可用性、およびバックアップ)
もちろん、ローカルでデバッグするときにこれほど多くのサーバーを使用することは不可能なので、実際には6 つのredisインスタンスをローカルで実行することをシミュレートできます。本番環境の Redis クラスター ビルドは基本的にここと同じです。
。公式 Web サイトにインストールすることも、
#install brew install redis という名前の行を使用してインストールすることもできます。
#redisサーバーの起動 #redis クライアント redis-cli を入力します
まず redis 構成ファイルの場所を見つける必要があります
。brew list redis # redis インストールの場所を確認しますcd /opt/homebrew/Cellar/redis/6.2.4 # 場所に従ってバージョンを入力しますopen . # フォルダーを開きXcode.app使用してhomebrew.mxcl.redis.plistを開き、 redis.confの場所を見つけます。下に:

6 つのサービス構成ファイルを作成します
cd /opt/homebrew/etc/ (前の手順で見つかった構成ファイル ディレクトリ)
# /opt/homebrew/etc/ パスに存在する必要があります mkdir -p redis/cluster/7000 mkdir -p redis/cluster/7001 mkdir -p redis/cluster/7002 mkdir -p redis/cluster/7003 mkdir -p redis/cluster/7004 mkdir -p redis/cluster/7005
設定ファイルを変更します
。パス/opt/homebrew/etc/redis.confの下にある設定ファイルを変更する必要はありません。上記で作成したredis/cluster/7000ディレクトリにコピーするだけです。手順は次のとおりです。
cd /opt/homebrew/etc/ # 設定ファイルのディレクトリに入ります。 cp redis.conf redis/cluster/7000/7000.conf code redis/cluster/7000/7000.conf # エディターまたは vim で構成ファイルを開いて変更します
7000.confを入力した後、次のプロパティを変更します# Redis ポート番号 (各構成ファイル 7000 ~ 7005 を変更する必要があります)。 ポート7000 # クラスターモードを有効にし、クラスターを有効にして実行します。 # クラスター内部構成ファイル構成ファイルのパス、デフォルトのnodes-6379.conf (各構成ファイル 7000 ~ 7005 を変更する必要があります) クラスタ構成ファイル ノード 7000.conf # ノード間通信タイムアウト クラスターノードタイムアウト 5000 # データ永続化 appendonly yes
cd /opt/homebrew/etc/redis/cluster # 設定ファイルのディレクトリに入ります cp 7000/7000.conf 7001/7001.conf cp 7000/7000.conf 7002/7002.conf cp 7000/7000.conf 7003/7003.conf cp 7000/7000.conf 7004/7004.conf cp 7000/7000.conf 7005/7005.conf を
port和cluster-config-fileし
7001.conf-7005.confport和cluster-config-file値 (そうしないとクラスターは有効になりません)。これはポートによって区別されます。
構成ファイルのディレクトリは、 find /opt/homebrew -name nodes-7000.confコマンドで見つけることができます。
6 つのサービスを構成しているため、それらを 1 つずつ開始または停止することはできません。シェルスクリプトを使用して
/opt/homebrew/etc/redis/clusterディレクトリを作成する
start.sh と stop .sh ファイル
# start.sh ファイル #!/bin/sh redis-server /opt/homebrew/etc/redis/cluster/7000/7000.conf & redis-server /opt/homebrew/etc/redis/cluster/7001/7001.conf & redis-server /opt/homebrew/etc/redis/cluster/7002/7002.conf & redis-server /opt/homebrew/etc/redis/cluster/7003/7003.conf & redis-server /opt/homebrew/etc/redis/cluster/7004/7004.conf & redis-server /opt/homebrew/etc/redis/cluster/7005/7005.conf & # stop.sh ファイル #!/bin/sh redis-cli -p 7000 シャットダウンと redis-cli -p 7001 シャットダウンと redis-cli -p 7002 シャットダウンと redis-cli -p 7003 シャットダウンと redis-cli -p 7004 シャットダウンと redis-cli -p 7005 shutdown &
./start.shまたは./stop.shを実行して、サービスを開始および停止します。
ps -ef |grep redis実行して、開始された redis サービスを表示します。
注: ./ を実行する必要があります。 start.sh を初めて実行する場合は、 sudo chmod +x start.shを通じて実行権限を付与します。
redis-cli -p 7000 # 単一クライアントの起動 redis-server 7000/7000.conf # 単一サーバーの redis-cli を起動します。 -p 7000 shutdown # サーバーをシャットダウンします sudo chmod +x start.sh # スクリプト実行許可を有効にする # Redis のマスターとスレーブの関係を設定します (3 つのマスターと 3 つのスレーブ) redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 クラスターノード #クラスターノードのステータスの表示 (実行するクライアントを入力) クラスター情報 #クラスター情報の表示 (実行するクライアントを入力) すべてのキー値を表示: キー * 指定したインデックスの値を削除します: del キー Redis サーバー全体のデータをクリアします: flashall 現在のライブラリ内のすべてのキーをクリアします。flushdb
Redis にアクセスします。Cluster は、複数の Redis ノードで自動シャーディングの機能を提供します。以前に構築した 6 つの Redis サーバーを使用して、 node redis.js 、クラスターの効果をテストできます。 ioredis
// redis.js
const Redis = require("ioredis");
const クラスター = new Redis.Cluster([
{
ポート: 7000、
ホスト: "127.0.0.1",
}、
{
ポート: 7001、
ホスト: "127.0.0.1",
}、
]);
クラスター.set("foo", "bar");
クラスタ.get("foo", (err, res) => {
// res === 'バー'
bull フレームワーク
'bull' からキューをインポートします
// Redis キュー インスタンスを作成します const instance = new Queue('custom', {
接頭辞: '{myprefix}'、
createClient(タイプ) {
// クラスター クラスターインスタンスは上記と同じです return クラスター
}
})
// Redis キューにデータを追加します (プロデューサー)
instance.add(
'リクエスト'、
{
...パラメータ
}、
{
削除オンコンプリート: false
}
).catch(e => {
コンソール.エラー(e)
})
// コンシューマ コールバック instance.process('request', 5, async (job,ned) => {
console.log('現在消費されているデータの取得:', job.data)
// 新しい Promise((resolve)=>resolve()) を待って非同期操作を実行します
終わり()
}) bullフレームワークを使用してioredisクラスターに接続する場合には問題があります。データがredisキューにpushたびに、対応するコールバック関数が複数回トリガーされる可能性があります。現時点では、それが問題であるかどうかを判断することはできません。フレームワーク自体の使用または問題 (詳細をご存知の場合は、どなたでもメッセージを残してください)。
クラスタリングの代替: データの同期とデータ移行が必要ない場合は、クライアント上で複数のredisインスタンスを使用し、 Math.random()と組み合わせてデータをいずれかのredisに均等に分割することで、単一インスタンスのハードウェアの問題を解決できます。 ( cpuなど) ボトルネックの問題。
1. Mac システムで Redis に接続するとエラーが発生しますか?
コンソール エラー メッセージ: 127.0.0.1:6379 で Redis に接続できませんでした: 接続が拒否されました
理由: サーバーが起動していないか、起動に失敗しました
解決策: 最初に Redis サーバーを起動する必要があります redis-server
参照リンク
https://blog. csdn.net/qq_23347459/article/details/104257529
2. クライアントの起動時に、読み取りまたは書き込み時にエラーが報告されますか?
エラーメッセージ:ClusterAllFaileDerror:スロットのキャッシュを更新できませんでした
。
Processing: Modify to unique attribute value
Reference link 1
https://stackoverflow.com/questions/57350961/ioredis-clusterallfailederror-failed-to-refresh-slots-cache
Reference 2
https://github.com/luin/ioredis/ issues /711
3. create master-slave redis ステートメントの実行に失敗しましたか?
ステートメントを実行します: redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
プロンプト エラー: [ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
: create ステートメントの実行時にデータがクリアされず、クラスターがリセットされません。
処理: データをクリアし、クラスターをリセットし、rdb ファイルと aof ファイルをクリアします。Redis
データ
のクリアを参照してください
https://stackoverflow.com/questions/37206993/redis-server-cluster-not-working
# ポート 7000 のサービスを取得します。例として、7001 ~ 7005 $redis-cli -p 7000 に対して次の操作を繰り返します。 127.0.0.1:7000> フラッシュオール 127.0.0.1:7000> クラスターのリセット 127.0.0.1:7000>終了 # find を使用して rdb および aof ファイルを検索します (これも rdb ディレクトリ内にあります)。 /opt/homebrew -name dump.rdb を見つけます # create ステートメントを正常に再実行します redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1: 7005
クライアントでの Redis クラスターの使用は非常に簡単ですが、それに比べてサーバーでの構成はより複雑になります。
クライアントの具体的な使用法については簡単に説明しますが、使用中は Redis データの同期や移行などの問題に注意する必要があります。
クラスターを使用すると、サービス機能が向上する可能性がありますが、マスタースレーブレプリケーション、センチネルモード、読み取りワイト分離、サーバーの圧力を均等に分配することなどをサポートします。ただし、自動フォールト トレランスおよび回復機能はありません。ダウンタイムが発生すると、一部の読み取りおよび書き込みリクエストが失敗し、システムの可用性が低下します。使用する場合は、ビジネス状況に基づいてさまざまなソリューションを分析し、選択します。
この記事はhttps://juejin.cn/post/7079928963107127327から転載されました。
作者: タガー