ホームページ  >  記事  >  データベース  >  Redis のマスター/スレーブ同期とセンチネル モードについて話しましょう

Redis のマスター/スレーブ同期とセンチネル モードについて話しましょう

青灯夜游
青灯夜游転載
2022-02-08 09:55:533485ブラウズ

この記事では、Redis のマスター/スレーブ同期と Sentinel モードについて深く理解し、マスター/スレーブ同期をオンまたはオフにする方法と、Sentinel をビルドして起動する方法を紹介します。みんな!

Redis のマスター/スレーブ同期とセンチネル モードについて話しましょう

マスター/スレーブ同期

マスター/スレーブ同期 (マスター/スレーブ レプリケーション) は、Redis の基礎です。可用性サービスであり、複数マシンの操作における最も基本的な です。 [関連する推奨事項: Redis ビデオ チュートリアル ]

主にデータを保存するノードをマスター ノード (master) と呼び、マスターをコピーする他のレプリカ ノードを呼びます。ノード データ 次の図に示すように、スレーブ ノード (slave) と呼ばれます。 #マスター ノードは複数のスレーブ ノードを持つことができます

,

次の図に示すように、スレーブ ノードは他のサーバーのマスター ノードになることもできますRedis のマスター/スレーブ同期とセンチネル モードについて話しましょう

マスタ/スレーブ同期のメリット

Redis のマスター/スレーブ同期とセンチネル モードについて話しましょうマスタ/スレーブ同期には次の 3 つの利点があります

:

パフォーマンスの側面: マスターとスレーブの同期を使用すると、

クエリ タスクをスレーブ サーバーに割り当てることができます

マスター サーバーを使用して書き込み操作を実行できます 、これにより、プログラムの動作効率が大幅に向上します。すべての負荷が各サーバーに分散されます。

  • 高可用性: マスター/スレーブ同期により、メイン サーバー ノードがダウンした場合 迅速に行うことができます スレーブ ノードをマスター ノードに昇格させることで、Redis サーバーのダウンタイムの回復にかかる貴重な時間を節約できます;
  • データ損失を防ぎます: マスターサーバーがディスクに損傷した後でも、他のスレーブサーバーは関連するデータを保持しているため、すべてのデータが失われることはありません。 #マスター/スレーブ同期を有効にする
  • 運用中にスレーブ サーバーをセットアップする
In

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 Sentinel

(センチネル モード) が必要です。これにより、

Redis は自動ディザスタ リカバリ ( フェールオーバー) を実現します。 ###) 能力。 センチネルは、マスター サーバーとスレーブ サーバー上で監視タスクを実行することと同等です。マスター サーバーがダウンしていることが検出されると、対応するルールがすぐにアクティブ化され、手動介入なしでスレーブ サーバーがマスター サーバーにアップグレードされ、サーバーの安定性と速度が向上します。

Redis Sentinel 最小割り当て単位は 1 つのマスターと 1 つのスレーブです。

Redis のマスター/スレーブ同期とセンチネル モードについて話しましょうRedis Sentinel のビルド

コマンドを使用します./src/redis - Sentinel を開始するには、sentinel Sentinel.conf

を使用します。開始するときは、

sentinel.conf ファイルをセットアップする必要があります。この構成ファイルには、リスニング マスター ノード情報が含まれている必要があります:

sentinel monitor master-name ip port quorum
その内:

master-name

は、監視対象のマスター ノードに名前を付けることを意味します;

  • #ip はマスター ノードの IP を表し、
  • port はマスター ノードのポートを表し、
  • quorumSentinel# の番号を表します。 ## マスター ノードがオフラインであることを確認しました。
  • 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 クラスターを形成します。

Redis のマスター/スレーブ同期とセンチネル モードについて話しましょう

一般に、

Sentinel クラスターの数は 1 より大きい奇数です。quorum のパラメーターは半分に設定されます。プラス 1。たとえば、5 は 3 に設定され、7 は 4 に設定されます。

主観的なオフラインと客観的なオフラインの 2 つのコンセプト。

#Sentinel

クラスター内の 1 つの

Sentinel がメイン サーバーがオフラインになったと判断すると、メイン サーバーを主観的にオフラインとしてマークします (主観的にダウン#) ##, SDOWN)、クラスター内の他の Sentinel にもサーバーがオフラインであると考えているかどうかを尋ねます。Sentinel# がメイン サーバーがオフラインであることに同意した場合, ## この数が quorum パラメーターで指定された数に達すると、Sentinel は対応するメイン サーバーを客観的にオフラインとしてマークします (客観的にダウン、ODOWN)。次に、フェイルオーバーを開始します。 メインサービス選択ルール

新しいマスターノード選択の優先順位設定

redis.confreplica-priority

オプションは、新しいマスター ノードの実行の優先順位を設定するために使用されます。そのデフォルト値は 100 で、最大値も 100 です。この値が小さいほど、重量が軽いほど高くなります。

新しいマスター ノードの選択ルール

新しいマスター ノードの選択では、条件を満たさないスレーブ ノードが除外され、残りのスレーブ ノードが選択されます。優先順位に従って。

次の条件を持つスレーブ ノードは除外されます。

オフラインであり、長期間ハートビート検出に応答していない、オフラインの疑いのあるスレーブ サーバーをすべて除外します。

  • 長期間マスター サーバーと通信しておらず、データ状態が古いすべてのスレーブ サーバーを除外します。

  • すべてのスレーブ サーバーを除外します。 (

    レプリカ優先度

    ) は 0 サーバーです。
  • #対象となるスレーブ ノードの選出順序:

  • 最高の優先順位を持つスレーブ ノードが新しいマスター ノードになります。

    優先順位が等しい場合、レプリケーション オフセットが決定され、最大のオフセットを持つスレーブ ノードが勝ちます;
  • 上記 2 つの条件が同じ場合で、
  • Redis

    を選択します。実行時に最小の ID を持つサーバーが新しいマスター サーバーとしてランダムに生成されます。

  • 古いマスター ノードがオンラインに戻ります

  • 以前の古いマスター ノードがオンラインに戻ると、マスター/スレーブ サーバーで実行されます。スレーブノードとしてのモード。

センチネルの動作原理

まず第一に、各 センチネルは既知の人物に一定の頻度でメッセージを送信します。マスター サーバー、スレーブ サーバー、およびその他の Sentinel インスタンスは、PING コマンドを送信します。

PING コマンドに対する最後の有効な応答の時間が、down-after-milliseconds で設定された値 (デフォルトは 30 秒) を超える場合、このインスタンスは次のようになります。

Sentinel

は主観的オフラインとしてマークされています。 メイン サーバーが主観的オフラインとしてマークされている場合、メイン サーバーを監視しているすべての Sentinel ノードは、メイン サーバーが実際に主観的オフラインに入ったことを 1 回あたり 1 回の頻度で確認する必要があります。 2 番目の回線ステータス。 指定された時間範囲内で十分な数 (

quorum

構成値) Sentinel がこの判断に一致した場合、マスター サーバーは客観的にオフラインとしてマークされます。この時点で、すべての

Sentinel

はルール ネゴシエーションに従って新しいマスター ノードを自動的に選択します。 注: 有効な PING 応答は、 PONG、-LOADING または

-MASTERDOWN

です。戻り値が上記の 3 つの応答ではない場合、または指定された時間内に PING コマンドに対する応答がない場合、Sentinel はサーバーから返された応答を無効であるとみなします ( 無効) 。 Sentinel コマンド操作

Sentinel は 1 つのサーバーだけではなく、複数のマスター ノードを監視できます。複数のマスター ノードを監視する場合は、構成ファイルで複数の sentinel Monitor master-name ip port quorum を設定するだけです。異なるマスター ノードを区別するために

master-name

を使用します。 . . 監視対象のすべてのマスター サーバーの情報をクエリする

センチネル マスター

特定のマスターの情報をクエリするノード

#sentinel master master-name

マスター ノードの IP とポートの表示

Sentinel get-master-addr-by-name master-name

スレーブ ノード情報のクエリ

sentinel レプリカ mymaster

またはsentinel slides master-name

Sentinel クラスター内の他の Sentinel 情報をクエリします

sentinel Sentinel master-name

检查可用 Sentinel 的数量

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 命令。

修改 quorum 参数

使用 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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。