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 が無効である場合の解決策

推薦する

Docker コンテナに TensorRT をインストールする際の問題

Ubuntu にインストールされているバージョンをアンインストールします。 sudo apt-get...

Centos 6.5 での mysql-community-server. 5.7.18-1.el6 のインストール

次のコマンドを使用して、MySQL Serverがインストールされているかどうかを確認します。 [r...

vue3 watch と watchEffect の使い方と違い

1.リスナーを見る時計のご紹介 'vue' から { ref, reactive, ...

Linuxのテキスト処理コマンドsortの詳細な説明

テキストファイルの内容を並べ替える使用方法: ソート + オプション + ファイル名 (複数のファイ...

Vue3 の組み合わせ API における setup、ref、reactive の完全な使用方法

1. セットアップを始める次のコード関数を簡単に紹介します。 ref 関数を使用して変数の変更を監視...

Linux touch コマンドの使用例

Linux touch コマンドの詳細な説明: 1. コマンド機能:ファイルまたはディレクトリの作成...

Alibaba Cloud で MySQL リモート接続を構成するための詳細な手順

序文ご存知のとおり、デフォルトでは、Alibaba Cloud にインストールされている MySQL...

JavaScript でフォロー広告を実装するためのサンプルコード

フローティング広告は、ウェブサイト上で非常に一般的な広告形式です。フローティング広告は、ユーザーの閲...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

MySQLの構文、特殊記号、正規表現の詳細な説明

Mysql でよく使用される表示コマンド1. 現在のデータベース サーバー内のデータベースの一覧を表...

フォーム要素の簡単な実装コードでは登録を例に挙げています

コード実装:コードをコピーコードは次のとおりです。 <!DOCTYPE html> &l...

React Hooks の一般的な使用シナリオ (概要)

目次1. ステートフック1. 基本的な使い方2. 更新3. 合併を実現する4. 遅延初期化状態5. ...

大規模なMySQLデータベース用のマスタースレーブシステムを構築するアイデアを共有する

今週は戦争のように忙しかったです。他人に操られているような気がします。毎日朝早く出勤して夜遅く帰り、...

React Nativeでシンプルなゲームエンジンを作る

目次導入始めるReact Nativeゲームエンジンの簡単な紹介React Nativeでスネークゲ...

SSMプロジェクトは、ホットデプロイメント構成を実装するためにTomcatとMavenを使用してWARパッケージとしてデプロイされることが多い。

背景ご存知のとおり、JavaEE プロジェクトを開発した後は、そのプロジェクトをサーバーの Tomc...