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 つの重要な考慮事項

推薦する

企業のウェブサイト受注を引き継ぐ際にSEO担当者とウェブマスターがすべきことを詳しく説明

ウェブマスター業界は今、活況を呈しています。20代の若者でも、40代の中年男性でも、誰もがインターネ...

家庭用品のフラッシュセールサイト「ワン・キングス・レーン」の歴史

3月26日、Techcrunchは本日、フラッシュセールサイトOne Kings Laneの開発経緯...

最適化は忍耐の試練です。成功まであと一歩のところで諦めないでください。

最適化には時間がかかりすぎるため、多くの友人が今では希望を失っていると思います。また、友人の上司やマ...

SalesEasy PaaS + Tencent Cloud IDaaS、特に不十分なID管理の問題に対応

アイデンティティ管理に関しては、企業は常に多くの問題を抱えています。従業員が複数のアカウントとパスワ...

1万メートルでのスカイダイビング、​​携帯電話で遊ぶ、開梱、Jiguoの新製品マーケティングが2018年のゴールデンアイ賞を受賞

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています2018年...

化粧品 B2C ウェブサイトの SEO に関する私の意見 - オフサイト

皆さんと共有した前回のオンサイト記事に続いて、私は過去数日間自分の考えを整理し、次のオフサイト記事を...

テンセントとJD.comが合併してQQオンラインショッピング事業を設立、収益が急落し商店主は集団補償を求める

少し前、テンセントがJD.comに投資したというニュースが業界関係者の間で話題になった。しかし、この...

電子商取引の専門家の視点からウェブサイトプロモーション

タオバオで働いている友人の多くは、ウェブサイトや店舗を宣伝する方法を尋ねると、いつも同じことを言いま...

企業に利益をもたらすクラウドコンピューティングの利点とは

クラウド コンピューティングは成長を続けており、中小企業に多くの機能を提供しています。クラウド コン...

おすすめ: dotster - 無制限のウェブサイトホスティングが 25% オフ / 控えめな贅沢と意味合い

dotster、このアメリカの古いコンソールブランドは、すべてのコンソールの25%オフプロモーション...

Kata Containersの創設者が安全なコンテナ技術を紹介します

1. 由来:安全容器の命名Phil Karlton は、「コンピューター サイエンスにおいて本当に難...

西周システムの観点からクラウドコンピューティング、エッジコンピューティング、AIの関係を議論する

近年のクラウドコンピューティング、エッジコンピューティング、人工知能などの技術の発展を振り返ると、ク...

4人の大学生が食べ物や飲み物を配達するウェブサイトを立ち上げました。彼らのビジネスのきっかけはTaobaoでした。

■ 江東氏(中央)と彼の仲間たちクラスメイトが寮にこもって外出をせず、それでも食べ物を注文したい場合...

APPオンラインプロモーション?チャンネルはこの8つだけです!

仕事の休憩中によく考えるのは、「アプリのプロモーションって難しいの?」ということ。実際、長い間やって...