MySQLクラスタのDockerデプロイメントの実装

MySQLクラスタのDockerデプロイメントの実装

シングルノードデータベースの欠点

  • 大規模なインターネットプログラムはユーザーベースが大きいため、アーキテクチャを特別に設計する必要がある。
  • 単一ノードのデータベースではパフォーマンス要件を満たすことができない
  • 単一ノード データベースには冗長設計がないため、高可用性の要件を満たすことができません。

単一ノードの MySQL パフォーマンスのボトルネック

2016年春節のWeChat紅包の取引量は膨大で、データベースに大きな負荷がかかった

一般的なMySQLクラスタソリューション

MySQL クラスター ソリューションを導入する場合、弱い一貫性は問題を引き起こすため、PXC を使用することをお勧めします。たとえば、ノード A のデータベースでは購入が成功したことが示されていますが、ノード B のデータベースでは成功しなかったことが示されています。これは面倒です。PXC ソリューションでは、すべてのノードが正常に書き込まれた後にのみ成功が通知されます。読み取りと書き込みが可能な双方向同期ですが、レプリケーションは単方向です。異なるノードのデータベース間では、通信用にポートが開いています。ファイアウォールからのこのポートが閉じられていると、PXC は正常に同期されず、成功を返しません。

レプリケーション

  • 高速ですが、弱い一貫性しか保証できません。ログ、投稿、ニュースなど、価値の低いデータを保存するのに適しています。
  • マスタースレーブ構造では、マスターに書き込まれたデータはスレーブに同期され、スレーブから読み取ることができますが、スレーブに書き込まれたデータはマスターに同期できません。
  • 非同期レプリケーションでは、書き込みが成功した場合、マスターはクライアントに成功を返しますが、スレーブの同期が失敗し、スレーブからの読み取りができなくなる可能性があります。

PXC (Percona XtraDB クラスター)

  • 速度は遅いですが、強力な一貫性を確保できます。注文、顧客、支払いなどの価値の高いデータを保存するのに適しています。
  • データ同期は双方向です。任意のノードにデータを書き込むと、他のすべてのノードに同期され、任意のノードで同時にデータの読み取りと書き込みを行うことができます。
  • 同期レプリケーションでは、任意のノードにデータを書き込むときに、すべてのノードが正常に同期された後にのみ、クライアントに成功が返されます。トランザクションは、すべてのノードで同時にコミットされるか、コミットされません。

PXCではPerconaServer(パフォーマンスが大幅に向上したMySQLの改良版)の使用が推奨されます。

PXCの強力なデータ一貫性

同期レプリケーションでは、トランザクションはすべてのクラスター ノードで同時に送信されるか、送信されません。レプリケーションでは非同期レプリケーションが使用されるため、データの一貫性は保証されません。

PXC クラスタのインストールの概要

Docker リポジトリの PXC 公式イメージを使用して、PXC クラスターを Docker にインストールします: https://hub.docker.com/r/percona/percona-xtradb-cluster

1. 公式 Docker リポジトリから PXC イメージをダウンロードします。

docker pull percona/percona-xtradb-cluster

またはローカルにインストールする

docker ロード < /home/soft/pxc.tar.gz

インストール完了:

[root@localhost ~]# docker pull percona/percona-xtradb-cluster
デフォルトタグの使用: 最新
リポジトリ docker.io/percona/percona-xtradb-cluster をプルしようとしています... 
最新: docker.io/percona/percona-xtradb-cluster からプル
ff144d3c0ab1: プル完了 
eafdff1524b5: プルが完了しました 
c281665399a2: プル完了 
c27d896755b2: プルが完了しました 
c43c51f1cccf: プル完了 
6eb96f41c54d: プル完了 
4966940ec632: プル完了 
2bafadcea292: プル完了 
3c2c0e21b695: プル完了 
52a8c2e9228e: プル完了 
f3f28eb1ce04: プル完了 
d301ece75f56: プル完了 
3d24904bec3c: プル完了 
1053c2982c37: プル完了 
ダイジェスト: sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd
ステータス: docker.io/percona/percona-xtradb-cluster:latest の新しいイメージをダウンロードしました
[root@localhost ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
docker.io/percona/percona-xtradb-cluster 最新 70b3670450ef 2 か月前 408 MB

2. 画像の名前を変更します: (名前が長すぎる場合は、名前を変更してください)

docker タグ percona/percona-xtradb-cluster:latest pxc

その後、元の画像を削除できます

[root@localhost ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
docker.io/percona/percona-xtradb-cluster 最新 70b3670450ef 2 か月前 408 MB
pxc 最新 70b3670450ef 2か月前 408 MB
docker.io/java 最新 d23bdf5b1b1b 2年前 643 MB
[root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster
タグなし: docker.io/percona/percona-xtradb-cluster:latest
タグなし: docker.io/percona/percona-xtradb-cluster@sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bd
[root@localhost ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
pxc 最新 70b3670450ef 2か月前 408 MB
docker.io/java 最新 d23bdf5b1b1b 2年前 643 MB

3. セキュリティ上の理由から、PXCクラスタ用のDocker内部ネットワークを作成します。

# ネットワークセグメントを作成する docker network create --subnet=172.18.0.0/24 net1
# ネットワークセグメントを表示する docker network inspect net1
# ネットワークセグメントを削除します# docker network rm net1

4. Dockerボリュームを作成します。
Docker を使用する場合、ビジネス データは、コンテナーから独立して保存できるように、ディレクトリ マッピングを使用してホスト マシンに保存する必要があります。しかし、コンテナ内のPXCはマッピングディレクトリを直接使用することはできません。解決策は、Dockerボリュームを使用してマッピングすることです。

# v1 という名前のデータボリュームを作成します。--name は省略できます。docker volume create --name v1

データ量を表示

ドッカー検査v1

結果:

[root@localhost ~]# dockerinspectv1
[
  {
    "ドライバー": "ローカル",
    「ラベル」: {},
    "マウントポイント": "/var/lib/docker/volumes/v1/_data",#これはホストマシン上の保存場所です"名前": "v1",
    「オプション」: {},
    「スコープ」: 「ローカル」
  }
]

データボリュームの削除

docker ボリューム rm v1

5つのデータボリュームを作成する

# 5 つのデータボリュームを作成する docker volume create --name v1
docker ボリューム作成 --name v2
docker ボリューム作成 --name v3
docker ボリューム作成 --name v4
docker ボリューム作成 --name v5

5. 5つのPXCコンテナを作成します。

# クラスターを形成するために 5 つの PXC コンテナを作成します # 最初のノード docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --name=node1 --network=net1 --ip 172.18.0.2 pxc
# 最初のノードが起動したら、MySQL が起動するまでしばらく待ちます。

# 2 番目のノード docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --name=node2 --net=net1 --ip 172.18.0.3 pxc
# 3 番目のノード docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --name=node3 --net=net1 --ip 172.18.0.4 pxc
# 4 番目のノード docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --name=node4 --net=net1 --ip 172.18.0.5 pxc
# 5 番目のノード docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --name=node5 --net=net1 --ip 172.18.0.6 pxc

チェック:

[root@localhost ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
f4708ce32209 pxc "/entrypoint.sh " 約 1 分前 アップ 約 1 分 4567-4568/tcp, 0.0.0.0:3309->3306/tcp node4
bf612f9586bc pxc "/entrypoint.sh " 17 分前 17 分前にアップ 4567-4568/tcp、0.0.0.0:3310->3306/tcp node5
9fdde5e6becd pxc "/entrypoint.sh " 17 分前 17 分前に起動 4567-4568/tcp、0.0.0.0:3308->3306/tcp node3
edd5794175b6 pxc "/entrypoint.sh " 18 分前 18 分前に起動 4567-4568/tcp、0.0.0.0:3307->3306/tcp node2
33d842de7f42 pxc "/entrypoint.sh " 21 分前 21 分前にアップ 0.0.0.0:3306->3306/tcp、4567-4568/tcp node1

データベース負荷分散の必要性

クラスターは構築されていますが、データベースの負荷分散は使用されていません。単一のノードがすべてのリクエストを処理するため、負荷が高くなり、パフォーマンスが低下します。

クラスター内のすべてのノードにリクエストを均等に送信します。

  • すべてのリクエストは単一のノードに送信され、そのノードは過負荷になってパフォーマンスが低下し、他のノードはアイドル状態になります。
  • 負荷分散に Haproxy を使用すると、単一ノードの負荷が低くなり、パフォーマンスが向上し、各ノードにリクエストを均等に送信できます。

負荷分散ミドルウェアの比較

負荷分散には、まずデータベース クラスターが関係します。5 つのクラスターが追加され、各リクエストが最初のクラスターに送信される場合は、最初のデータベースが失敗する可能性があります。したがって、よりよい解決策は、異なるノードにリクエストを送信することです。これには、転送用のミドルウェアが必要です。よりよいミドルウェアには、nginx と haproxy があります。nginx はプラグインをサポートしていますが、tcp/ip プロトコルしかサポートしていません。haproxy は、古いミドルウェア転送ソフトウェアです。 haproxy を使用する場合は、公式 Web サイトからイメージをダウンロードし、イメージを設定できます (このイメージには設定ファイルがないため、設定ファイルを自分で記述します。設定後、イメージを実行するときにフォルダーをマップします。設定ファイルは 3306 (データベース要求を開き、ハートビート検出のチェックに基づいてさまざまなデータベースにアクセスし、8888 はデータベース クラスターを監視します))。構成ファイルでは、ユーザー (ユーザーはデータベースでハートビート検出を実行し、どのデータベース ノードがアイドル状態であるかを判断し、アイドル状態のノードにアクセスします)、さまざまなアルゴリズム (ラウンドロビン トレーニングなど)、最大接続数、時間など、およびクラスター監視を設定します。設定ファイルが書き込まれたら、イメージを実行します。イメージが正常に実行されたら、コンテナの起動設定ファイルを入力します。実際、haprocy はデータベース インスタンスも返します (ただし、データは保存されず、リクエストを転送するだけです)。これは他のノードをチェックするために使用されます。

Haproxyをインストールする

1. Docker リポジトリから haproxy イメージを取得します: https://hub.docker.com/_/haproxy

docker プル haproxy
[root@localhost ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
docker.io/haproxy 最新 11fa4d7ff427 11日前 72.2 MB

2. Haproxy 構成ファイルを作成します。 Haproxy コンテナで使用する場合 (Docker では構成ファイルは生成されないため、ホスト マシンで構成ファイルを自分で作成する必要があります)
設定ファイルの詳細については、https://www.cnblogs.com/wyt007/p/10829184.html を参照してください。

# コンテナを起動するときにディレクトリマッピング技術を使用して、コンテナが設定ファイル touch /home/soft/haproxy/haproxy.cfg を読み取れるようにします。

ハプロキシ.cfg

# haproxy.cfg
グローバル
  #作業ディレクトリ chroot /usr/local/etc/haproxy
  #ログファイル、rsyslogサービス内のlocal5ログデバイス(/var/log/local5)を使用、レベル情報
  ログ 127.0.0.1 local5 情報
  #デーモンプロセス実行中のデーモン

デフォルト
  ロググローバル
  モード http
  #ログフォーマットオプション httplog
  # ロードバランシングのハートビート検出記録をログに記録しないオプション dontlognull
  #接続タイムアウト(ミリ秒)
  タイムアウト接続5000
  #クライアントタイムアウト(ミリ秒)
  タイムアウトクライアント 50000
  #サーバーのタイムアウト(ミリ秒)
  タイムアウトサーバー50000

#監視インターフェース listen admin_stats
  #監視インターフェースアクセス IP とポートバインド 0.0.0.0:8888
  #アクセスプロトコルモード http
  #URI 相対アドレス 統計 uri /dbs
  #統計レポート formatstats realm グローバル\統計
  #ログインアカウント情報統計認証管理者:abc123456
#データベース負荷分散 listen proxy-mysql
  #アクセスIPとポートバインド0.0.0.0:3306 
  #ネットワークプロトコルモード tcp
  #負荷分散アルゴリズム(ラウンドロビンアルゴリズム)
  # ポーリングアルゴリズム: ラウンドロビン
  #重み付けアルゴリズム: static-rr
  # 最小接続アルゴリズム: leastconn
  #リクエスト元IPアルゴリズム: ソース 
  バランスラウンドロビン
  #ログフォーマットオプション tcplog
  #MySQL に権限のない haproxy ユーザーを作成し、パスワードを空に設定します。 Haproxyはこのアカウントを使用してMySQLデータベースオプションmysql-check user haproxyでハートビート検出を実行します
  サーバー MySQL_1 172.18.0.2:3306 チェックウェイト 1 maxconn 2000 
  サーバー MySQL_2 172.18.0.3:3306 チェックウェイト 1 maxconn 2000 
  サーバー MySQL_3 172.18.0.4:3306 チェックウェイト 1 maxconn 2000 
  サーバー MySQL_4 172.18.0.5:3306 チェックウェイト 1 maxconn 2000
  サーバー MySQL_5 172.18.0.6:3306 チェックウェイト 1 maxconn 2000
  #キープアライブを使用してデッドリンクを検出するオプション tcpka

3. データベース クラスターに空のパスワードと権限のないユーザー haproxy を作成し、Haproxy が MySQL データベースでハートビート検出を実行できるようにします。

'' で識別されるユーザー 'haproxy'@'%' を作成します。

4. Haproxy コンテナを作成する (高可用性のため、name=h1)

# ここで --privileged を追加する必要があります
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --net=net1 --ip 172.18.0.7 --privileged haproxy

5. コンテナに入る

docker exec -it h1 bash

6. コンテナbashでHaproxyを起動する

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

次に、ブラウザで Haproxy 監視インターフェースを開きます。ポートは 4001 で、ユーザー名は admin、パスワードは abc123456 が構成ファイルに定義されています。
http://192.168.63.144:4001/dbs にアクセスし、ユーザー名とパスワードでログインする必要がありました (余談ですが、私は基本ログインを使用しましたが、何らかの理由で Chrome がブロックされたため、Firefox を使用することになりました)

この時点で、Dockerノードを手動でハングアップして変更を確認します(ハングアップとして表示されていることがわかります)

8. Haproxy はデータを保存せず、データを転送するだけです。データベースでHaproxy接続を確立できます。ポート4002、ユーザー名とパスワードはデータベースクラスターのユーザー名とパスワードです。

デュアルマシンホットスタンバイを使用する理由

シングルノードのHaproxyは高可用性を持たず、冗長設計が必要です。

デュアル マシンとは、2 つの haproxy などの 2 つの要求処理プログラムを意味します。1 つに障害が発生した場合、もう一方が処理を引き継ぎます。ホットスタンバイはキープアライブとして理解しています。 haproxy コンテナに keepalive をインストールします。

仮想IPアドレス

Linux システムでは、1 つのネットワーク カードに複数の IP アドレスを定義し、これらのアドレスを複数のアプリケーションに割り当てることができます。これらのアドレスは仮想 IP です。Haproxy のデュアル マシン ホット スタンバイ ソリューションの最も重要なテクノロジは仮想 IP です。

鍵となるのは仮想IPです。仮想IPを定義し、2つのhaproxyサーバーにそれぞれkeepaliveイメージをインストールします。haproxyはUbuntuシステム上にあるため、インストールにはapt-getを使用します。keepaliveの機能は仮想IPを奪取することです。奪取された方がプライマリサーバー、奪取されていない方がバックアップサーバーです。次に、2つのkeepaliveサーバーはハートビート検出を実行します(つまり、相手がまだ生きているかどうかをテストするためのユーザーを作成します。MySQLクラスター間でもハートビート検出があります)。ハングアップすると、IPが奪取されます。したがって、キープアライブを開始する前に、まずその構成ファイル、プリエンプト方法、重み、仮想 IP、作成されたユーザーが送信する内容を編集する必要があります。設定と起動後、pingを実行して正しいかどうかを確認し、仮想IPをLAN IPにマッピングします。

Keepalivedを使用してホットスタンバイを実装する

  • 仮想IPを定義する
  • Dockerで2つのHaproxyコンテナを起動し、各コンテナにKeepalivedプログラム(以下、KA)をインストールします。
  • 2 つの KA が仮想 IP をめぐって競合します。一方が仮想 IP を取得すると、もう一方は待機します。仮想 IP を取得した KA がプライマリ サーバーになり、取得できなかった KA がバックアップ サーバーになります。
  • 2 つの KA 間でハートビート検出が実行されます。バックアップ サーバーがプライマリ サーバーからハートビート応答を受信しない場合は、プライマリ サーバーに障害が発生したことを意味します。その後、バックアップ サーバーは仮想 IP を競合して動作を継続できます。
  • データベース要求を仮想 IP に送信します。1 つの Haproxy に障害が発生した場合、別の Haproxy が引き継ぐことができます。

プロキシデュアルマシンホットスタンバイソリューション

Docker で 2 つの Haproxy を作成し、Keepalived を介して Docker の仮想 IP を取得します。

Docker の仮想 IP は外部ネットワークからアクセスできないため、ホストの Keepalived を使用して、外部ネットワークからアクセスできる仮想 IP にマッピングする必要があります。

Keepalivedをインストールする

1. Haproxy コンテナに入り、Keepalived をインストールします。

$ docker exec -it h1 bash
apt-getアップデート
apt-get をインストールしてkeepalived

2. Keepalived 設定ファイル (Keepalived.conf):
Keepalivedの設定ファイルは/etc/keepalived/keepalived.confです。

# vim /etc/keepalived/keepalived.conf
vrrp_インスタンス VI_1 {
  state MASTER # Keepalived の ID (MASTER サービスは IP を取得する必要があり、BACKUP サーバーは IP を取得しません)。
  interface eth0 # 仮想 IP が配置されている Docker ネットワーク カード デバイス virtual_router_id 51 # 仮想ルーティング識別子。MASTER と BACKUP の仮想ルーティング識別子は一致している必要があります。 0から255まで
  priority 100 # MASTER は BACKUP よりも高い重みを持ちます。数値が大きいほど、優先度が高くなります。advert_int 1 # MASTER ノードと BACKUP ノード間の同期チェックの時間間隔 (秒単位) は、マスターとバックアップ間で一貫している必要があります。authentication { # マスター スレーブ サーバー認証方法。マスターとスレーブは正常に通信するために同じパスワードを使用する必要があります。 auth_type PASS
    認証パスワード 123456
  }
  virtual_ipaddress { #仮想IP。複数の仮想IPアドレスを設定できます。1行につき172.18.0.201です。
  }
}

3. Keepalivedを起動する

サービスkeepalived開始

起動に成功したら、ip a を使用して、ネットワーク カードの仮想 IP が成功しているかどうかを確認できます。また、ホスト マシンの仮想 IP 172.18.0.201 に正常に ping を実行できます。

4. 上記の手順に従って、別の Haproxy コンテナを作成できます。マップされたホスト ポートは繰り返すことができず、Haproxy 構成は同じであることに注意してください。次に、コンテナに Keepalived をインストールします。構成は基本的に同じです (優先度の重みを変更できます)。このようにして、Haproxy デュアルマシン ホット スタンバイ ソリューションが基本的に実装されます。コマンドは次のとおりです。

Haproxy コンテナを作成します (高可用性のため、name=h2)

# ここで --privileged を追加する必要があります
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --net=net1 --ip 172.18.0.8 --privileged haproxy

コンテナに入る

docker exec -it h2 bash

コンテナbashでHaproxyを起動する

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

次に、ブラウザで Haproxy 監視インターフェースを開きます。ポートは 4003 で、ユーザー名は admin、パスワードは abc123456 が構成ファイルに定義されています。
http://192.168.63.144:4003/dbs にアクセスし、ユーザー名とパスワードでログインする必要がありました (余談ですが、私は基本ログインを使用しましたが、何らかの理由で Chrome がブロックされたため、Firefox を使用することになりました)

Keepalived をインストールします。

apt-getアップデート
apt-get で keepalived をインストール

Keepalived 構成ファイル (Keepalived.conf):
Keepalivedの設定ファイルは/etc/keepalived/keepalived.confです。

# vim /etc/keepalived/keepalived.conf
vrrp_インスタンス VI_1 {
  state MASTER # Keepalived の ID (MASTER サービスは IP を取得する必要があり、BACKUP サーバーは IP を取得しません)。
  interface eth0 # 仮想 IP が配置されている Docker ネットワーク カード デバイス virtual_router_id 51 # 仮想ルーティング識別子。MASTER と BACKUP の仮想ルーティング識別子は一致している必要があります。 0から255まで
  priority 100 # MASTER は BACKUP よりも高い重みを持ちます。数値が大きいほど、優先度が高くなります。advert_int 1 # MASTER ノードと BACKUP ノード間の同期チェックの時間間隔 (秒単位) は、マスターとバックアップ間で一貫している必要があります。authentication { # マスター スレーブ サーバー認証方法。マスターとスレーブは正常に通信するために同じパスワードを使用する必要があります。 auth_type PASS
    認証パスワード 123456
  }
  virtual_ipaddress { #仮想IP。複数の仮想IPアドレスを設定できます。1行につき172.18.0.201です。
  }
}

Keepalived を起動する

サービスkeepalived開始

起動に成功したら、ip a を使用して、ネットワーク カードの仮想 IP が成功しているかどうかを確認できます。また、ホスト マシンの仮想 IP 172.18.0.201 に正常に ping を実行できます。

仮想IPへの外部ネットワークアクセスの実装

現在の LAN IP 割り当てを表示します。

yum インストール nmap -y
nmap -sP 192.168.1.0/24

ホストにKeepalivedをインストールする

yum インストール keepalived

ホストの Keepalived 構成は次のとおりです (/etc/keepalived/keepalived.conf)。

vrrp_インスタンス VI_1 {
  状態マスター
#これはホストのネットワーク カードです。ip a を使用して、コンピューターで現在使用されているネットワーク カードがどのインターフェイス ens33 であるかを確認できます。
  仮想ルータID 100
  優先度100
  広告_int 1
  認証
    認証タイプ PASS
    認証パスワード 1111
  }
  仮想IPアドレス{
#これは指定されたホスト マシン上の仮想 IP アドレスです。ホスト マシンのネットワーク カードと同じネットワーク セグメント内にある必要があります。
#ホストネットワークカードのIPは192.168.63.144なので、指定された仮想IPは160です
      192.168.63.160
  }
}
 
#データソースを監視するためのポートを受け入れます。Webページの入り口ではvirtual_server 192.168.63.160 8888 {を使用します。
  遅延ループ 3
  lb_algo rr 
  lb_kind NAT
  持続タイムアウト 50
  プロトコル TCP
#受信したデータをdockerサービスのネットワークセグメントとポートに転送します。dockerサービスに送信するため、データはdockerサービスデータと一致している必要があります real_server 172.18.0.201 8888 {
    重量 1
  }
}
 
#データベースデータポートを受け入れます。ホストデータベースポートは 3306 なので、これもホストデータ受け入れポートと一致している必要があります。virtual_server 192.168.63.160 3306 {
  遅延ループ 3
  lb_algo rr 
  lb_kind NAT
  持続タイムアウト 50
  プロトコル TCP
#同様に、サービスに転送されるデータベースのポートとIPアドレスは、dockerサービスreal_server 172.18.0.201 3306 {のデータと一致している必要があります。
    重量 1
  }
}

Keepalivedサービスを開始する

サービスkeepalived開始
#サービスキープアライブステータス
#サービスキープアライブ停止

その後、他のコンピューターは、仮想 IP 192.168.63.160 のポート 8888 と 3306 を介して、ホスト Docker 内の対応するポート 172.18.0.201 にアクセスできるようになります。

PXC クラスターを一時停止する方法

vi /etc/sysctl.conf
#ファイルにnet.ipv4.ip_forward=1を追加します。systemctl restart network

次に仮想マシンをサスペンドします

ホットバックアップデータ

コールドバックアップ

  • コールド バックアップは、データベースが閉じられているときに行うバックアップ方法です。通常は、データ ファイルをコピーします。
  • これはシンプルで安全なバックアップ方法であり、データベースの実行中にバックアップすることはできません。
  • 大規模な Web サイトでは、データをバックアップするために業務を停止することはできないため、コールド バックアップは最適な選択ではありません。

ホットバックアップ

ホットバックアップは、システムの実行中にデータをバックアップすることです。

MySQLの一般的なホットバックアップソリューションには、LVMとXtraBackupがあります。

  • LVM: Linux パーティション バックアップ コマンド。任意のデータベースをバックアップできます。ただし、データベースがロックされ、読み取りのみ可能で、コマンドが複雑です。
  • XtraBackup: テーブルをロックする必要がなく、無料

エクストラバックアップ

XtraBackup は、InnoDB に基づくオンライン ホット バックアップ ツールです。オープン ソースで無料であり、オンライン ホット バックアップをサポートし、ディスク領域をほとんど占有せず、MySQL データベースを非常に迅速にバックアップおよび復元できます。

  • バックアッププロセス中はテーブルがロックされないため、高速かつ信頼性が高い
  • バックアッププロセスは進行中のトランザクションを中断しません
  • バックアップデータは圧縮され、ディスク容量を節約します

完全バックアップと増分バックアップ

  • 完全バックアップ: すべてのデータをバックアップします。バックアッププロセスには長い時間がかかり、多くのスペースを占有します。最初のバックアップではフルバックアップを使用する必要があります
  • 増分バックアップ: 変更されたデータのみをバックアップします。バックアップ時間は短く、占有するスペースも小さいです。 2回目以降は増分バックアップを使用する

PXC フルバックアップ

バックアップは PXC ノードのコンテナ内で実行する必要がありますが、バックアップ データはホスト マシンに保存する必要があります。そこでディレクトリ マッピング テクノロジが使用されます。まず新しい Docker ボリュームを作成します。

docker ボリュームバックアップの作成

PXCノードnode1を選択し、そのコンテナを停止して削除し、バックアップディレクトリマッピングを追加したnode1コンテナを再作成します。

docker 停止ノード1
docker rm node1 # データベースデータは Docker ボリューム v1 に保存され、失われません # パラメータの変更:
# 1. -e CLUSTER_JOIN=node2;元々、他のノードは node1 を介してクラスターに参加していました。これで node1 が再作成されたので、クラスターに参加する別のノードを選択する必要があります。# 2. -v backup:/data;Docker ボリュームのバックアップをコンテナーの /data ディレクトリにマップします。docker run -d -u root -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --network=net1 --ip 172.18.0.2 --name=node1 pxc

node1コンテナにpercona-xtrabackup-24
インストールするpercona-xtrabackup-24

docker exec -it node1 bash
apt-getアップデート
apt-get で percona-xtrabackup-24 をインストールします

その後、次のコマンドを実行して完全バックアップを実行できます。バックアップされたデータは/data/backup/fullディレクトリに保存されます。

mkdir /data/backup
mkdir /data/backup/full
#非推奨、古い innobackupex --backup -u root -p abc123456 --target-dir=/data/backup/full
xtrabackup --backup -uroot -pabc123456 --target-dir=/data/backup/full

公式ドキュメントでは、 innobackupexの使用は推奨されなくなり、代わりにxtrabackupコマンドの使用が推奨されるようになりました。

PXC 完全復元

データベースはホットバックアップできますが、ホットリストアすることはできません。ホットリストアすると、ビジネスデータと復元されたデータの間に競合が発生します。

PXC クラスターの場合、復元プロセス中にノード間でデータ同期の競合が発生しないようにするために、まず元のクラスターを解散し、ノードを削除する必要があります。次に、空のデータベースを使用して新しいノードを作成し、復元を実行して、最後に他のクラスター ノードを確立します。

復元する前に、ホット バックアップに保存されたコミットされていないトランザクションをロールバックし、復元後に MySQL を再起動する必要があります。

PXCクラスタ内のすべてのノードを停止して削除します

docker stop ノード1 ノード2 ノード3 ノード4 ノード5
docker rm ノード1 ノード2 ノード3 ノード4 ノード5
docker ボリューム rm v1 v2 v3 v4 v5

前の手順に従って、node1コンテナを再作成し、コンテナに入り、コールドリストアを実行します。

# ボリュームを作成する docker volume create v1
# コンテナを作成します docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --name=node1 --network=net1 --ip 172.18.0.2 pxc
# コンテナにルートとして入る docker exec -it -uroot node1 bash
# データを削除 rm -rf /var/lib/mysql/*
# 準備フェーズ xtrabackup --prepare --target-dir=/data/backup/full/
# コールドリストアを実行する xtrabackup --copy-back --target-dir=/data/backup/full/
# 復元されたデータベースファイルの所有者を変更する chown -R mysql:mysql /var/lib/mysql
# コンテナを終了したら、コンテナを再起動します。docker stop node1
docker ノード1を起動します

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

以下もご興味があるかもしれません:
  • MySQL PXC クラスターの構築方法
  • MySQL 高可用性クラスタの展開とフェイルオーバーの実装
  • MySQL 5.7 クラスタ構成手順
  • クラスタrpmを使用してMySQLをインストールするための詳細な手順
  • MySQL クラスタの詳細な説明: 1 つのマスターと複数のスレーブのアーキテクチャ実装
  • Docker を使用して MySQL 5.7 および 8.0 マスター スレーブ クラスターをデプロイする方法
  • MySQLのクラスタモードでのgalera-clusterのデプロイメントの詳細説明
  • Docker で MySQL クラスターを構築する方法の例
  • MySQL Cluster 基本導入チュートリアル
  • MySQLの高可用性と高パフォーマンスのクラスタを構築する方法

<<:  Vue3カプセル化メッセージメッセージプロンプトインスタンス関数の詳細な説明

>>:  MySQL の全体的なアーキテクチャの紹介

推薦する

優れた UI (ユーザー インターフェース) デザイナーになるための 20 の道標

はじめに: インターフェイス デザイナーの Joshua Porter が自身のブログでこの記事を公...

MySQL で不明なフィールド名を回避する方法

序文この記事では、DDCTF の 5 番目の質問、つまり不明なフィールド名をバイパスする手法を紹介し...

MySQL 5.7.17 のインストールと設定方法のグラフィック チュートリアル (Windows10)

MySQL 5.7.17 のインストールと設定方法の概要最初のステップは、MySQL公式サイトから...

ハッシュテーブルのJavaScript実装の詳細な説明

目次1. ハッシュテーブルの原理2. ハッシュテーブルの概念3. ハッシュ競合問題1. チェーンアド...

Vueはスクロールロードテーブルを実装します

目次成果を達成する転がり荷重知識備蓄コンポーネントのパッケージ1. コンポーネントの命名2. 小道具...

Flexレイアウトを使用してヘッドの固定コンテンツ領域のスクロールを実現する方法

ページ ヘッダーの固定レイアウトは、以前は position:fixed を使用して実装されていまし...

Dockerを使用してLaravel開発環境を構築するための完全な手順

序文この記事では、Docker を使用して、ローカル コンピューターにインストールされている開発スイ...

React 手書きタブ切り替え問題

親ファイル React をインポートし、{useState} を 'react' か...

node.jsのインストールとHbuilderXの設定の詳細な説明

npm インストールチュートリアル: 1. Node.jsインストールパッケージをダウンロードする公...

Flex モバイルレイアウトにおけるシングルラインレイアウトとダブルラインレイアウトの違いと使い方

レイアウトにul>liを使用した単一行レイアウトを以下に示します。 <ul class=...

MySQL 8.0.3 RCがリリースされようとしています。変更点を見てみましょう。

MySQL 8.0.3がリリースされます。新機能を見てみましょうMySQL 8.0.3 は RC ...

MySQL マスタースレーブ構築(複数のマスターと 1 つのスレーブ)の実装アイデアと手順

背景:最近、同社のプロジェクトは同時実行のプレッシャーに耐えられないようなので、最適化が差し迫ってい...

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorException の解決方法

bitronix を使用して MySQL に接続するときの MySQLSyntaxErrorExce...

HTML テーブル マークアップ チュートリアル (9): セル間隔属性 CELLSPACING

テーブルがコンパクトになりすぎないように、テーブル内のセル間に一定の距離を設定できます。基本的な構文...

地域のカスタムカラーのためのechars 3Dマップソリューション

目次質問伸ばす問題を解決する要約する質問プロジェクトの要件に従って、以下の州地図で個々の都市を(異な...