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.conf
port和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から転載されました。
作者: タガー