この記事では、Redis のマスター/スレーブ同期と Sentinel モードについて深く理解し、マスター/スレーブ同期をオンまたはオフにする方法と、Sentinel をビルドして起動する方法を紹介します。みんな!
マスター/スレーブ同期 (マスター/スレーブ レプリケーション) は、Redis
の基礎です。可用性サービスであり、複数マシンの操作における最も基本的な です。 [関連する推奨事項: Redis ビデオ チュートリアル ]
主にデータを保存するノードをマスター ノード (master
) と呼び、マスターをコピーする他のレプリカ ノードを呼びます。ノード データ 次の図に示すように、スレーブ ノード (slave
) と呼ばれます。 #マスター ノードは複数のスレーブ ノードを持つことができます
次の図に示すように、スレーブ ノードは他のサーバーのマスター ノードになることもできます
マスタ/スレーブ同期のメリット
マスタ/スレーブ同期には次の 3 つの利点があります
:パフォーマンスの側面: マスターとスレーブの同期を使用すると、
クエリ タスクをスレーブ サーバーに割り当てることができます、 マスター サーバーを使用して書き込み操作を実行できます 、これにより、プログラムの動作効率が大幅に向上します。すべての負荷が各サーバーに分散されます。
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 コマンドを実行して、スレーブ サーバーで書き込みモードを有効にすることができますが、次の点に注意する必要があります。
Redis 5.0
以前に使用されていたレプリケーション コマンドは、## の slaveof
でした。 #Redis 5.0 #Redis 5.0
以降、レプリケーション コマンドは replicaof
に変更されました。上位バージョン (Redis 5
) では、replicaof# を使用するようにしてください。 ## なぜなら
slaveof コマンドはいつでも破棄される可能性があります。
Sentinel モード
マルチマシン操作の基礎ですが、このモード自体に致命的な問題があります。ノードがクラッシュした後、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 を表し、
はマスター ノードのポートを表し、
は
Sentinel# の番号を表します。 ## マスター ノードがオフラインであることを確認しました。 Sentinel
がオフラインであると判断する限り、オフラインであることを確認できることを意味します。本当にオフラインです。
マスター ノード サーバー
Redis にパスワードがある場合、
sentinel.confsentinel 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 サーバーです。#対象となるスレーブ ノードの選出順序:
を選択します。実行時に最小の 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 サイトの他の関連記事を参照してください。