Docker Composeは、マスター1台、スレーブ2台、センチネル3台を備えた高可用性Redis 7.0.4クラスターを構築し、SpringBootを統合します。

Docker Composeは、マスター1台、スレーブ2台、センチネル3台を備えた高可用性Redis 7.0.4クラスターを構築し、SpringBootを統合します。

1. はじめに

Redis はエンタープライズ レベルの開発では非常に一般的ですが、単一の Redis では安定した使用を保証できないため、クラスターを構築する必要があります。
Redis には 2 つの高可用性ソリューションがあります。

  • Redis Sentinel による高可用性
  • Redis クラスターによるスケーリング

1 つ目は、今回構築する高可用性のセンチネルです。メインの Redis がハングアップした場合、Sentinel はフェイルオーバーに投票します。 2 つ目はシャード クラスターです。 Sentinel の欠点の 1 つは、マスター ノードが 1 つしか存在できず、書き込み効率が低すぎることです。シャード化されたクラスターはセンチネル問題を解決し、水平方向に拡張して Redis のパフォーマンスを向上させることができます。

センチネルの最小数は 3 で、奇数の場合は増加します。シャード クラスターの最小構成は、マスター 3 つとスレーブ 3 つです。今回は仮想マシンを使用して構築しました。編集者がそれを構築するのに1週間かかりました。マスターとスレーブには問題はありませんでしたが、フェイルオーバーは機能しませんでした。根本的な原因は、Docker ネットワークの問題でした。 Redis と Sentinel は同じネットワーク セグメントにありませんでした。多くのチュートリアルではホストが使用されていますが、現在正常に起動できないかどうかはわかりません。そのため、ネットワーク内にある必要があります。

これは主に体験であり、知識ベースの質問が多すぎるため、公式 Web サイトにアクセスして確認できます。

Redis公式サイト

2. dockerとdocker composeのインストール

docker と docker compose のインストールと使い方 [最新バージョン]

3. Redisマスタースレーブを起動する

1. redis-sentinel-testフォルダを作成する

 mkdir redis -センチネル-テスト

2. その中に2つのフォルダを作成する

 cd redis -センチネル-テスト/
mkdir redis
mkdirセンチネル

3. RedisでComposeファイルを作成する

docker-compose.yml にちなんで名前を付ける必要があります。このテストでは、redis はディレクトリをホストにマウントしません。必要に応じて、ボリュームを使用してホストにマウントすることもできます。

 vim docker - composeyml

4. 作成ファイルを編集する

テストの便宜上、ここではパスワードは設定されていません。

protected-mode no: 無効にすると、他の場所から接続を使用できます。

slave-announce-ip: ホストマシンの IP を使用します。

バージョン: "4.1"
サービス:
マスター
イメージ: redis : 7.0.4
コンテナ名: redis -マスター
コマンド: bash -c " redis-server --protected-mode no --slave-announce-ip 192.168.84.143 --slave-announce-port 6379"
ポート:
- 6379 : 6379
スレーブ1 :
イメージ: redis : 7.0.4
コンテナ名: redis -スレーブ- 1
ポート:
- 6380 : 6379
コマンド: bash - c "redis-server --protected-mode no --slaveof redis-master 6379 --slave-announce-ip 192.168.84.143 --slave-announce-port 6380"
スレーブ2 :
イメージ: redis : 7.0.4
コンテナ名: redis -スレーブ- 2
ポート:
- 6381 : 6379
コマンド: bash - c "redis-server --protected-mode no --slaveof redis-master 6379 --slave-announce-ip 192.168.84.143 --slave-announce-port 6381"

5. Redisマスタースレーブを起動する

Compose が更新され、開始文字が - からスペースに変更されました。

 docker -作成-d

6. 重要な注意事項

起動すると、docker compose によってフォルダー名 + _default という名前のネットワークが自動的に作成されます。
sentinel の compose ファイルを作成するときは、==このデフォルト ネットワークを使用する必要があります==。そうしないと、同じネットワーク セグメントに存在せず、フェイルオーバーを切り替えることができません。 !

 dockerネットワークls

7. マスタースレーブステータスを確認する

メインの redis を入力します。

e77 はコンテナ ID です:

 docker exec -it e77 / bin / bash
redis - CLI

ステータス情報を表示します:

情報

8. マスターとスレーブをテストする

4. 3人のセンチネルを起動する

1. センチネルフォルダに切り替える

 CD ..
cdセンチネル/

2. sentinel.confファイルを作成する

公式ウェブサイトにアクセスして、最小限の構成ファイルを見つけましょう。

Redis 公式サイト

これらは 2 つのインスタンスですが、必要なのは 1 つだけなので、最初の 4 行だけが必要です。

保護モードなし
センチネルモニターマイマスター192.168 .84 .143 6379 2
センチネルダウン--ミリ秒mymaster 60000
センチネルフェイルオーバー-タイムアウトmymaster 180000
センチネルパラレル-同期mymaster 1

最初の行: Redis は、自由に書き込むことができる mymaster という名前の Redis クラスターを監視します。以下は IP アドレスです。これはホスト マシンの IP アドレスにすることができ、ポートはマスター Redis のポートになります。 2はセンチネルの投票数です。マスター Redis がダウンすると、3 つの Sentinel のうち 2 つによって投票される Redis がマスターになります。 !
2 行目: インスタンスが主観的なオフライン状態に入ったことを Sentinel が判断するのに必要な時間 (ミリ秒単位)。
3 行目: 指定された時間内にフェイルオーバーが完了しない場合、タスク フェイルオーバーは失敗します。
4 行目: フェイルオーバー後に同時に新しいプライマリ ノードへのレプリケーション操作を開始するノードの数を制限します。制限が大きくなるほど、効率は低下します。

sentinel1.conf ファイルを作成し、上記の 4 行を貼り付けます。

 vimセンチネル1会議

変更せずに 2 つのコピーを作成します。

センチネル1をcpしますconf sentinel2会議
センチネル1をcpしますconf sentinel3会議

3. コンポーズファイルを書き込む

バージョン: "4.2"
サービス:
センチネル1 :
イメージ: redis : 7.0.4
コンテナ名: redis - sentinel - 1
ポート:
- 26379 : 26379
コマンド: redis - sentinel /usr/local/etc/redis/sentinel.conf
巻数:
- / mydata / redis - sentinel - test / sentinel / sentinel1conf : / usr / local / etc / redis / sentinel会議
センチネル2 :
イメージ: redis : 7.0.4
コンテナ名: redis - sentinel - 2
ポート:
- 26380 : 26379
コマンド: redis - sentinel /usr/local/etc/redis/sentinel.conf
巻数:
- / mydata / redis - sentinel - test / sentinel / sentinel2conf : / usr / local / etc / redis / sentinel会議
センチネル3 :
イメージ: redis : 7.0.4
コンテナ名: redis - sentinel - 3
ポート:
- 26381 : 26379
コマンド: redis - sentinel /usr/local/etc/redis/sentinel.conf
巻数:
- / mydata / redis - sentinel - test / sentinel / sentinel3conf : / usr / local / etc / redis / sentinel会議
ネットワーク:
デフォルト
名前: redis_default
外部: true

ネットワーク: これは上で述べたことと一致します。フェイルオーバーを完了するには、Sentinel と Redis が同じネットワーク内にある必要があります。

4. ファイルツリーを表示する

そうでない場合は、インストールできます:

 yum -y ツリーをインストール

5. Sentinelを起動する

 docker-compose を起動 -d

6. センチネル情報を表示する

センチネル コンテナに入ります:

 docker exec -it c8 /bin/bash

Sentinel に接続:

 redis - cli - p 26379
情報

==マスター 1 名、スレーブ 2 名、センチネル 3 名が完成==

7. フェイルオーバーテスト

マスターを停止します:

ドッカー停止e77

8. フェイルオーバーログ

 docker -ログを作成-f

9. センチネルのステータスを確認する

この時点で、マスターノードは自動的にポート 6381 に切り替わります。

10. `6379` サービスを再起動する

 docker を再起動 e77

新しく追加された 6379 がスレーブ ノードとしてマスター ノードに参加することがわかりました。

5. SpringBootを統合する

1. 依存関係をインポートする

エディターの Springboot バージョンは 2.3.7.RELEASE です。

 <依存関係>
<グループID> org.springframework.boot </グループID>
<artifactId> spring - boot - starter - data - redis </artifactId>
</依存関係>
<依存関係>
<グループID> org.springframework.boot </グループID>
<artifactId>スプリング-ブート-スターター-ウェブ</artifactId>
</依存関係>

2. yml設定

サーバー:
ポート: 8084

レディス:
センチネル:
# sentinel.conf内のクラスター名
マスター: mymaster
#Sentinelに接続するだけで、Sentinelがredisを見つけるのに役立ちます
ノード:
- 192.168 .84 .143 : 26379
- 192.168 .84 .143 : 26380
- 192.168 .84 .143 : 26381

3. JSONシリアル化構成

 /**
* @author 王振君
* @日付 2022/8/18 16:37
*/
@構成
パブリッククラスRedisConfig {

@ビーン
@SuppressWarnings (= { "未チェック""rawtypes" })
パブリックRedisTemplate < ObjectObject > redisTemplate ( RedisConnectionFactory接続ファクトリー)
{
RedisTemplate <オブジェクトオブジェクト>テンプレート=新しいRedisTemplate <> ();
テンプレート.setConnectionFactory (接続ファクトリー);
Jackson2JsonRedisSerializerシリアライザー= new Jackson2JsonRedisSerializer ( Object . class );

// StringRedisSerializer を使用して Redis キー値をシリアル化およびデシリアル化します
テンプレート.setKeySerializer (新しいStringRedisSerializer ());
テンプレート.setValueSerializer (シリアライザー);

// ハッシュキーもStringRedisSerializerを使用してシリアル化されます
テンプレート.setHashKeySerializer (新しいStringRedisSerializer ());
テンプレート.setHashValueSerializer (シリアライザー);

テンプレート.afterPropertiesSet ();
戻りテンプレート;
}
}

4. 新しいコントローラーテストを作成する

 /**
* @author 王振君
* @日付 2022/8/18 17:48
*/
@レストコントローラ
パブリッククラスTestController {

オートワイヤード
プライベートRedisTemplate redisTemplate ;

@GetMapping ( "/テスト" )
パブリックボイドsaveRedis (){
redisテンプレートopsForValue () です。 set ( "name" , "私に会えば成功するでしょう" );
}

5. プロジェクト構造

6. テスト

7. Redisに値があるかどうかを確認する

VI.結論

編集者は1週間の作業を経て、ついにそれを完成させました。一番の問題はネットワークの問題でしたが、ついに解決しました! !私はたくさんのビデオやチュートリアルを見てきましたが、その中にはあまりにも漠然としたものもあったので、後から来る人たちの役に立てればと思い、ピットフリーバージョンを 1 日かけて作成しました。 !

<<:  G-Bank のクラウドネイティブ ビジネス レジリエンスの探求と実践

>>:  2023 年のマルチクラウドに関する 4 つの重要な考慮事項

推薦する

ユーザーの思考を分析し、優れたブランドマーケティングを行うにはどうすればよいでしょうか?

これまで、誰もがトラフィックの考え方について語ってきました。オンラインとオフラインの両方でトラフィッ...

VMware は仮想化を加速するために SmartNIC をサポートしています

ネットワーク インターフェイス カードは広く普及しているテクノロジですが、SmartNIC は比較的...

ゲーム情報フロー広告のクリック率を上げるには?

ゲームの広告はなぜこんなにも混乱しているのでしょうか? 01パソコン上で最も人気のある広告は、かつて...

ElasticSearch が高速なのはなぜですか?その理由はご存知ですか?

ElasticSearchとは何か、なぜESを使うべきなのかオープンソースの分散検索および分析エンジ...

ウェブマスターが知っておくべき360度の包括的な検索知識

360総合検索は、前回の3Bサイト事件以降、沈静化しているようで、大きなニュースは漏れていません。3...

プロモーションメールを書くためのヒントとコツ

前回のメールプロモーションの後、私はある程度の成功を収めました。私の努力は報われました。プロモーショ...

中秋節ブランドマーケティング企画プログラム!

一般人にとって、中秋節は家族が集まる良い日ですが、マーケティング担当者にとっては頭を悩ませ、頭がゾク...

インターネット広告は衰退している

業界が低迷しているとき、私たちは皆、デビッド・オグルビーの有名な言葉を何度も繰り返して考えます。「広...

共同購入は過去のものとなりました。共同購入ウェブサイトの運営の難しさを知っている人はどれくらいいるでしょうか?

共同購入は過去のものなのでしょうか?百連隊作戦を経験し、百連隊勝利の興奮を目にしたにもかかわらず、共...

SEO業界の倫理規定についても

SEO 業界は規制される必要がありますか?はい、しかし規範は道徳から来るものではありません。倫理を利...

godaddy 9月 4.95ドル割引コード登録com

今月中旬、Godaddyは社内従業員の操作ミスによりサーバートラブルが発生し、多数のウェブサイトに影...

専用マインド - 年間 8.49 ドル / 128 MB メモリ / 12 GB ハード ドライブ / 300 GB トラフィック / G ポート

毎年恒例のハロウィーンまであと 3 日です。この期間中はプロモーションが欠かせません。VPS 販売業...

rectified はどのように機能しますか? rectified.net VPS レビュー、KVM、無制限帯域幅 VPS

先日、「良い x: 修正済み - 年間支払い $12/KVM/1000M ポート/無制限トラフィック...

Namecheap-新しいサーバー/E3-1240v3/最低99ドル/フェニックス

今日、Namecheap がサーバー サービスを全面的に更新したというニュースを受け取りました。最低...