MySQL 8.0 における非同期レプリケーションの 3 つの方法について簡単に説明します。

MySQL 8.0 における非同期レプリケーションの 3 つの方法について簡単に説明します。

この実験では、空のデータベース、オフライン、オンラインの 3 つのモードで、1 つのマスターと 2 つのスレーブを使用して MySQL 標準の非同期レプリケーションを構成します。サーバー全体のレベルのレプリケーションのみが実行され、個々のデータベース テーブルまたはフィルターされたレプリケーションは考慮されません。

実験環境

[root@slave2 ~]# cat /etc/hosts
192.168.2.138 マスター
192.168.2.192 スレーブ1
192.168.2.130 スレーブ2
mysql> バージョンを選択します();
+-----------+
| バージョン() |
+-----------+
| 8.0.16 |
+-----------+
セット内の 1 行 (0.00 秒)

1. 空の倉庫

1. メインライブラリのバイナリ情報を表示する

mysql> マスターステータスを表示します。
+------------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------+
| mysql-bin.000004 | 155 | | | |
+------------------+----------+--------------+------------------+------------------+
セット内の 1 行 (0.00 秒)

2. マスターデータベースにレプリケーションユーザーを作成する

mysql> 'wwwwww' によって mysql_native_password で識別されるユーザー 'repl'@'%' を作成します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
mysql> *.* 上のレプリケーション クライアント、レプリケーション スレーブを 'repl'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.04 秒)
mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

3. スレーブデータベースからマスターデータベース情報を作成する

mysql> スレーブを停止します。
mysql> マスターを、master_host='192.168.2.138'、master_port=3306、master_user='repl'、master_password='wwwwww'、master_log_file='mysql-bin.000004'、master_log_pos=155 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.00 秒)
mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql>スレーブステータスを表示\G

先ほどスレーブデータベースに repl ユーザーを作成しませんでしたが、開始点以降は create user 文が実行されているため、正常にスレーブデータベースにコピーできます。これは、mysql.user テーブルをクエリすることで確認できます。

sql> mysql.user から * を選択し、user='repl'\G を指定します。

2. オフライン

データベースにすでにアプリケーション データがあるが、レプリケーションに許容できるオフライン時間枠が許容される場合、このシナリオでの一般的なアプローチは、マスター データベースのデータ ディレクトリ全体をスレーブ データベースに直接コピーしてから、レプリケーションを開始することです。具体的な手順は以下のとおりです。

1. マスターノードにテストライブラリとテストテーブルを作成する

CREATE DATABASE テスト;
クエリは正常、1 行が影響を受けました (0.04 秒)
mysql> USE テスト;
データベースが変更されました
mysql> テーブル t(id int(10)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.09 秒)
mysql> t 値に挿入 (111);
クエリは正常、1 行が影響を受けました (0.05 秒)
mysql> t 値に挿入 (222);
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> t 値に挿入 (333);
クエリは正常、1 行が影響を受けました (0.00 秒)

2. マスターデータベースにレプリケーションユーザーを作成する

mysql> 'wwwwww' によって mysql_native_password で識別されるユーザー 'repl'@'%' を作成します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
mysql> レプリケーション クライアント、レプリケーション スレーブを *.* に 'repl'@'%' として付与します。
クエリは正常、影響を受けた行は 0 行 (0.04 秒)
mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

3. 複製されたインスタンスをすべて停止し、それぞれマスター、スレーブ1、スレーブ2で実行します。

[root@master ~]# ln -s /usr/local/mysql/bin/mysqladmin /usr/bin/mysqladmin
[root@master ~]# mysqladmin -hlocalhost -uroot -pwwwwww シャットダウン

4. スレーブ1とスレーブ2にデータをコピーする

[ルート@マスターデータ]# cd /data
[ルート@マスターデータ]# scp -r mysql/スレーブ1:/data/
[root@master data]# scp -r mysql/slave2:/data/

5.スレーブ1とスレーブ2からコマンドを実行してauto.cnfファイルを削除します。

[root@slave1 mysql]# cd /data/mysql
[root@slave1 mysql]# rm -rf auto.cnf
[root@slave2 mysql]# cd /data/mysql
[root@slave2 mysql]# rm -rf auto.cnf
 

6. インスタンスを再起動します。これは 3 つのノードすべてで実行する必要があります。

[root@master data]# サービス mysqld 開始
MySQL を起動しています。成功しました。

7. メインライブラリでバイナリログを表示する

mysql> マスターステータスを表示します。
+------------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------+
| mysql-bin.000005 | 155 | | | |
+------------------+----------+--------------+------------------+------------------+
セット内の 1 行 (0.00 秒)

8. スレーブ1とスレーブ2からコマンドを実行する

mysql> スレーブを停止します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> マスターを、master_host='192.168.2.138'、master_port=3306、master_user='repl'、master_password='wwwwww'、master_log_file='mysql-bin.000005'、master_log_pos=155 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.02 秒)
mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
mysql>スレーブステータスを表示\G

9. スレーブ 1 とスレーブ 2 からコマンドを実行して、データベースとテーブルが同期されているかどうかを確認します。

mysql> テストを使用します。
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。
データベースが変更されました
mysql> テーブルを表示します。
+----------------+
| テスト中のテーブル |
+----------------+
| t |
+----------------+
セット内の 1 行 (0.00 秒)
mysql> t から * を選択します。
+------+
|id|
+------+
| 111 |
| 222 |
| 333 |
+------+
セット内の 3 行 (0.00 秒)

3. mysqldumpオンライン

オフラインでレプリケーションを確立するという要件は、あまりにも理想的です。ほとんどの場合、オンライン業務に影響を与えずにオンラインでレプリケーションを作成する必要があり、オンライン データベースへの影響は可能な限り小さくする必要があります。たとえば、レプリケーション中にマスター データベースをロックすると、マスター データベースへのアクセスに影響するため、通常は許可されません。このシナリオには、mysqldump プログラムを使用するか、XtraBackup などのサードパーティ ツールを使用するという 2 つの代替レプリケーション ソリューションがあります。これら 2 つのソリューションには、それぞれ適用可能な状況があります。 mysqldump を使用してオンラインでレプリケーションを確立するプロセスは次のとおりです。

1. メインライブラリにテストデータベースとテーブルを作成する

mysql> データベーステストを作成します。
クエリは正常、1 行が影響を受けました (0.04 秒)
mysql> テストを使用します。
データベースが変更されました
mysql> テーブル t(id int(10)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.10 秒)
mysql> t VALUES(111) に INSERT INTO します。
クエリは正常、1 行が影響を受けました (0.09 秒)
mysql> t VALUES(222) に INSERT INTO します。
クエリは正常、1 行が影響を受けました (0.00 秒)
mysql> t VALUES(333) に INSERT INTO します。
クエリは正常、1 行が影響を受けました (0.05 秒)
mysql> t VALUES(444) に INSERT INTO します。
クエリは正常、1 行が影響を受けました (0.00 秒)

2. マスターデータベースにレプリケーションユーザーを作成する

mysql> 'wwwwww' によって mysql_native_password で識別されるユーザー 'repl'@'%' を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> レプリケーション クライアント、レプリケーション スレーブを *.* に 'repl'@'%' として付与します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
 

3. スレーブ1とスレーブ2にマスターデータベース情報を作成する

mysql> マスターを、master_host='192.168.2.138'、master_port=3306、master_user='repl'、master_password='wwwwww' に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.04 秒)

4. mysqldumpコマンドを使用して、slave1ライブラリとslave2ライブラリからデータをコピーします。

[root@slave2 ~]# mysqldump --single-transaction --all-databases --master-data=1 --host=192.168.2.138 --user=root --password=wwwwww --apply-slave-statements | mysql -uroot -pwwwwww -hlocalhost
mysql: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。
mysqldump: [警告] コマンドライン インターフェイスでパスワードを使用すると安全でない可能性があります。

パラメータの説明

–single-transaction パラメータは、Innodb テーブルの非ロック エクスポートを有効にします。このオプションは、トランザクション分離モードを REPEATABLE READ に設定し、データをダンプする前に START TRANSACTION SQL ステートメントをサーバーに送信します。これは、START TRANSACTION が発行されたときにアプリケーションをブロックすることなくデータベースの一貫した状態をダンプするため、Innodb などのトランザクション テーブルでのみ機能します。したがって、ここでは次のことを前提としています。1. すべてのアプリケーション データ テーブルは Innodb エンジンを使用します。 2. バックアップ プロセス中、すべてのシステム テーブル データは変更されません。

--master-data パラメータにより、ダンプ出力に CHANGE MASTER TO MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=1480; のような SQL ステートメントが含まれ、これはマスターのバイナリ ログ座標 (ファイル名と位置) を示します。オプション値が 2 の場合、CHANGE MASTER TO ステートメントは SQL コメントとして書き込まれるため、情報提供のみが行われ、実行されません。パラメータ値が 1 の場合、ステートメントはコメントとして書き込まれず、ダンプ ファイルが再ロードされるときに実行されます。オプション値が指定されていない場合、デフォルト値は 1 になります。

–apply-slave-statements パラメータは、CHANGE MASTER TO ステートメントの前に STOP SLAVE ステートメントを追加し、出力の最後に START SLAVE ステートメントを追加して、レプリケーションを自動的に開始します。

パイプライン演算子を使用すると、途中でファイルを生成する必要がなく、エクスポートとインポートが 1 つのステップで実行されます。

5. データベースからレプリケーションステータスを確認する

mysql>スレーブステータスを表示\G

6. データベースとテーブルがデータベースから正常にコピーされたかどうかを確認します。

使用テスト;
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。
データベースが変更されました
mysql> t から * を選択します。
+------+
|id|
+------+
| 111 |
| 222 |
| 333 |
| 444 |
| 555 |
+------+
セット内の行数は 5 です (0.00 秒)

mysqldump メソッドの利点は、部分的なレプリケーションを実行できることです。たとえば、構成ファイルで replicate-do-table=db1.* を定義すると、このメソッドを使用して db1 ライブラリのみをレプリケートし、他のレプリケーション イベントを無視できます。欠点は、mysqldump がメイン データベースからデータをダンプするための SQL ステートメントを生成することです。これは実際には論理的なバックアップ方法であるため、速度が遅く、大規模なデータベースには適していません。

4. XtraBackupオンラインレプリケーション

オンラインでレプリケーションを確立するもう 1 つのオプションは、XtraBackup を使用することです。 XtraBackup は Percona のオープンソース プロジェクトであり、InnoDB の公式ホット バックアップ ツールである InnoDB Hot Backup と同様の機能を実装するために使用されます。オンライン ホット バックアップをサポートし、バックアップ中のデータの読み取りと書き込みに影響を与えません。現在のところ、最新バージョンは Percona XtraBackup 8.0.6 で、https://www.percona.com/downloads/ からダウンロードできます。 XtraBackup には、完全バックアップ、増分バックアップ、部分バックアップのサポート、圧縮バックアップのサポート、バックアップがデータの読み取りと書き込み、トランザクションなどに影響を与えないなど、多くの機能と利点がありますが、欠点や短所もあります。たとえば、オフライン バックアップをサポートしていない、テープ デバイスへの直接バックアップをサポートしていない、クラウド バックアップをサポートしていない、MyISAM バックアップもブロックされるなどです。ただし、これらの小さな欠陥は、XtraBackup が人気のある MySQL バックアップ ツールになることには影響しません。また、XtraBackup は Linux プラットフォームのみをサポートし、Windows プラットフォームはサポートしていないことに注意してください。以下は、XtraBackup を使用してオンラインでマスター スレーブ レプリケーションを設定するプロセスを示しています。マスター データベースは、レプリケーションを実行するためのユーザー repl を確立しました。

マスターデータベースにレプリケーションユーザーを作成する

mysql> 'wwwwww' によって mysql_native_password で識別されるユーザー 'repl'@'%' を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> レプリケーション クライアント、レプリケーション スレーブを *.* に 'repl'@'%' として付与します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

1. マスターライブラリとスレーブライブラリの両方にXtraBackupvをインストールする

[root@master ~]# yum -y libev をインストールします
[root@master home]# yum localinstall percona-xtrabackup-80-8.0.6-1.el7.x86_64.rpm -y

2. マスターライブラリからスレーブライブラリへのSSHパスワードフリー接続を構成する

[root@master ホーム]# ssh-keygen 
公開/秘密 RSA キー ペアを生成しています。
キーを保存するファイル (/root/.ssh/id_rsa) を入力します。 
パスフレーズを入力してください (パスフレーズがない場合は空白): 
同じパスフレーズをもう一度入力してください: 
あなたの識別情報は /root/.ssh/id_rsa に保存されました。
公開鍵は /root/.ssh/id_rsa.pub に保存されました。
キーのフィンガープリントは次のとおりです。
SHA256:GBLbrw17UVck8RyCa/fbYyLkSNZIRc5p+jPQmpkD+bI ルート@マスター
キーのランダムアート画像は次のとおりです。
+---[RSA 2048]----+
| . .o+o+ |
| + +..* . |
| ooo*.o |
| . +.o*.. |
|ooS+oo . |
| =o=ボ。|
| o.=B++ o |
| .o..oo..o.|
| E . o .|
+----[SHA256]-----+
[root@master ホーム]# ssh-copy-id 192.168.2.138
[root@master ホーム]# ssh-copy-id 192.168.2.192
[root@master ホーム]# ssh-copy-id 192.168.2.130

3. スレーブデータベースを停止し、スレーブデータベース内のデータを削除します。

[root@slave1 home]# サービスmysql停止
[root@slave2 home]# サービスmysql停止
[root@slave1 ホーム]# rm -rf /data/mysql/*
[root@slave2 ホーム]# rm -rf /data/mysql/*

4.データのバックアップと転送

[root@master tmp]# xtrabackup -uroot -pwwwwww --socket=/data/mysql/mysql.sock --no-lock --backup --compress --stream=xbstream --parallel=4 --target-dir=./ | ssh [email protected] "xbstream -x -C /data/mysql/ --decompress"

実行中にエラーが発生しました。

190606 01:21:47 >> ログは (19597291) までスキャンされました

190606 01:21:47 p_s.log_status から LSN とバイナリ ログの位置を選択しています

エラー: クエリ結果の取得に失敗しました SELECT server_uuid, local, replication, storage_engines FROM performance_schema.log_status: アクセスが拒否されました。この操作には BACKUP_ADMIN 権限 (少なくとも 1 つ) が必要です

mysql> *.* の BACKUP_ADMIN 権限を 'root'@'%' に付与します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

次のコマンドを実行して 192.168.2.192:/data/mysql/* の内容を削除し、コマンドを再度実行して正しいことを確認します。実行が成功すると次のようになります。


このコマンドは、マスターに接続し、並列圧縮ストリーミング バックアップを実行し、パイプ演算子を介してバックアップをスレーブに転送し、スレーブのデータ ディレクトリに直接解凍します。すべての操作は 1 つのコマンドで完了し、途中でファイルをディスクに書き込む必要はありません。

5. ライブラリからバックアップを復元する

[root@slave1 /]# xtrabackup --prepare --target-dir=/data/mysql
[root@slave2 /]# xtrabackup --prepare --target-dir=/data/mysql

6. ライブラリからバイナリbin-logログを表示する

[root@slave1 mysql]# cat xtrabackup_binlog_info 
mysql-bin.000008 155
[root@slave2 mysql]# cat xtrabackup_binlog_info 
mysql-bin.000009 155

7. スレーブライブラリを起動する

[root@slave1 data]# サービスmysqldの開始
MySQL を起動しています... 成功しました! 
[root@slave2 data]# サービスmysqldの開始
MySQL を起動しています... 成功しました!

8. マスターデータベース情報を作成します。master_log_fileとmaster_log_posの値は手順6から取得されます。

mysql> マスターを、master_host='192.168.2.138'、master_port=3306、master_user='repl'、master_password='wwwwww'、master_log_file='mysql-bin.000008'、master_log_pos=155 に変更します。
クエリは正常、影響を受けた行は 0 行、警告は 2 個 (0.04 秒)
mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
mysql>スレーブステータスを表示\G

9. ライブラリからのテストデータ

mysql> テストを使用します。
テーブル名と列名の補完のためのテーブル情報の読み取り
-Aでこの機能をオフにすると起動が速くなります。
データベースが変更されました
mysql> t から * を選択します。
+------+
|id|
+------+
| 111 |
| 222 |
| 333 |
| 444 |
| 555 |
+------+
セット内の行数は 5 です (0.00 秒)

XtraBackup は、mysqldump よりもはるかに高いパフォーマンスと、マスター データベースへの影響を最小限に抑えた物理コピーです。高負荷、大容量データ、フル インスタンスのスレーブ データベースをオンラインでゼロから作成するのに非常に適しています。

これで、MySQL 8.0 非同期レプリケーションの 3 つの方法についての記事は終了です。MySQL 8.0 非同期レプリケーションの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーションと読み取り書き込み分離の詳細な説明
  • MySQLテーブルをコピーする方法
  • MySQL 8.0.23 のレプリケーション アーキテクチャにおけるスレーブ ノードの自動フェイルオーバー
  • MYSQL データベース GTID はマスタースレーブレプリケーションを実現します (超便利)
  • MySql マスタースレーブレプリケーションの実装原理と構成
  • MySQL の WriteSet 並列レプリケーションの簡単な分析
  • MySQL マスタースレーブレプリケーションの原理と注意点
  • MySQL でレプリケーション フィルターを動的に変更する方法
  • MySQL 並列レプリケーションの簡単な分析
  • MySQL マスタースレーブレプリケーションでエラーをスキップする方法
  • MySQL 4 の一般的なマスタースレーブレプリケーションアーキテクチャ
  • ディスク容量不足による MySQL レプリケーション障害の解決方法

<<:  Vue のルータールーティングの 2 つのモード (ハッシュと履歴) の詳細な説明

>>:  Linux入力サブシステムフレームワーク原理の分析

ブログ    

推薦する

CSSは、マウスを線の上に置くと線全体の色を変える効果を実現します。

まとめ:以下のように、CSS で指定した行にマウスを置いたときに行全体の色を変更する方法を示します。...

Webデザイン講座(4):素材と表現について

<br />前回のWebデザインチュートリアル:Webデザインチュートリアル(3):デザ...

イメージを再構築せずにDockerにポートを動的に追加する方法

操作中に Docker コンテナの公開ポートを変更または追加する必要がある場合がありますが、実行中の...

MySQL 8.0.18 はクローンプラグインを使用して MGR 実装を再構築します

3 ノード MGR 内の 1 つのノードに異常があり、MGR クラスターに再度追加する必要があるとし...

Vue の一般的な問題と解決策の概要 (推奨)

Vue に限定されず、他の種類の SPA プロジェクトにも当てはまる問題がいくつかあります。 1....

JDBC-idea で mysql をインポートして java jar パッケージに接続する (mac)

序文1. この記事ではMySQL 8.0バージョンを使用していますバージョン5.0と比較すると、パッ...

Linux インストール Redis 実装プロセスとエラー解決

今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...

Vueがsweetalert2プロンプトコンポーネントを統合する際の問題についてお話ししましょう

目次1. プロジェクト統合1. CDNインポート方法: 2. 箱の梱包を確認する3. 迅速な箱詰め4...

Django は Pillow を使用して検証コード機能を簡単に設定します (Python)

1. モジュールをインポートし、検証状態を定義する PIL から Image、ImageDraw、...

PID を作成できないために MySQL が起動できない問題を解決する方法

問題の説明MySQL 起動エラー メッセージは次のとおりです。 mysqld を起動します (sys...

クリーンなコードのための Web デザインの 12 の法則 [グラフィック]

美しいコードは美しい Web サイトの基礎です。優れた CSS は、同様に優れた HTML の上にの...

CentOS7.6 システムで yum を使用して lnmp 環境を構成する方法

1. インストールバージョンの詳細 サーバー: MariaDB サーバーバージョン: 5.5.60-...

Nginx 経由で Tomcat9 クラスターを構築し、セッション共有を実現する

Nginx を使用して Tomcat9 クラスターを構築し、Redis を使用してセッション共有を実...