MySQLコンテナ間のレプリケーション構成例の詳細な説明

MySQLコンテナ間のレプリケーション構成例の詳細な説明

背景

先週、会社で MySQL レプリケーションのトレーニングを受けたので、今週末は学んだことを実践する予定です。

マスターサーバー: NAS 上の MySQL コンテナ mysql_master

  • NAS サーバー IP: 192.168.1.108
  • mysql_master 内部 IP: 172.17.0.6

スレーブサーバー: Mac mini 上の MySQK コンテナ mysql_slave

  • Mac mini docker ホスト IP: 192.168.1.139
  • mysql_slave 内部 IP: 172.17.0.2

MySQLコンテナを準備する

mysql_masterを準備する

MySQLファイルを保存するディレクトリを2つ作成する

mkdir -p /mnt/md1/disk4/mysql
mkdir -p /mnt/md1/disk4/mysql-files

テスト用のマスターMySQLノードを作成する

[root@TNAS-2664 disk4]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql_master -v /mnt/md1/disk4/mysql:/var/lib/mysql -v /mnt/md1/disk4/mysql-files:/var/lib/mysql-files mysql
3bebf0e21df6d9034ce8275b14ebb1616e11f5e2678b1e084d03c087ed91a72a

NAS上で現在実行中のMySQLのコンテナIDを表示します

[root@TNAS-2664 ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
40db0be51460 mysql "docker-entrypoint..." 44 秒前 29 秒前に起動 33060/tcp、0.0.0.0:3307->3306/tcp mysql_master
db5f6a287a21 mautic/mautic "/entrypoint.sh ap..." 2 週間前 11 日前 0.0.0.0:8082->80/tcp mautic
dc1eac509c70 qianliu/mediawikiwithcomposer "docker-php-entryp..." 2 週間前 11 日前 0.0.0.0:8086->80/tcp sarawiki
b5c0a00f5f42 mysql "docker-entrypoint..." 2 週間前 11 日前 0.0.0.0:3306->3306/tcp, 33060/tcp mysql2
911c0a8987ba qianliu/mediawikiwithcomposer "docker-php-entryp..." 2 週間前 11 日前 0.0.0.0:8083->80/tcp qianliuwiki

docker cpコマンドを使用してmy.cnfをホストマシンにコピーし、変更を加えます。

ディレクトリ cp 40db0be51460:/etc/mysql/my.cnf に移動します。

my.cnfに次の設定を追加します。

サーバーID = 1
 gtid-mode = ON # (GTID によって複製)
 強制_gtid_consistency =1 #(GTIDによって複製) 
 ログビン = マスターログ
 binlog_format = 混合
 ログ有効期限日数 = 14
 同期バイナリログ = 1
 ログビン信頼関数作成者 = 1
 
 # マスターDB # 
 binlog-ignore-db = mysql、information_schema、performance_schema、sys
 自動増分増加 = 2
 自動増分オフセット = 1
 
 # スレーブDB #
 レプリケート無視DB = mysql、情報スキーマ、パフォーマンススキーマ、sys
 relay_log = リレーログ
 ログスレーブ更新 = ON

docker cpを使用してmy.cnfをmysql_masterコンテナにコピーします。

docker cp my.cnf 40db0be51460:/etc/mysql/

mysql_slave と入力すると、権限ファイルが原因で my.cnf が無視されていることがわかります。これにより、my.cnf に書き込まれたばかりの設定が有効になりません。

[root@TNAS-2664 ~]# docker exec -it mysql_master /bin/bash
ルート@40db0be51460:/#mysql -uroot -p123456
mysql: [警告] 誰でも書き込み可能な設定ファイル '/etc/mysql/my.cnf' は無視されます。
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
MySQL モニターへようこそ。コマンドは ; または \g で終わります。

my.cnfの権限を664に変更します

root@40db0be51460:/# chmod 644 /etc/mysql/my.cnf
root@40db0be51460:/# 終了

my.cnfを有効にするにはmysql_slaveを再起動してください。

[root@TNAS-2664 ~]# docker で mysql_master を再起動します

9. マスターステータスを表示するにはmysql_masterと入力します。

mysql> マスターステータスを表示します。
+-------------------+----------+--------------+-------------------------------------------------+-------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+-------------------------------------------------+-------------------+
| master-log.000001 | 156 | | mysql、information_schema、performance_schema、sys | |
+-------------------+----------+--------------+-------------------------------------------------+-------------------+
セット内の 1 行 (0.00 秒)

mysql>終了

mysql_slaveコンテナを準備する

Mac miniにMySQLファイルを保存するためのディレクトリを2つ作成する

mkdir -p /Volumes/MacintoshHDD_Data/mysql_slave_db/mysql
mkdir -p /Volumes/MacintoshHDD_Data/mysql_slave_db/mysql-files

テスト用のmysql_slaveコンテナを作成する

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql_slave -v /Volumes/MacintoshHDD_Data/mysql_slave_db/mysql:/var/lib/mysql -v /Volumes/MacintoshHDD_Data/mysql_slave_db/mysql-files:/var/lib/mysql-files mysql

macminiで現在実行中のmysql_slaveのコンテナIDを表示します。

/Volumes/MacintoshHDD_Data/mysql_slave_db  docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
8623ac99e5d4 mysql "docker-entrypoint.s…" 5 秒前 4 秒前にアップ 33060/tcp、0.0.0.0:3307->3306/tcp mysql_slave

docker cpコマンドを使用してmy.cnfをホストマシンにコピーし、変更を加えます。

次のコマンドを実行して、mysql.cnf ファイルを docker で開きます。

my.cnfに次の設定を追加します。

サーバーID = 2
 gtidモード = オン
 強制GTID一貫性 = 1
 ログビン = スレーブログ
 binlog_format = 混合
 ログ有効期限日数 = 14
 同期バイナリログ = 1
 ログビン信頼関数作成者 = 1
 
 # マスターDB # 
 binlog-ignore-db = mysql、information_schema、performance_schema、sys
 自動増分増加 = 2
 自動増分オフセット = 2
 
 # スレーブDB #
 レプリケート無視DB = mysql、情報スキーマ、パフォーマンススキーマ、sys
 relay_log = リレーログ
 ログスレーブ更新 = ON

docker cpを使用してmy.cnfをmysql_masterコンテナにコピーします。

docker cp my.cnf 8623ac99e5d4:/etc/mysql/

my.cnfを有効にするにはmysql_slaveを再起動してください。

docker で mysql_slave を再起動する

マスターステータスを表示するにはmysql_slaveと入力します

mysql> マスターステータスを表示します。
+------------------+----------+--------------+-------------------------------------------------+------------------------------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------------------------+------------------------------------------+
| スレーブ ログ.000001 | 1460 | | mysql、information_schema、performance_schema、sys | f102ae13-5341-11eb-a578-0242ac110002:1-5 |
+------------------+----------+--------------+-------------------------------------------------+------------------------------------------+
セット内の 1 行 (0.00 秒)

レプリケーション用のmysqlユーザーを準備する

mysql_master でレプリケーション用の mysql ユーザーを準備する

mysql> 'slave'@'192.168.1.139' というユーザーを作成し、'slave' によって識別します。
クエリは正常、影響を受けた行は 0 行 (0.59 秒)

mysql> 'slave'@'172.17.0.2' というユーザーを作成し、'slave' によって識別します。
クエリは正常、影響を受けた行は 0 行 (0.60 秒)

mysql> 'slave'@'192.168.1.139' に *.* のレプリケーションスレーブ権限を付与します。
クエリは正常、影響を受けた行は 0 行 (0.19 秒)

mysql> 'slave'@'172.17.0.2' に *.* のレプリケーション スレーブ権限を許可します。
クエリは正常、影響を受けた行は 0 行 (0.19 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.10 秒)

mysql>終了

mysql_slave でレプリケーション用の mysql ユーザーを準備する

mysql> 'slave'@'192.168.1.108' というユーザーを作成し、'slave' によって識別します。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)

mysql> 'slave'@'172.17.0.6' というユーザーを作成し、'slave' によって識別します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 'slave'@'192.168.1.108' に *.* のレプリケーションスレーブ権限を付与します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 'slave'@'172.17.0.6' に *.* のレプリケーション スレーブ権限を付与します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

マイSQL>

レプリケーション構成

mysql_master を設定する

mysql> マスターを、master_host='192.168.1.139'、master_user='slave'、master_password='slave'、master_log_file='slave-log.000001'、master_port=3307、master_log_pos=1460 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (1.17 秒)

mysql> マスターを、master_host='192.168.1.139'、master_user='slave'、master_password='slave'、master_auto_position=1、get_master_public_key=1 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.45 秒)

mysql_slaveを設定する

mysql> マスターを、master_host='192.168.1.108'、master_user='slave'、master_password='slave'、master_log_file='master-log.000001'、master_port=3307、master_log_pos=156 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 個 (0.15 秒)

mysql> マスターを、master_host='192.168.1.108'、master_user='slave'、master_password='slave'、master_auto_position=1、get_master_public_key=1 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.14 秒)

レプリケーションを有効にする

mysql_masterでスレーブを起動する
mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行、警告は 1 件 (0.00 秒)

スレーブのステータスを確認すると、レプリケーションが正常に開始されていないことがわかりました。エラー メッセージが表示されます: ユーザー 'slave'@'172.17.0.1' のアクセスが拒否されました (パスワード使用: YES)。mysql_slave で対応するユーザーと権限を作成する必要があります。

mysql> スレーブステータスを表示します \G;
************************** 1. 行 ****************************
  Slave_IO_State: マスターに接続中
   マスターホスト: 192.168.1.139
   マスターユーザー: スレーブ
   マスターポート: 3307
  接続再試行: 60
  マスターログファイル:
  読み取りマスターログ位置: 4
  リレーログファイル: リレーログ.000001
  リレーログ位置: 4
 リレーマスターログファイル:
  Slave_IO_Running: 接続中
  スレーブSQL実行中: はい
  レプリケート_Do_DB:
  レプリケート_無視_DB: mysql、情報スキーマ、パフォーマンススキーマ、sys
  テーブルの複製:
 無視テーブルを複製:
 Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
   最終エラー番号: 0
   最終エラー:
   スキップカウンタ: 0
  実行マスターログ位置: 0
  リレーログスペース: 156
  Until_Condition: なし
  ログファイルまで:
  ログ位置まで: 0
  マスターSSL許可: いいえ
  マスターSSLCAファイル:
  マスターSSLCAパス:
  マスターSSL証明書:
  マスターSSL暗号:
  マスターSSLキー:
 マスターより遅れている秒数: 0
Master_SSL_Verify_Server_Cert: いいえ
  最終IOエラー番号: 1045
  Last_IO_Error: マスター '[email protected]:3307' への接続エラー - 再試行時間: 60 再試行: 2 メッセージ: ユーザー 'slave'@'172.17.0.1' のアクセスが拒否されました (パスワード使用: YES)
  最終SQLエラー番号: 0
  最後のSQLエラー:
 Replicate_Ignore_Server_Ids:
  マスターサーバー ID: 0
   マスターUUID:
  マスター情報ファイル: mysql.slave_master_info
   SQL_遅延: 0
  SQL_残り遅延: NULL
 Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
  マスター再試行回数: 86400
   マスターバインド:
 最終IOエラータイムスタンプ: 210110 13:02:12
 最終SQLエラータイムスタンプ:
  マスターSSL証明書:
  マスターSSLCrlパス:
  取得済み_Gtid_Set:
  実行されたGtidセット:
  自動位置: 1
  Replicate_Rewrite_DB:
   チャンネル名:
  マスター TLS バージョン:
 マスター公開キーパス:
 マスター公開キーの取得: 1
  ネットワーク名前空間:
セット内の1行(0.01秒)

エラー:
クエリが指定されていません

mysql>終了

mysql_slave はスレーブを起動し、スレーブのステータスをチェックしてすべてが正常であることを確認します。

mysql> スレーブのステータスを表示します。
mysql> スレーブステータスを表示します\G;
************************** 1. 行 ****************************
  Slave_IO_State: マスターがイベントを送信するのを待機中
   マスターホスト: 192.168.1.108
   マスターユーザー: スレーブ
   マスターポート: 3307
  接続再試行: 60
  マスターログファイル: master-log.000001
  読み取りマスターログ位置: 156
  リレーログファイル: リレーログ.000002
  リレーログ位置: 373
 リレーマスターログファイル: master-log.000001
  スレーブIO実行中: はい
  スレーブSQL実行中: はい
  レプリケート_Do_DB:
  Replicate_Ignore_DB: mysql、information_schema、performance_schema、sys
  テーブルの複製:
 無視テーブルを複製:
 Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
   最終エラー番号: 0
   最終エラー:
   スキップカウンタ: 0
  実行マスターログ位置: 156
  リレーログスペース: 576
  Until_Condition: なし
  ログファイルまで:
  ログ位置まで: 0
  マスターSSL許可: いいえ
  マスターSSLCAファイル:
  マスターSSLCAパス:
  マスターSSL証明書:
  マスターSSL暗号:
  マスターSSLキー:
 マスターより遅れている秒数: 0
Master_SSL_Verify_Server_Cert: いいえ
  最終IOエラー番号: 0
  最後のIOエラー:
  最終SQLエラー番号: 0
  最後のSQLエラー:
 Replicate_Ignore_Server_Ids:
  マスターサーバーID: 1
   マスター_UUID: 9627309d-5341-11eb-aaa3-0242ac110006
  マスター情報ファイル: mysql.slave_master_info
   SQL_遅延: 0
  SQL_残り遅延: NULL
 Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
  マスター再試行回数: 86400
   マスターバインド:
 最終IOエラータイムスタンプ:
 最終SQLエラータイムスタンプ:
  マスターSSL証明書:
  マスターSSLCrlパス:
  取得済み_Gtid_Set:
  実行されたGtidセット: f102ae13-5341-11eb-a578-0242ac110002:1-5
  自動位置: 1
  Replicate_Rewrite_DB:
   チャンネル名:
  マスター TLS バージョン:
 マスター公開キーパス:
 マスター公開キーの取得: 1
  ネットワーク名前空間:
セットに 1 行、警告 1 回 (0.01 秒)

エラー:
クエリが指定されていません

mysql_slaveにユーザーを作成する

mysql> 'slave'@'172.17.0.1' というユーザーを作成し、'slave' によって識別します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> 'slave'@'172.17.0.1' に *.* のレプリケーション スレーブ権限を付与します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql_masterのスレーブステータスを再度確認すると、すべて正常です

mysql> スレーブステータスを表示します \G;
************************** 1. 行 ****************************
  Slave_IO_State: マスターがイベントを送信するのを待機中
   マスターホスト: 192.168.1.139
   マスターユーザー: スレーブ
   マスターポート: 3307
  接続再試行: 60
  マスターログファイル: スレーブログ.000001
  マスターログポジションを読む: 2022
  リレーログファイル: リレーログ.000002
  リレーログ位置: 2237
 リレーマスターログファイル: スレーブログ.000001
  スレーブIO実行中: はい
  スレーブSQL実行中: はい
  レプリケート_Do_DB:
  Replicate_Ignore_DB: mysql、information_schema、performance_schema、sys
  テーブルの複製:
 無視テーブルを複製:
 Replicate_Wild_Do_Table:
 Replicate_Wild_Ignore_Table:
   最終エラー番号: 0
   最終エラー:
   スキップカウンタ: 0
  エグゼクティブマスターログポジション: 2022
  リレーログスペース: 2440
  Until_Condition: なし
  ログファイルまで:
  ログ位置まで: 0
  マスターSSL許可: いいえ
  マスターSSLCAファイル:
  マスターSSLCAパス:
  マスターSSL証明書:
  マスターSSL暗号:
  マスターSSLキー:
 マスターより遅れている秒数: 0
Master_SSL_Verify_Server_Cert: いいえ
  最終IOエラー番号: 0
  最後のIOエラー:
  最終SQLエラー番号: 0
  最後のSQLエラー:
 Replicate_Ignore_Server_Ids:
  マスターサーバー ID: 2
   マスター_UUID: f102ae13-5341-11eb-a578-0242ac110002
  マスター情報ファイル: mysql.slave_master_info
   SQL_遅延: 0
  SQL_残り遅延: NULL
 Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
  マスター再試行回数: 86400
   マスターバインド:
 最終IOエラータイムスタンプ:
 最終SQLエラータイムスタンプ:
  マスターSSL証明書:
  マスターSSLCrlパス:
  取得Gtidセット: f102ae13-5341-11eb-a578-0242ac110002:1-7
  実行されたGtidセット: f102ae13-5341-11eb-a578-0242ac110002:1-7
  自動位置: 1
  Replicate_Rewrite_DB:
   チャンネル名:
  マスター TLS バージョン:
 マスター公開キーパス:
 マスター公開キーの取得: 1
  ネットワーク名前空間:
セット内の1行(0.01秒)

エラー:
クエリが指定されていません

テストの複製
mysql_slave に test_db_slave を作成する

mysql> データベース test_db_slave を作成します。
クエリは正常、1 行が影響を受けました (0.01 秒)

mysql_master に test_db_master を作成する

mysql> データベース test_db_master を作成します。
クエリは正常、1 行が影響を受けました (0.24 秒)

mysql_slave 上のデータベースを表示する

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
| テスト_db_マスター |
| テスト_db_スレーブ |
+--------------------+
セット内の 6 行 (0.00 秒)

マイSQL>

mysql_master 上のデータベースを表示する

mysql> データベースを表示します。
+--------------------+
| データベース |
+--------------------+
| 情報スキーマ |
|mysql |
| パフォーマンススキーマ |
|システム|
| テスト_db_マスター |
| テスト_db_スレーブ |
+--------------------+
セット内の 6 行 (0.00 秒)

マイSQL>

この時点で、mysql レプリケーションの構成は完了です。

MySQLコンテナ間のレプリケーション構成については以上で終了です。MySQLコンテナのレプリケーション構成の詳細については、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL グループレプリケーションの設定手順 (推奨)
  • MySQL5.6 レプリケーション マスタースレーブレプリケーション(読み書き分離)構成 完全版
  • MySQL 準同期レプリケーションの概要
  • MySQL 5.7 拡張エディション セミ同期レプリケーション パフォーマンスの最適化
  • MySQL-MMM インストール ガイド (MySQL 用マルチマスター レプリケーション マネージャー)
  • MySQL レプリケーションに基づく問題の概要
  • mysql5.5 マスタースレーブ(レプリケーション)構成方法
  • mysql5.5 マスタースレーブ (レプリケーション) マスタースレーブ構成
  • MySQL マスタースレーブレプリケーション 準同期レプリケーション

<<:  HTML テーブル マークアップ チュートリアル (14): テーブル ヘッダー

>>:  Tomcat Nativeを使用してTomcat IO効率を向上させる方法の詳細な説明

推薦する

Angularの親子コンポーネント通信の詳細な説明

目次概要1. 入力および出力プロパティの概要2. 入力属性3. プロパティバインディングは親コンポー...

歴史的な Linux 画像処理および修復ソリューション

従来の Linux イメージで作成された ECS クラウド サーバーには、NTP と YUM が設定...

Linux コマンドライン操作 Baidu クラウドのファイルのアップロードとダウンロード

目次0. 背景1. インストール2. Baidu Cloudアカウントにログインする3. ファイルを...

MySQL 5.7 データベースのインストール手順の個人的な要約

1.mysql-5.7.19-winx64.zip(これは無料のインストールバージョンで、約318 ...

圧縮パッケージを使用して Linux 環境に JDK 13 をインストールする方法

JDK とは何ですか?まあ、この質問がわからないのであれば、なぜこれをインストールするのか本当にわか...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

CSS で div 凹角スタイルを実装するサンプル コード

通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...

Dockerの基本的なネットワーク構成の詳細な説明

外部アクセスポートをランダムにマップする -P フラグを使用すると、Docker は 49000 か...

優れたウェブフロントエンドデザインの指標

Web ページのアクセシビリティは、フロントエンドでのみ評価および実装できるもののようです。ユーザビ...

WeChat公式アカウントでReactプロジェクトを実行する方法

目次1. a タグを使用して PDF をプレビューまたはダウンロードします。書き方は、携帯電話でクリ...

Vue-cli4 ルーティング構成の詳細な理解

目次序文 - Vue ルーティング1. 最も基本的なルーティング構成1. router/index....

MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能

序文私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉...

JavaScript で円形カルーセルを実装する

この記事では、円形カルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹介しま...

Linux でテキストから改行文字を削除する方法

復帰文字 ( Ctrl+M ) に不安を感じても心配しないでください。それらを排除する簡単な方法がい...

vue+echartsチャートの使用に関する問題記録

序文echarts は私が最もよく使用するチャート作成ツールであり、非常に完全なエコシステムとコンテ...