MySQL 半同期レプリケーションの原理構成と導入の詳細な説明

MySQL 半同期レプリケーションの原理構成と導入の詳細な説明

環境の紹介:

Ubuntu Server 16.04.2+MySQL 5.7.17 コミュニティ サーバー (GPL)

MySQLのインストール

APT 経由でインストールします。公式ガイド ドキュメントのアドレス:
参考:

1. mysql-apt-config_0.8.3-1_all.debをダウンロードする

2. debをインストールする

MySQL APT リポジトリの使用に関するクイック ガイド:
https://dev.mysql.com/doc/mysql-apt-repo-クイックガイド/en/

>sudo dpkg -i mysql-apt-config_0.8.3-1_all.deb

3. ソースの更新

>sudo apt-getアップデート

4. MySQLをインストールする

>sudo apt-getでmysql-serverをインストール

5. インストールを選択し、プロンプトに従ってパスワードを設定します。

さらに、ファイアウォールの IP をバインドし、ポート 3306 を開く設定も必要です。ここでは主に MySQL の準同期レプリケーションについて学習し、MySQL のインストールについてはあまり説明しません。質問がある場合は、メッセージを残してください。

MySQL 準同期レプリケーションの紹介

(1)デフォルトでは、MySQLのレプリケーション機能は非同期であり、最高のパフォーマンスを提供できます。マスターデータベースがbinlogログをスレーブデータベースに送信すると、アクションが完了し、スレーブデータベースがログを受信したかどうかは確認されません。このプロセスは、マスターサーバーまたはスレーブサーバーに障害が発生した場合、スレーブサーバーがマスターサーバーから送信されたbinlogログを受信できない可能性があることを意味し、マスターサーバーとスレーブサーバーの間でデータの不整合が発生し、回復中にデータが失われることもあります。

知らせ:

マスター サーバーとスレーブ サーバーの両方で半同期レプリケーション モードを有効にする必要があります。有効にしないと、マスター サーバーはデフォルトで非同期レプリケーション モードを使用します。

(2)非同期レプリケーションの場合:

MySQL5.6 データベースのマスター/スレーブ同期のインストールと構成の詳細

(3)上記の可能性のあるエラーに対処するために、MySQL 5.5では半同期レプリケーションモードが導入されました。このモードでは、スレーブ サーバーがマスター サーバーから送信されたbinlogログ ファイルを受信し、それを自身のrelay logに書き込むことが保証されます。次に、マスター サーバーにフィードバックを送信して、受信したことを通知します。その後、メイン サービス スレッドは現在のsessionに戻り、操作が完了したことを通知します。

(4)タイムアウトが発生すると、マスターサーバーは、少なくとも1台のスレーブサーバーが時間内に情報を受信するまで、一時的に非同期レプリケーションモードに切り替わります。

(5)リレーログの自己修復:

MySQL 5.5.X バージョンから、 relay_log_recoveryパラメータが追加されました。このパラメータの機能は次のとおりです。スレーブ データベースがクラッシュし、 relay.logが破損して一部のリレー ログが処理されなくなった場合、実行されていないすべてのrelay-logが自動的に破棄され、ログがmasterから再度取得されるため、 relay-logの整合性が確保されます。この機能はデフォルトでは無効になっています。relay_log_recovery relay_log_recovery値が 1 に設定されている場合、この機能はスレーブ データベースで有効にできます。有効にすることをお勧めします。

(6)半同期レプリケーションと非同期レプリケーションの切り替え:

半同期レプリケーションの動作原理は、スレーブ IO_Thread スレッドが binlog ログを受信すると、マスターに確認を与える必要があるというものです。rpl_semi_sync_master_timeout rpl_semi_sync_master_timeout=10000 (10 秒) で、スレーブから 10 秒以上受信確認信号が受信されない場合、自動的に従来の非同期レプリケーション モードに切り替わります。

MySQL 半同期レプリケーション構成

まず、次の 2 つの MySQL をインストールする必要があります。

  • マスター: 192.168.1.227
  • スレーブ: 192.168.1.224

元のデータベースは次のようになります。

1. マスター構成

(1)マスターデータベースに半同期レプリケーションプラグインをインストールします。

mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 

(2)マスター上で半同期レプリケーションを有効にする:

mysql> グローバル rpl_semi_sync_master_enabled = 1 を設定します。 

(3) mysqld.cnf設定ファイルを変更します。

上記の画像は、MySQL 構成のファイル パスを示しています。

[mysqld]

ログ bin = mysql bin
サーバーID = 10086
サーバーIDビット = 33
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 

(4)MySQLサーバのUUID設定ファイルを変更します。

root@xuliugen:/var/lib/mysql# pwd
var/lib/mysql の

auto.cnfファイルを変更します。server server-uuidの値の形式は、スレーブと区別するために固定されています。

[自動]
サーバーUUID=8d90feb7-1a88-11e7-9d11-000c298a546f

(5)設定が成功したかどうかを確認します。

mysql>PLUGIN_NAME、PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; 

(6)パラメータの説明:

1. rpl_semi_sync_master_enabled = 1 、マスター上で半同期レプリケーション モードが有効になっていることを示します。

2. rpl_semi_sync_master_timeout = 10000 、トランザクション内のマスター データベースの待機時間が 10000 ミリ秒を超えると、非同期レプリケーション モードにダウングレードされ、スレーブ データベースを待機しないことを意味します。マスター データベースは、スレーブが再び回復したことを検出すると、自動的に半同期レプリケーション モードに戻ります。

3. rpl_semi_sync_master_wait_no_slave 、各トランザクションがコミットされた後にマスターがスレーブの受信確認信号を待機できるかどうかを示します。デフォルトは ON で、すべてのトランザクションが待機することを意味します。 OFF の場合、スレーブが追いついた後に半同期レプリケーション モードは有効にならないため、手動で有効にする必要があります。

4. rpl_semi_sync_master_trace_level = 32は、準同期レプリケーション モードが有効な場合に使用されるデバッグ レベルを示します。デフォルト値は 32 です。

マスターを構成するときに、1 つだけ設定され、その他はデフォルト設定に設定されていることがわかります。

2. スレーブ構成

(1)スレーブデータベースに半同期レプリケーションプラグインをインストールします。

mysql>INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

(2)スレーブ上で半同期レプリケーションを有効にする:

mysql> グローバル rpl_semi_sync_slave_enabled = 1 を設定します。 

(3) mysqld.cnf設定ファイルを変更します。

[mysqld]

ログ bin = mysql bin
サーバーID=10089
サーバーIDビット = 32
rpl_semi_sync_slave_enabled = 1 

(4)MySQLサーバのUUID設定ファイルを変更します。

root@xuliugen:/var/lib/mysql# pwd
var/lib/mysql の

auto.cnfファイルを変更します。server server-uuidの値の形式は、スレーブと区別するために固定されています。

[自動]
サーバーUUID=8d90feb7-1a88-11e7-9d11-000c298a123f

マスターのserver-uuidとは異なることを確認してください。

(5)設定が成功したかどうかを確認します。

mysql>PLUGIN_NAME、PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%'; 

(6)パラメータの説明:

1. rpl_semi_sync_slave_enabled = 1 、スレーブで半同期レプリケーション モードが有効になっていることを示します。

2. rpl_semi_sync_slave_trace_level = 32は、準同期レプリケーション モードが有効な場合に使用されるデバッグ レベルを示します。デフォルト値は 32 です。

3. スレーブのマスターを指定する

(1)コマンドラインモードでマスターを再起動する

root@xuliugen:~# サービスmysqlを再起動します

(2)コマンドラインモードでスレーブを再起動する

root@xuliugen:~# サービスmysqlを再起動します

(3)マスターステータスを確認する:

mysql> マスターステータスを表示します\G;
************************** 1. 行 ****************************
       ファイル:mysql-bin.000004
     ポジション: 154
   バイナリログ_Do_DB:
 バイナリログを無視:
実行されたGtidセット:
セット内の1行(0.02秒)

マイSQL> 

知らせ:

ファイル:mysql-bin.000004
ポジション: 154

非常に重要なので、後で必要になります。

(4)スレーブのマスターを指定します。

1. まず、スレーブの準同期レプリケーションをオフにします

mysql> スレーブを停止します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

2. スレーブのマスターを指定する

mysql>マスターをmaster_host='192.168.1.227'、master_user='root'、master_password='123456'、master_log_file='mysql-bin.000004'、master_log_pos=154に変更します。

クエリは正常、影響を受けた行は 0 行、警告は 2 件 (0.02 秒)

で:

master_host='192.168.1.227'、マスター データベースの IP アドレスmaster_user='root'、マスター データベースのアカウントmaster_password='123456'、マスター データベースの root ユーザー パスワードmaster_log_file='mysql-bin.000004'、マスター データベースの binlog ファイルmaster_log_pos=154、マスター データベースの binlog ファイルの位置

知らせ:

MySQL バージョン 5.6 以降では、マスター スレーブ レプリケーションを実行するときに GTID 方式を使用できます。binglog と pos ポイントを探す必要はありません。マスター サーバーの IP、ポート、アカウント、パスワードを知っているだけで、同期のポイントが自動的に見つかります。GTID 機能が有効になっている場合は、binlog と pos を使用する必要はありません。詳細については、関連資料を参照してください。

3. スレーブの準同期レプリケーションを有効にする

mysql> スレーブを起動します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

4. 半同期レプリケーションが成功するかどうかをテストする

5. スレーブ同期情報を適切に閉じる方法

ある時点で、サーバーはスレーブとして使用されなくなるため、通常は次のコマンドを使用して同期情報をクリアする必要があります。

mysql> stop slave #シャットダウン firstmysql> reset slave #スレーブ同期情報をクリア

ただし、show master status\G で表示される場合は次のようになります。

mysql> マスターステータスを表示します\G;

同期情報は引き続き表示されます。これは、 reset slaveを実行するとmaster.infoファイルとrelay-log.infoファイルのみが削除され、同期情報はそのまま残るためです。誰かがstart slaveコマンドを実行して同期機能をオンにすると、同期が最初からやり直され、データが失われる可能性があります。

どうすればもっとわかりやすくなりますか?次のコマンドを使用してください:

mysql> stop slave #最初にシャットダウンmysql> reset slave all#スレーブ同期情報をクリア

show master status\G再度実行しても、情報は表示されません。

VI. 異常シナリオのシミュレーション

(1)半同期レプリケーションと非同期レプリケーションの切り替え:

上記では、半同期レプリケーションから非同期レプリケーションへの切り替えが発生する理由について説明しました。次に、デモ用のシナリオをシミュレートしてみましょう。

シナリオは次のとおりです。

1. スレーブ同期を閉じ、バイナリログログのIO受信を停止します。

mysql> スレーブを停止します。

この操作は IO スレッドをシャットダウンし、10 秒間待機します。マスターがスレーブから確認を受信しない場合は、非同期レプリケーション モードに切り替わります。

上の図では、スレーブが半同期レプリケーション モードをオフにしてから再度オンにしたことがわかります。

mysql> スレーブを起動します。 

この時点で、半同期レプリケーション モードが復元されました。

(2)同期エラーケースのデモンストレーション:

まず、スレーブ ライブラリからデータベース テーブルufindを削除し、次にマスターでライブラリufind再度削除します。同期によってエラーが報告されます。

Last_Error: クエリでエラー「データベース 'ufind' を削除できません。データベースが存在しません」が発生しました。デフォルトのデータベース: 'ufind'。クエリ: 'DROP DATABASE `ufind`'

この時点で、半同期ステータスを確認します。

有効になっているため、半同期レプリケーション モードは非同期レプリケーション モードに変換されません。半同期レプリケーション モードはIO_Threadに直接関連していますが、 SQL_THREADとは関係がないことがわかります。

つまり、スレーブライブラリからバイナリログを受け取った後、マスターライブラリに確認を与えますが、 relay-logリレーログが実行されるかどうかは気にしません。

6. 半同期レプリケーションモードのパフォーマンス分析、利点と欠点

通常の状況では、非同期レプリケーション モードはサーバーからの応答を待つ必要がないため、半同期レプリケーション モードよりも速度が速く、スループットが高くなります。データの更新、挿入、削除を行う場合、その速度は半同期レプリケーション モードよりも速くなります。ただし、半同期レプリケーション モードはデータの一貫性を保つために役立ちます。一貫性の要件が高く、ネットワークの変動が小さい一部のデータでは、半同期レプリケーション モードを使用できます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要
  • MySQL の準同期レプリケーションについての簡単な説明
  • MySQL の半同期レプリケーションの原理とトラブルシューティング
  • 半同期および非同期のMySQLマスタースレーブレプリケーション構成の詳細な分析
  • MySQLの半同期の詳細な説明

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

>>:  Windows 10 1903 エラー 0xc0000135 の解決方法 [推奨]

推薦する

1 つの記事で Apache Avro データを解析する

概要: この記事では、Avro データをシリアル化して生成し、FlinkSQL を使用して解析する方...

MySQLデータベースエンジンをInnoDBに変更する

PS: ここではPHPStudy2016を使用しています1. 変更中にMySQLを停止する2. my...

SQLはLeetCodeを実装します(180.連続した数字)

[LeetCode] 180. 連続した数字少なくとも 3 回連続して出現するすべての数字を検索す...

MySQL複合インデックスの詳細な研究

複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...

Linux ファイル管理コマンド例の分析 [権限、作成、削除、コピー、移動、検索など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

建国記念日が近づいています。JS を使用して、建国記念日風のアバターを生成する小さなツールを実装します。実装プロセスの詳細な説明

目次1. ページレイアウト2. 画像のアップロードと表示3. キャンバスを初期化する4. テンプレー...

JSにおける合同と不等式、等式と不等式の問題について

目次一致と不一致一致するすべてが平等ではない平等と不平等等しい等しくない一致と不一致シンボルの両側の...

MySQL は、現在のデータ テーブル内のすべての時間に対して指定された時間間隔を増加または減少させます (推奨)

DATE_ADD() 関数は、指定された時間間隔を日付に追加します。現在のテーブル内のすべてのデー...

webpackコード断片化の実装

目次背景コモンズチャンクプラグイン分割チャンク構成リソースを非同期に読み込む要約する背景高性能なアプ...

タオバオモールのホームページ上の大きな画像のデザイン構造に関する分析と意見(写真)

前回、Taobaoの詳細ページを分析した後(クリックして表示)、ショッピングモールの基本テンプレート...

親要素を基準にCSSの位置を絶対的に設定する方法についての簡単な説明

ご存知のとおり、CSS の絶対位置はデフォルトでドキュメントに応じて設定されます。たとえば、posi...

MySql ファジークエリ JSON キーワード取得ソリューションの例

目次序文オプション1:オプション2:オプション3:オプション4(最終的に採用されたオプション):要約...

mysql5.6 以前のデータベースで json をクエリする方法

MySQLにデータを保存するとき、乱雑であまり使用されないデータがJSONフィールドに投げ込まれるこ...

Dockerのセキュリティについて Docker-TLS暗号化通信の問題

目次1. Dockerのセキュリティ問題2. Dockerアーキテクチャの欠陥とセキュリティメカニズ...