Redis のマスター/スレーブ同期とセンチネル モードについて話しましょう
この記事では、Redis のマスター/スレーブ同期と Sentinel モードについて深く理解し、マスター/スレーブ同期をオンまたはオフにする方法と、Sentinel をビルドして起動する方法を紹介します。みんな!
マスター/スレーブ同期
マスター/スレーブ同期 (マスター/スレーブ レプリケーション) は、Redis
の基礎です。可用性サービスであり、複数マシンの操作における最も基本的な です。 [関連する推奨事項: Redis ビデオ チュートリアル ]
主にデータを保存するノードをマスター ノード (master
) と呼び、マスターをコピーする他のレプリカ ノードを呼びます。ノード データ 次の図に示すように、スレーブ ノード (slave
) と呼ばれます。 #マスター ノードは複数のスレーブ ノードを持つことができます
次の図に示すように、スレーブ ノードは他のサーバーのマスター ノードになることもできます
マスタ/スレーブ同期のメリット
マスタ/スレーブ同期には次の 3 つの利点があります
パフォーマンスの側面: マスターとスレーブの同期を使用すると、
クエリ タスクをスレーブ サーバーに割り当てることができます、 マスター サーバーを使用して書き込み操作を実行できます 、これにより、プログラムの動作効率が大幅に向上します。すべての負荷が各サーバーに分散されます。
- 高可用性: マスター/スレーブ同期により、メイン サーバー ノードがダウンした場合 迅速に行うことができます スレーブ ノードをマスター ノードに昇格させることで、Redis サーバーのダウンタイムの回復にかかる貴重な時間を節約できます;
-
データ損失を防ぎます: マスターサーバーがディスクに損傷した後でも、他のスレーブサーバーは関連するデータを保持しているため、すべてのデータが失われることはありません。 #マスター/スレーブ同期を有効にする
- 運用中にスレーブ サーバーをセットアップする
Redis プロセスの実行中に、replicaof host port コマンドを使用して、自分自身を ターゲット IP
のスレーブ サーバーとして設定できます。マスター サービスがパスワードを設定している場合は、config set masterauth master service password
コマンド メソッドを使用して、スレーブ サーバーにマスター サーバーのパスワードを入力する必要があります実行後
replicaof コマンドの後、スレーブ サーバーのデータはクリアされ、マスター サービスはそのデータ コピーをスレーブ サーバーに同期します。
起動時にスレーブ サーバーを設定します
コマンド
redis-server --port 6380 --replicaof 127.0.0.1 6379
完全なデータ同期
複数のデータベースの一貫性を確保するために、メインサーバーは bgsave コマンドを 1 回実行して RDB
ファイルを生成し、その後Socket を使用します。 メソッドがスレーブ サーバーに送信され、サーバーから RDB
ファイルを受信した後、すべてのデータが独自のプログラムにロードされ、完全なデータ同期が完了します。 部分的なデータ同期
Redis 2.8
より前は、スレーブ サーバーがオフラインになってからオンラインに戻るたびに、マスター サーバーは完全なデータ同期を実行していました。データ同期 、オフライン時間が比較的短いときにこれが発生した場合、少量のデータだけが同期していないときにすべてのデータを同期するのは非常に不便で不経済になります。この機能は
Redis 2.8 で最適化されています。 。
Redis 2.8 の最適化方法では、スレーブ サービスがオフラインになると、マスター サーバーはオフライン後の書き込みコマンドを特定のサイズのキューに保存します。先入れ先出し 実行順序に従い、スレーブサーバーが書き換えられてオンラインに復元されると、マスターサービスはオフライン期間中のコマンドがまだキューにあるかどうかを判断し、残っている場合はデータを直接送信します。したがって、完全な同期を回避することはリソースの無駄です。
オフライン コマンドを保存するためのデフォルトのキュー サイズは 1MB です。ユーザーはキュー サイズ構成項目repl-backlog-size を変更できます。
ディスクレス データ同期
最初のマスター/スレーブ接続中に、最初に
RDB
RDB ファイルはスレーブ サーバーに送信されます。マスター サーバーが非 SSD の場合、システムの
I/O
Redis 2.8.18
新しいディスクレス コピー機能が追加されました。ディスクレス コピー機能は、ローカルに RDB
ファイルを作成しませんが、子プロセスを生成し、その子プロセスがこのプロセスは、Socket
を介して RDB
ファイルをスレーブ サーバーに直接書き込むため、マスター サーバーは RDB
ファイルを作成せずにトランザクションを完了できます。サーバーからのデータ同期。
コピーフリー機能を使用するには、構成項目 repl-diskless-sync
の値を yes
に設定するだけです。デフォルトの構成値は です。いいえ###。
サーバーのロールのクエリ
role コマンドを使用して、サーバーのマスター/スレーブ ロール情報をクエリします。現在のサーバー。
マスターとスレーブの同期を閉じる
replicaof no one コマンドを使用して、スレーブ サーバーからのレプリケーションを停止できます。 。
replicaof no one コマンドを実行した後、サーバーからマスターサーバーに変更しました。
#注意事項
データの一貫性の問題スレーブ サーバーが完了し、マスター サービスが開始されたときデータが同期された後、新しいコマンドが非同期でスレーブ サーバーに送信されます。このプロセス中に、マスターとスレーブの同期で短期間のデータの不整合が発生します。この非同期同期が発生する前にマスター サーバーがダウンした場合、データは不整合になります。
スレーブ サーバー読み取り専用デフォルトでは、レプリケーション モードのマスター サーバーは書き込み操作と読み取り操作の両方を実行できますが、スレーブ サーバーは読み取り操作のみを実行できます。手術。
スレーブ サーバーで
config setplica-read-only no コマンドを実行して、スレーブ サーバーで書き込みモードを有効にすることができますが、次の点に注意する必要があります。
- キー値が同じ場合、マスター サーバー上のデータがスレーブ サーバーを上書きする可能性がありますserver;
- 完全なデータ同期を実行すると、スレーブ サーバーのサーバー データはクリアされます。
Redis 5.0
以前に使用されていたレプリケーション コマンドは、## の slaveof
でした。 #Redis 5.0 #Redis 5.0
以降、レプリケーション コマンドは replicaof
に変更されました。上位バージョン (Redis 5
) では、replicaof# を使用するようにしてください。 ## なぜなら
slaveof コマンドはいつでも破棄される可能性があります。
Sentinel モード
マスター/スレーブ レプリケーション モードは
Redisマルチマシン操作の基礎ですが、このモード自体に致命的な問題があります。ノードがクラッシュした後、Redis
(センチネル モード) が必要です。これにより、の通常の使用を復元するには手動介入が必要です。
手動プロセスを自動に変えるための自動ツール -
Redis SentinelRedis
は自動ディザスタ リカバリ (
フェールオーバー) を実現します。 ###) 能力。センチネルは、マスター サーバーとスレーブ サーバー上で監視タスクを実行することと同等です。マスター サーバーがダウンしていることが検出されると、対応するルールがすぐにアクティブ化され、手動介入なしでスレーブ サーバーがマスター サーバーにアップグレードされ、サーバーの安定性と速度が向上します。
Redis Sentinel 最小割り当て単位は 1 つのマスターと 1 つのスレーブです。
Redis Sentinel のビルド
コマンドを使用します./src/redis - Sentinel を開始するには、sentinel Sentinel.conf
を使用します。開始するときは、sentinel.conf ファイルをセットアップする必要があります。この構成ファイルには、リスニング マスター ノード情報が含まれている必要があります:
sentinel monitor master-name ip port quorum
その内:
master-nameは、監視対象のマスター ノードに名前を付けることを意味します;
- #ip
はマスター ノードの IP を表し、
- port
はマスター ノードのポートを表し、
- quorum
は
Sentinel# の番号を表します。 ## マスター ノードがオフラインであることを確認しました。 quorum - が 1 に設定されている場合、1 つの
Sentinel
がオフラインであると判断する限り、オフラインであることを確認できることを意味します。本当にオフラインです。マスター ノード サーバー
Redisにパスワードがある場合、
sentinel.conf には次の内容が含まれている必要があります:
sentinel monitor mymaster 127.0.0.1 6379 1 sentinel auth-pass mymaster pwd654321
Sentinel クラスターを開始します
運用環境では、Sentinel を 1 つだけ起動するわけではありません。なぜなら、1 つの Sentinel を起動すると、残念ながらクラッシュした場合、自動災害復旧サービスを提供することはできませんが、これは高可用性の目的に沿わないため、異なる物理マシン上で複数の
Sentinel を起動して Sentinel## を形成します。
#Redis サービスの高可用性を確保するためのクラスター。
StartingSentinel
クラスターの起動方法は非常に簡単で、上記の単一サーバーの起動方法と同じで、複数の Sentinel
を 1 台に監視するだけです。メイン サーバー ノードなので、複数の ##Sentinel が自動的にお互いを検出し、
Sentinel クラスターを形成します。
Sentinel クラスターの数は 1 より大きい奇数です。
quorum のパラメーターは半分に設定されます。プラス 1。たとえば、5 は 3 に設定され、7 は 4 に設定されます。
#Sentinel
クラスター内の 1 つのSentinel がメイン サーバーがオフラインになったと判断すると、メイン サーバーを主観的にオフラインとしてマークします (
主観的にダウン#) ##, SDOWN
)、クラスター内の他の Sentinel
にもサーバーがオフラインであると考えているかどうかを尋ねます。Sentinel# がメイン サーバーがオフラインであることに同意した場合, ## この数が
quorum パラメーターで指定された数に達すると、
Sentinel は対応するメイン サーバーを客観的にオフラインとしてマークします (
客観的にダウン、ODOWN)。次に、フェイルオーバーを開始します。
メインサービス選択ルール
新しいマスターノード選択の優先順位設定
redis.conf の replica-priority
オプションは、新しいマスター ノードの実行の優先順位を設定するために使用されます。そのデフォルト値は 100 で、最大値も 100 です。この値が小さいほど、重量が軽いほど高くなります。新しいマスター ノードの選択ルール
次の条件を持つスレーブ ノードは除外されます。
オフラインであり、長期間ハートビート検出に応答していない、オフラインの疑いのあるスレーブ サーバーをすべて除外します。- 長期間マスター サーバーと通信しておらず、データ状態が古いすべてのスレーブ サーバーを除外します。
- すべてのスレーブ サーバーを除外します。 (
レプリカ優先度
) は 0 サーバーです。 #対象となるスレーブ ノードの選出順序:
最高の優先順位を持つスレーブ ノードが新しいマスター ノードになります。
- 優先順位が等しい場合、レプリケーション オフセットが決定され、最大のオフセットを持つスレーブ ノードが勝ちます;
- 上記 2 つの条件が同じ場合で、
- Redis
を選択します。実行時に最小の ID を持つサーバーが新しいマスター サーバーとしてランダムに生成されます。
古いマスター ノードがオンラインに戻ります
以前の古いマスター ノードがオンラインに戻ると、マスター/スレーブ サーバーで実行されます。スレーブノードとしてのモード。
センチネルの動作原理
まず第一に、各 センチネルは既知の人物に一定の頻度でメッセージを送信します。マスター サーバー、スレーブ サーバー、およびその他の Sentinel インスタンスは、PING コマンドを送信します。
PING
コマンドに対する最後の有効な応答の時間が、down-after-milliseconds
で設定された値 (デフォルトは 30 秒) を超える場合、このインスタンスは次のようになります。
は主観的オフラインとしてマークされています。 メイン サーバーが主観的オフラインとしてマークされている場合、メイン サーバーを監視しているすべての
Sentinel
ノードは、メイン サーバーが実際に主観的オフラインに入ったことを 1 回あたり 1 回の頻度で確認する必要があります。 2 番目の回線ステータス。 指定された時間範囲内で十分な数 (
構成値) Sentinel
がこの判断に一致した場合、マスター サーバーは客観的にオフラインとしてマークされます。この時点で、すべての
はルール ネゴシエーションに従って新しいマスター ノードを自動的に選択します。 注: 有効な
PING
応答は、 PONG、-LOADING
または
です。戻り値が上記の 3 つの応答ではない場合、または指定された時間内に PING
コマンドに対する応答がない場合、Sentinel
はサーバーから返された応答を無効であるとみなします ( 無効
) 。 Sentinel コマンド操作
Sentinel は 1 つのサーバーだけではなく、複数のマスター ノードを監視できます。複数のマスター ノードを監視する場合は、構成ファイルで複数の sentinel Monitor master-name ip port quorum を設定するだけです。異なるマスター ノードを区別するために
master-name を使用します。 . . 監視対象のすべてのマスター サーバーの情報をクエリする
特定のマスターの情報をクエリするノード
マスター ノードの IP とポートの表示
スレーブ ノード情報のクエリ
またはsentinel slides master-name
Sentinel クラスター内の他の Sentinel 情報をクエリします
检查可用 Sentinel 的数量 强制故障转移 在线修改配置信息 在 增加监视主节点 移除主节点的监视 使用 修改 quorum 参数 使用 以上所有对配置文件的修改,都会自动被刷新到物理配置文件 代码实战sentinel ckquorum master-name
sentinel failover master-name
Redis 2.8.4
之前如果需要修改 Sentinel
的配置文件,需要重启 Sentinel
。Redis 2.8.4
之后,我们可以在线修改配置文件了。sentinel monitor mymaster IP Port Quorum
命令。sentinel remove master-name
命令。sentinel set master-name quorum n
命令。quorum
参数用来表示确认主节点下线的 Sentinel
数量,如果 quorum
设置为 1 表示只要有一台 Sentinel 确认主观下线后,这个主节点就客观(真正地)下线了。sentinel.conf
中import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;
import utils.Config;
import java.util.HashSet;
import java.util.Set;
public class SentinelExample {
// master name
private static String _MASTER_NAME = "mymaster";
public static void main(String[] args) {
// Sentinel 配置信息
Set<String> set = new HashSet<>();
// 连接信息 ip:port
set.add("127.0.0.1:26379");
// 创建 Sentinel 连接池
JedisSentinelPool jedisSentinel = new JedisSentinelPool(_MASTER_NAME,
set, Config.REDIS_AUTH);
// 获取 Redis 客户端
Jedis jedis = jedisSentinel.getResource();
// 设置元素
String setRes = jedis.set("key", "Hello, redis.");
System.out.println(setRes);
// 获取元素
System.out.println(jedis.get("key"));
}
}
更多编程相关知识,请访问:编程入门!!
以上がRedis のマスター/スレーブ同期とセンチネル モードについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisデータをクリアする方法:Flushallコマンドを使用して、すべての重要な値をクリアします。 FlushDBコマンドを使用して、現在選択されているデータベースのキー値をクリアします。 [選択]を使用してデータベースを切り替え、FlushDBを使用して複数のデータベースをクリアします。 DELコマンドを使用して、特定のキーを削除します。 Redis-CLIツールを使用してデータをクリアします。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisを使用して操作をロックするには、setnxコマンドを介してロックを取得し、有効期限を設定するために有効期限コマンドを使用する必要があります。特定の手順は次のとおりです。(1)SETNXコマンドを使用して、キー価値ペアを設定しようとします。 (2)expireコマンドを使用して、ロックの有効期限を設定します。 (3)Delコマンドを使用して、ロックが不要になったときにロックを削除します。

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redisソースコードを理解する最良の方法は、段階的に進むことです。Redisの基本に精通してください。開始点として特定のモジュールまたは機能を選択します。モジュールまたは機能のエントリポイントから始めて、行ごとにコードを表示します。関数コールチェーンを介してコードを表示します。 Redisが使用する基礎となるデータ構造に精通してください。 Redisが使用するアルゴリズムを特定します。

Redisは、メッセージミドルウェアとして、生産消費モデルをサポートし、メッセージを持続し、信頼できる配信を確保できます。メッセージミドルウェアとしてRedisを使用すると、低遅延、信頼性の高いスケーラブルなメッセージングが可能になります。
