Redis (8) ------パブリッシュとサブスクライブ、マスター/スレーブ レプリケーション
13. 公開と購読
- Redis のパブリッシュおよびサブスクライブ (pub/sub) はメッセージ通信モデルです。送信者 (パブ) がメッセージを送信し、サブスクライバー (サブ) がメッセージを受信します。
- Redis クライアントは任意の数のチャネルをサブスクライブできます
- チャネル、
channel1
このチャネルに加入している 3 つのクライアントclient2
間client5
のclient1
関係は次のとおりです。
- 新しいメッセージが
PUBLISH
コマンドを通じてチャネルに送信されるchannel1
と、そのメッセージは、それにサブスクライブしている 3 つのクライアントに送信されます。プロセスは次のとおりです。
13.1 基本コマンド
注文 | 説明する |
---|---|
PSUBSCRIBE パターン1 パターン2… | 指定されたパターンに一致する 1 つ以上のチャンネルを購読します |
PUNSUBSCRIBE パターン 1 パターン 2… | 指定されたパターンに一致する 1 つ以上のチャンネルの登録を解除する |
PUBSUB サブコマンド | サブスクリプションと公開システムのステータスを表示する |
PUBLISH チャネル(メッセージ送信者) メッセージ(パブリッシュ情報) | 指定したチャンネルにメッセージを投稿する |
SUBSCRIBE チャンネル1(チャンネル名) チャンネル2… | 特定のチャンネルを購読する |
チャンネル1チャンネル2の登録を解除… | 1 つまたは複数のチャンネルの登録を解除する |
- 例
------------订阅端 ----------------------
# 订阅zzz频道
127.0.0.1:6379> SUBSCRIBE zzz
# 等待接收消息
Reading messages... (press Ctrl-C to quit)
# 订阅成功的消息
1) "subscribe"
2) "zzz"
3) (integer) 1
# 接收到来自zzz频道的消息 "hello world"
# 消息
1) "message"
# 来自哪个频道
2) "zzz"
# 消息具体内容
3) "hello world"
# 接收到来自zzz频道的消息 "hello i am zzz"
1) "message"
2) "zzz"
3) "hello i am zzz"
--------------消息发布端 -------------------
# 发布消息到zzz频道
127.0.0.1:6379> PUBLISH zzz "hello world"
(integer) 1
# 发布消息
127.0.0.1:6379> PUBLISH zzz "hello i am zzz"
(integer) 1
-----------------查看活跃的频道 ------------
127.0.0.1:6379> PUBSUB channels
1) "zzz"
13.2 原則
-
各 Redis サーバー プロセスは
redis.h/redisServer
、サーバーのステータスを表す構造体を維持します。pubsub_channels
構造体の属性は辞書です。この辞書は、サブスクリプション チャネルの情報を保存するために使用されます。辞書はサブスクライブされているチャネルであり、辞書の値は A ですこのチャネルに登録しているすべてのクライアントを格納するリンク リスト
-
クライアントがサブスクライブすると、対応するチャネルのリンク リストの末尾に接続されますが、サブスクライブを解除するには、クライアント ノードがリンクから削除されます。
13.3 欠点
- クライアントがチャネルにサブスクライブしているものの、メッセージを十分に速く読み取ることができない場合、メッセージのバックログが継続的に発生するため、redis 出力バッファーがますます大きくなり、redis 自体の速度が低下する可能性があります。
- これはデータ送信の信頼性に関係しており、サブスクライバが切断されると、切断期間中にパブリッシャによってパブリッシュされたすべてのメッセージが失われます。
13.4 特定のアプリケーションシナリオ
- メッセージ購読: パブリックアカウント購読、Weiboフォローなど。
- 複数人によるオンライン チャット ルーム
- 他の複雑なシナリオの場合は、メッセージ ミドルウェア MQ を使用して実装します。
14. マスター/スレーブ レプリケーション
14.1 基本概念
- マスター/スレーブ レプリケーションとは、1 つの Redis サーバーから他の Redis サーバーにデータをコピーすることを指します。前者をマスターノード(Master/Leader)、後者をスレーブノード(Slave/Follower)と呼びます。
- データのレプリケーションは一方向であり、マスター ノードからスレーブ ノードへのみコピーできます (マスター ノードは主に書き込み用、スレーブ ノードは主に読み取り用です)。
- デフォルトでは、各 Redis サーバーはマスター ノードであり、マスター ノードは 0 個以上のスレーブ ノードを持つことができますが、各スレーブ ノードが持つことができるダイレクト ポイントは 1 つだけです。
14.2 機能
- データ冗長性: マスター/スレーブ レプリケーションは、永続化以外のデータ冗長化方法であるデータのホット バックアップを実装します。
- 障害回復: マスター ノードに障害が発生した場合、スレーブ ノードが一時的にマスター ノードに代わってサービスを提供できます。これは、サービスの冗長性の方法です。
- 負荷分散: マスター/スレーブのレプリケーションに基づいて、読み取りと書き込みの分離を組み合わせることで、特に読み取りが多く書き込みが少ないシナリオでは、マスター ノードが書き込み操作を実行し、スレーブ ノードが読み取り操作を実行してサーバーの負荷を分散します。複数のスレーブ ノードを介してロードし、同時実行性を向上させます。
- 高可用性の基礎: マスター/スレーブ レプリケーションはその基盤であり
哨兵
、集群
実装可能です
14.3 クラスターを使用する理由
-
一般に、エンジニアリング プロジェクトで Redis を使用する場合、次の理由により、Redis を 1 つだけ使用することはできません。
- 構造的に言えば、単一の Redis サーバーには単一障害点が存在し、1 つのサーバーが処理する必要があるすべてのリクエストの負荷はストレスのかかるものになります。
- 容量的には、単一の Redis サーバーのメモリ容量には限界があり、たとえ 256G のメモリ容量を備えた Redis サーバーであっても、すべてのメモリを Redis ストレージのメモリとして使用することはできません。通常、1 つの Redis で使用される最大メモリは 20G を超えません。
-
単一サーバーで大量のリクエストをロードすることは困難です
-
単一サーバーの故障率は高く、システム崩壊の可能性が高くなります。
-
単一サーバーのメモリ容量には制限があります
14.4 環境設定
-
環境を構成するときは、メイン ライブラリではなく、スレーブ ライブラリのみを構成します。
-
Redis 構成ファイルには
replication
モジュールがあります -
現在のライブラリに関する情報を表示します。
info replication
127.0.0.1:6379> info replication
# Replication
# 角色
role:master
# 从机数量 0
connected_slaves:0
master_replid:ad05a88a5404924d3e4c7487b32e0019f5d6fb7b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
- 複数のサービスを開始する必要がある場合は、複数の構成ファイルを構成する必要があります。対応する各構成ファイルで次の情報を変更する必要があります。
- ポート番号
- pid ファイル名: プロセスの ID を記録し、プログラムが複数回起動しないようにファイルはロックされます。
redis_6379.pid
- ログ ファイル名: ログ ファイルの場所を指定します:
logfile“6379.log”
- rdb ファイル名: 永続ファイルの場所:
dump6379.rdb
14.5 1 つのマスターと 2 つのスレーブ構成
-
リモートサーバーはセキュリティグループとファイアウォールを有効にする必要があります
-
デフォルトでは、各 Redis サーバーはマスター ノードであり、スレーブ マシン、マスター (6379)、スレーブ (6380、6381) を構成する必要があります。
-
3 つの redis サーバーを同時に起動します。これらはプロセス情報を通じて確認できます。
ps -ef|grep redis
-
SLAVEOF host port
スレーブ マシンのホストを構成するために使用します。ホスト: ホスト IP、ポート: ホストのポート番号 -
127.0.0.1:6380 構成
127.0.0.1:6380> slaveof localhost 6379
OK
127.0.0.1:6380> info replication
# Replication
# 角色变为slave
role:slave
master_host:localhost
# 主机端口号
master_port:6379
master_link_status:up
- ホスト上でスレーブのステータスを確認できます
127.0.0.1:6379> info replication
# Replication
role:master
# 2个从机
connected_slaves:2
# 第一台从机
slave0:ip=127.0.0.1,port=6380,state=online,offset=504,lag=1
# 第二台从机
slave1:ip=127.0.0.1,port=6381,state=online,offset=504,lag=0
- このメソッドはコマンドで構築されており、一時的なものです。スレーブ マシンの電源がオフになると失われます。実際の開発では、スレーブ マシンの設定ファイルで設定する必要があります。永続的です。
replicaof 主机IP 主机端口号
masterauth 主机密码
14.6 使用規則
- スレーブは読み取りのみが可能で書き込みはできません。マスターは読み取りと書き込みが可能ですが、主に書き込みに使用されます。
- ホストの電源がオフになりダウンした後、デフォルトではスレーブの役割は変更されませんが、書き込み操作はクラスター内で失われます。ホストは回復した後、スレーブに接続して元の状態に復元します。
- スレーブマシンがブレークポイントでクラッシュした後、スレーブマシンが設定ファイルを使用して設定されていない場合、マスターマシンとして再起動した後、以前のマスターのデータを取得できません。スレーブ機ではマスター機の全データを取得できます。
- ホストに障害が発生した後、新しいホストを生成するには 2 つの方法があります。
- スレーブマシンはコマンドを手動で実行し
slaveof no one
、実行完了後スレーブマシンは独立したマスターとなり、他のスレーブマシンは新しいマスターのスレーブマシンとなります。 - センチネル モード (自動選出) を使用する
- スレーブマシンはコマンドを手動で実行し
14.7 コピー原則
- スレーブが起動し、マスターに正常に接続すると、同期同期コマンドが送信されます。
- マスターはコマンドを受信し、バックグラウンド保存プロセスを開始し、データ セットを変更するために受信したすべてのコマンドを収集します。
- バックグラウンド プロセスが完了すると、マスターはデータ ファイル全体をスレーブに転送し、完全な同期を完了します。
- フル コピー: データベース ファイル データを受信した後、スレーブ サービスはそれをメモリに保存し、メモリにロードします。
- 増分レプリケーション: マスターは、同期を完了するために、新しく収集されたすべての変更コマンドをスレーブに渡し続けます。
- マスターが再接続されていれば、完全同期(フルコピー)が自動的に実行されます。