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

推薦する

ポイントウォールマシンは全く効果がありません! ASO 介入が回復するまでにどれくらいの時間がかかりますか?

Xiaomaowan トライアルポイントウォールセルフサービス配信システム: e.xiaomaow...

V.PS: オランダの格安 VPS、年間 9.95 ユーロから、1G メモリ/1 コア/15g SSD/1T トラフィック

v.ps は最近、オランダのデータセンターに定期的な国際回線を備えた Nano シリーズという新しい...

オープンプラットフォームを利用してビジネスフォーラムを立ち上げる方法:ルールの設定が最も重要

「オープン性と統合による勝利」円卓フォーラム(写真はテンセントテクノロジー提供)テンセントテクノロジ...

myserverplanet - $3.4/年/256M メモリ/7g ハードディスク/500g トラフィック

myserverplanet はホスト キャットに一度だけ登場しましたが、それはつい最近のことでした...

推奨: midphase-36% オフ/VPS/7 データセンター/Xen/1g メモリ/25g SSD/3T トラフィック

UK2 グループ傘下の老舗ホスティング会社 Midphase.com (1998 年設立) は、すべ...

dwidc: 200G 高防御/CC 攻撃無視、30 元/月 - 4G メモリ/4 コア/40g データ ディスク/10M 帯域幅、299 元/月 - 2*e5-2650v2/32g メモリ/480gSSD/50M 帯域幅

大多数のネットユーザーの要望に応えて、dwidc(大王IDC)はダブルイレブン特別プロモーションを1...

エクスペリエンスレプリケーションは、企業の IT レジリエンスを向上させる方法です。

絶えず変化するビジネスの世界では、不確実性が当たり前になっています。企業が熾烈な市場競争の中で確固た...

2019年、新しいメディアには爆発的な製品が不足しています!

新年まで残り1日。今年のホットワードから今年のマーケティングイベントまで、年末を振り返る記事がネット...

モバイルインターネット2017年春レポート: 10億人以上のユーザーがいるアプリの世界について語る

本日の焦点は、2017年春のレポートです。 2016年末のレポートで、QM氏はモバイルインターネット...

独立系ブログとサードパーティブログに関する私の個人的な意見

インターネットの急速な発展により、ブログはオンライン マーケティングにおいてもはや目新しいものではな...

安いWindowsVPS-$7/1gメモリ/40g SSD/1Tトラフィック/Windows2003/2008/

cheapwindowsvps は SSDVPS.com のものです。同社は現在 Windows V...

謝文:ビッグデータの時代には、少しの砂で塔が建てられ、少しの毛皮でコートが作られる

地球上のどこで石を拾っても鉄を見つけることができます。しかし、鉄鉱石が世界中どこにでもあると言うのは...

有料リンクはランキングを素早く向上させる素晴らしい方法です

SEO に詳しい人は、外部リンクがランキングに影響を与える重要な要素であり、最も重要な要素である可能...

純粋な SSD 仮想ホストの推奨: a2hosting

2003 年に設立されたこの古いホスティング会社 a2hosting は、私たちに驚きをもたらしまし...