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入力サブシステムフレームワーク原理の分析

推薦する

2 つの MySQL ユーザー削除ステートメント (delete user と drop user) の違い

ヒント: MySQL では、ユーザーの作成と削除が頻繁に必要になります。ユーザーを作成するときは、通...

CSS マルチレベルメニュー実装コード

これは、Web ページを Windows のスタート メニューなどのデスクトップ プログラムのように...

MySQL InnoDBセカンダリインデックスのソート例の詳細な説明

ソート問題最近、Geek Time の「45 Lectures on MySQL Practice」...

ノードイベントループとメッセージキューの分析

目次非同期とは何ですか?なぜ非同期性が必要なのでしょうか?非同期IOとは何ですか?イベントループとは...

MySql マスタースレーブレプリケーションメカニズムの包括的な分析

目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...

Vue3 + TypeScript 開発の概要

目次Vue3 + TypeScript 学習1. 環境設定1.1 最新のVue scaffoldin...

表 td 画像水平および垂直中央揃えコード

HTMLコード:コードをコピーコードは次のとおりです。 <td align="cen...

MySQL における in と exists の使い方と違いの紹介

まずコードを書いて (int i=0;i<1000;i++){ (int j=0;j<5...

Linux での Makefile の書き方と使い方の詳細な説明

目次メイクファイルMakefile の命名とルールMakefile の仕組みMakefile変数Ma...

Docker コンテナの uid と gid の詳細な理解

デフォルトでは、コンテナ内のプロセスは root ユーザー権限で実行され、この root ユーザーは...

Zabbix による SQL Server の監視プロセスの詳細な説明

Zabbix による SQL Server の監視を見てみましょう。まずfreetdsをダウンロード...

MySQL 自動インクリメント ID のオーバーサイズ問題のトラブルシューティングと解決策

導入Xiao A がコードを書いていたところ、DBA Xiao B が突然、「急いでユーザー固有情報...

Vueはユーザーログインとトークン検証を実装します

フロントエンドとバックエンドを完全に分離する場合、Vue プロジェクトでトークン検証を実装する一般的...

3次元画像配置効果を実現する純粋なCSSのサンプルコード

1. 要素の幅/高さ/パディング/マージンのパーセンテージ基準要素の幅/高さ/パディング/マージンの...

MySQL メタデータで Hive テーブル作成ステートメントのコメント スクリプトを生成する方法

序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...