この実験では、空のデータベース、オフライン、オンラインの 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 とバイナリ ログの位置を選択しています
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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vue のルータールーティングの 2 つのモード (ハッシュと履歴) の詳細な説明
ヒント: MySQL では、ユーザーの作成と削除が頻繁に必要になります。ユーザーを作成するときは、通...
これは、Web ページを Windows のスタート メニューなどのデスクトップ プログラムのように...
ソート問題最近、Geek Time の「45 Lectures on MySQL Practice」...
目次非同期とは何ですか?なぜ非同期性が必要なのでしょうか?非同期IOとは何ですか?イベントループとは...
目次マスタースレーブレプリケーションメカニズム非同期レプリケーション準同期レプリケーションマスタース...
目次Vue3 + TypeScript 学習1. 環境設定1.1 最新のVue scaffoldin...
HTMLコード:コードをコピーコードは次のとおりです。 <td align="cen...
まずコードを書いて (int i=0;i<1000;i++){ (int j=0;j<5...
目次メイクファイルMakefile の命名とルールMakefile の仕組みMakefile変数Ma...
デフォルトでは、コンテナ内のプロセスは root ユーザー権限で実行され、この root ユーザーは...
Zabbix による SQL Server の監視を見てみましょう。まずfreetdsをダウンロード...
導入Xiao A がコードを書いていたところ、DBA Xiao B が突然、「急いでユーザー固有情報...
フロントエンドとバックエンドを完全に分離する場合、Vue プロジェクトでトークン検証を実装する一般的...
1. 要素の幅/高さ/パディング/マージンのパーセンテージ基準要素の幅/高さ/パディング/マージンの...
序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...