web-dev-qa-db-ja.com

Redis:読み取り専用スレーブvsフェイルオーバースレーブ?

私はRedisネットワーク構成に関する多くのドキュメントを読んでいますが、私が持っていたアーキテクチャメンタルモデルの要件が現在のオプションに対応していないように見えるので混乱しています。

まず、スケーラビリティは現在のところ問題ではないので、シャーディングは必要ありません。したがって、現時点では1つのマスター(ノードM)です。

2番目:冗長性が必要です。つまり、マスターノードに障害が発生した場合、2番目のノードが引き継ぎ、クライアントが送信している要求を実行します。これを最初のスレーブと呼びましょう。フェイルオーバースレーブ(ノードFS)です。

3つ目:別のレプリカノードも必要です。それはスレーブですが、読み取り専用クエリのみを処理します。クライアントがクライアントに接続し、クライアントがデータを変更しようとすると、ノードはエラーを返すはずです。これを2番目のスレーブと呼びましょう。読み取り専用スレーブ(RS)です。

最後:読み取り専用スレーブのフェイルオーバーが必要です。つまり、RSが停止した場合、別の読み取り専用スレーブがそのタスクを引き継ぐことを望みます。これを4番目のスレーブと呼びます。フェイルオーバー読み取り専用スレーブ(FRS)です。

このようにRedisを構成する方法はありますか?すべての展開モード(この記事を読んでいた: https://blog.octo.com/en/what-redis-deployment-do-you-need/ )には、クラスターマスター以外の単一マスターがあるようです。今、私の「FS」ノードは書き込みクエリを受け入れるため、2番目のマスターになるようですが、クラスター構成はデフォルトで有効になっているシャーディングであり、何かを欠落していない限り、それを無効にする通常の方法がないようです。

5
knocte

私が理解していることから、redis歩哨はあなたのニーズを満たします。

1つのマスター(M)と3つのスレーブ(FS、RS、FRS)があります。各スレーブは同じマスターに接続されています。

次に、マスターを監視する奇数の番兵プロセスをデプロイします。マスターに障害が発生した場合、歩哨は3つのスレーブの1つを新しいマスターに昇格させます。

ここで、メモから、「FS」スレーブを新しいマスターにしたいとします。 Sentinelは「FS」が特別であることを知りません。3つのスレーブのいずれかを新しいマスターの候補として選択できます。 「FS」を特別なものにするには、スレーブごとに「レプリカ優先順位」を設定する必要があります。 "RS"と "FRS"がマスターになることを望まない場合は、両方のノードのreplica-priority = 0を設定してください。次に、センチネルは、フェイルオーバーを行うときのみ「FS」を考慮します。

あなたの質問の他の部分-「RS」が死ぬとどうなりますか?スレーブ用のフェイルオーバーメカニズムはありません-不要なだけです。 「RS」と「FRS」は、2つの読み取りレプリカであり、どちらも同じマスターを指しています。クライアントは、2つのレプリカのいずれかをランダムに試行するように構成する必要があります。そのため、負荷を分散します。 「RS」が死んだ場合、クライアントは単に「FRS」を試行します。読み取り専用であるため、データの整合性は重要ではありません。


RSおよびFRSの場合-追加のプロパティreplica-read-only yesを設定します。これにより、書き込みが確実に失敗します。

必要に応じて、非センチネルセットアップを使用できます。その場合、MからFS=へのフェイルオーバーは自動的には行われません。マスターMがダウンした場合、a)検出する必要があります。b)マークFS as slaveof none、c)すべてのredisクライアントが新しいマスターへの書き込みを開始することを確認し、d)新しいマスターのフォローを開始するようにRSとFRSを再構成します。 Sentinelはそれを自動的に行いますが、複雑さが増しています。手動でも簡単に手動で行うことができます。

2