docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装

docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装

Redis のシングルポイント パフォーマンスの制限とデータ バックアップの本質的な必要性により、Redis はマスター スレーブ レプリケーション サービスを提供します。

この記事では、docker compose によるマスター デュアル スレーブ Redis サービスの構築を記録します。

構成解析

##################################### レプリケーション #######################################

# [スレーブ] マスターへの接続設定 # slaveof 172.25.0.101 6379

# 【スレーブ】読み取り専用モード# slave-read-only yes

# 【スレーブ】パスワード# masterauth <master-password>

# [スレーブ] レプリケーション中にクエリに応答することは許可されていますか? ダーティデータが返される可能性があります。# slave-serve-stale-data yes

# [スレーブ] マスターに昇格するスレーブの優先度。これはセンチネルモードでのみ有効です。# スレーブ優先度 100

# 【スレーブ】スレーブ自身のIPをマスターに報告
# スレーブアナウンスIP 5.5.5.5

# 【スレーブ】マスターに報告されたスレーブ自身のポート# slave-announce-port 1234

# 【スレーブ】スレーブがマスターにpingを送信する間隔# repl-ping-slave-period 10

# 【マスター/スレーブ】タイムアウト# repl-timeout 60

# [マスター] ディスクレスとは、RDBファイルを最初にディスクに保存せずにソケットに直接書き込むことを意味します repl-diskless-sync no

# [マスター] ディスクレスが有効になっている場合、レプリケーションの前に指定された秒数待機し、ウィンドウ期間内により多くのクライアントが接続して並行して送信できるようにします。# repl-diskless-sync-delay 5

# [マスター] Nagleアルゴリズムを有効にするかどうか。これによりトラフィック使用量は減りますが、同期が遅くなります。repl-disable-tcp-nodelay no

# [マスター] スレーブが切断された後に完全なレプリケーションを回避するために再接続するために使用されるリングバッファログのサイズ。デフォルト値は1MBです。
# repl-バックログサイズ 1mb

# 【マスター】マスターが一定時間スレーブを切断すると、マスターはバックログをクリアします
# レプリケーションバックログTTL 3600

# [マスター] スレーブ接続数が指定数より少ない場合、マスターはすべての書き込み操作を拒否します # min-slaves-to-write 3

# [マスター] 遅延が指定された秒数を超えると、マスターはすべての書き込み操作を拒否します # min-slaves-max-lag 10

サービス構築

ディレクトリ構造

複製/
├── docker-compose.yml
├── マスター
│ ├── データ
│ └── redis.conf
├── 奴隷1
│ ├── データ
│ └── redis.conf
└── 奴隷2
    ├── データ
    └── redis.conf

ファイルを作成

操作を容易にするためにサブネットが定義されており、ポート 6371 (マスター)、6372、6373 が公開されています。

バージョン: "3"

ネットワーク:
  redis レプリケーション:
    ドライバー: ブリッジ
    ipam:
      設定:
        - サブネット: 172.25.0.0/24

サービス:
  マスター:
    画像: redis
    コンテナ名: redis-master
    ポート:
      - 「6371:6379」
    ボリューム:
      - 「./master/redis.conf:/etc/redis.conf」
      - 「./master/data:/data」
    コマンド: ["redis-server", "/etc/redis.conf"]
    再起動: 常に
    ネットワーク:
      redis レプリケーション:
        ipv4_アドレス: 172.25.0.101

  スレーブ1:
    画像: redis
    コンテナ名: redis-slave-1
    ポート:
      - 「6372:6379」
    ボリューム:
      - 「./slave1/redis.conf:/etc/redis.conf」
      - 「./slave1/data:/data」
    コマンド: ["redis-server", "/etc/redis.conf"]
    再起動: 常に
    ネットワーク:
      redis レプリケーション:
        ipv4_アドレス: 172.25.0.102

  スレーブ2:
    画像: redis
    コンテナ名: redis-slave-2
    ポート:
      - 「6373:6379」
    ボリューム:
      - 「./slave2/redis.conf:/etc/redis.conf」
      - 「./slave2/data:/data」
    コマンド: ["redis-server", "/etc/redis.conf"]
    再起動: 常に
    ネットワーク:
      redis レプリケーション:
        ipv4_アドレス: 172.25.0.103

インスタンス構成

マスター:

基本的に設定は必要ありません。最も簡単なのはポートを指定することです。

ポート 6379
保護モードなし

repl-ディスクレス同期なし
repl-disable-tcp-nodelay なし

奴隷:

サブネットが定義されており、ポートの競合がないため、インスタンス構成は一貫性を保つだけで済みます。

ポート 6379
保護モードなし

スレーブ 172.25.0.101 6379
スレーブ読み取り専用 はい
スレーブサーブ古いデータ はい

サービスを開始する

ocker-compose up -d
ドライバー「bridge」を使用してネットワーク「replication_redis-replication」を作成しています
redis-slave-1 を作成しています...完了
redis-master を作成しています...完了
redis-slave-2 を作成しています...完了

マスター ログを確認すると、2 つのスレーブからのレプリケーション要求が受け入れられたことがわかります。

1:M 2021年8月18日 15:50:31.772 * レプリカ172.25.0.102:6379が同期を要求
1:M 2021年8月18日 15:50:31.772 * レプリカ172.25.0.102:6379によって完全な再同期が要求されました
1:M 2021 年 8 月 18 日 15:50:31.772 * レプリケーション バックログが作成されました。新しいレプリケーション ID は「5d27746f14ee9be9694d794f96de6ba14a669dd1」と「0 ...」です。
1:M 2021年8月18日 15:50:31.772 * ターゲット: ディスクとのSYNCのBGSAVEを開始しています
1:M 2021年8月18日 15:50:31.773 * pid 19によってバックグラウンド保存が開始されました
19:C 2021年8月18日 15:50:31.777 * DBはディスクに保存されました
19:C 2021年8月18日 15:50:31.777 * RDB: コピーオンライトで使用されるメモリは0 MBです
1:M 2021年8月18日 15:50:31.822 * バックグラウンド保存が正常に終了しました
1:M 2021年8月18日 15:50:31.823 * レプリカ172.25.0.102:6379との同期が成功しました
1:M 2021年8月18日 15:50:32.170 * レプリカ172.25.0.103:6379が同期を要求
1:M 2021年8月18日 15:50:32.170 * レプリカ172.25.0.103:6379によって完全な再同期が要求されました
1:M 2021年8月18日 15:50:32.170 * ターゲット: ディスクとのSYNCのBGSAVEを開始しています
1:M 2021年8月18日 15:50:32.171 * pid 20によってバックグラウンド保存が開始されました
20:C 2021年8月18日 15:50:32.175 * DBはディスクに保存されました
20:C 2021年8月18日 15:50:32.175 * RDB: コピーオンライトで使用されるメモリは0 MBです
1:M 2021年8月18日 15:50:32.225 * バックグラウンド保存が正常に終了しました
1:M 2021年8月18日 15:50:32.226 * レプリカ172.25.0.103:6379との同期が成功しました

スレーブ ログをチェックして、接続確立のプロセス全体を確認します。

1:S 2021年8月18日 15:50:31.771 * MASTER 172.25.0.101:6379に接続しています
1:S 2021年8月18日 15:50:31.771 * マスター <-> レプリカ同期が開始されました
1:S 2021 年 8 月 18 日 15:50:31.771 * SYNC の非ブロッキング接続によってイベントが発生しました。
1:S 2021年8月18日 15:50:31.771 * マスターがPINGに応答しました。レプリケーションは続行できます...
1:S 2021年8月18日 15:50:31.772 * 部分的な再同期は不可能です(キャッシュされたマスターがありません)
1:S 2021年8月18日 15:50:31.773 * マスターからの完全再同期: 5d27746f14ee9be9694d794f96de6ba14a669dd1:0
1:S 2021年8月18日 15:50:31.823 * マスター <-> レプリカ同期: マスターからディスクに175バイトを受信
1:S 2021年8月18日 15:50:31.823 * マスター <-> レプリカ同期: 古いデータをフラッシュしています
1:S 2021年8月18日 15:50:31.823 * マスター <-> レプリカ同期: メモリにDBをロード中
1:S 2021年8月18日 15:50:31.828 * バージョン6.2.5で生成されたRDBをロードしています
1:S 2021年8月18日 15:50:31.828 * RDBの経過時間0秒
1:S 2021年8月18日 15:50:31.828 * 作成時のRDBメモリ使用量 1.83 Mb
1:S 2021年8月18日 15:50:31.829 * マスター <-> レプリカ同期: 正常に完了しました

テスト

マスターにログインして、新しいキーを書き込んでみてください。

127.0.0.1:6371> Hello World を設定
わかりました

スレーブにログインし、読み取りが可能かどうかを確認します。

127.0.0.1:6372> こんにちは
"世界"

スレーブは書き込み操作を試みます:

127.0.0.1:6372> hello redis を設定します
(エラー) READONLY 読み取り専用レプリカに対しては書き込むことはできません。

これで、docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装に関するこの記事は終了です。docker compose マスタースレーブレプリケーションに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker Compose によるマルチコンテナ サービスの迅速な展開の詳細な例
  • Docker Compose マルチコンテナデプロイメントの実装
  • Docker Compose を使用して ElasticSearch 構成プロセスを構築およびデプロイする

<<:  MySQLの自動増分主キーIDはこのように処理されません

>>:  div タグ内の要素の margin-top が無効である場合の解決策

推薦する

JavaScript は setTimeout を使用してカウントダウン効果を実現します

JavaScript ネイティブ コードの記述能力を高め、setTimeout() の使用を強化する...

Linux の一般的な基本コマンドと使用方法

この記事では、一般的な基本的な Linux コマンドとその使用方法を例を使って説明します。ご参考まで...

Tomcat 初回展開 Web プロジェクト プロセス図

独自のWebプロジェクトをtomcatディレクトリの下のwebappsディレクトリに配置します。 R...

IE6 の iframe の水平スクロール バーの解決策

状況は以下のとおりです: (PS: 赤いボックスは iframe 領域を表し、灰色の四角形は上記の ...

Win10+Ubuntu 20.04 LTS デュアル システム インストール (UEFI + GPT) (画像とテキスト、複数の画像には注意)

Win10 のインストール (すでにインストールされている場合はスキップしてください) win10...

Javascript 文字列メソッドの詳細な説明

目次文字列の長さ: 長さcharAt() charCodeAt()文字列に値が含まれているかどうかを...

Nginx 7層負荷分散のいくつかのスケジューリングアルゴリズムの簡単な理解

この記事は主に、Nginx 7 層負荷分散のいくつかのスケジューリング アルゴリズムを紹介します。こ...

Windows Apache 環境で SSL 証明書を展開して、Web サイトを https 対応にする方法

SSL 証明書の使用についてはここでは説明しません。SSL 証明書を導入する必要がある友人は、すでに...

MySQL 8.0.22 のインストールと設定のグラフィックチュートリアル

MySQL8.0.22のインストールと設定(超詳細)参考までに、具体的な内容は次のとおりです。みなさ...

JavaScript 以外の静的リソースのバンドルの詳細

目次1. パッケージングツールでのカスタムインポート2. ブラウザとバンドラの共通インポート構文3....

Vue でカスタムパスのエイリアスを設定する方法

Vue でカスタム パス エイリアスを設定する方法日常の開発では、モジュールやコンポーネントをインポ...

サーバー上で selenium+chromedriver を実行するための詳細なチュートリアル

1. はじめにSelenium を使用して Web サイトからデータをスクレイピングしたいのですが、...

Vue コンポーネント値転送中のデータ損失の分析と解決

序文前回の記事では、JavaScript の 2 つのデータ型、基本型と参照型、および参照型の浅いコ...

MySQL 主キー ID を生成する方法 (自己増分、一意、不規則)

目次1. uuid関数を使用して、一意かつ不規則な主キーIDを生成します。 2. idの自動成長1....

MySQL での SQL モードの表示と設定の詳細な説明

MySQL での SQL モードの表示と設定MySQL はさまざまなモードで実行でき、さまざまなシナ...