MySQL マスタースレーブレプリケーションの原理と実践の詳細な説明

MySQL マスタースレーブレプリケーションの原理と実践の詳細な説明

この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションの原理と実践について説明します。ご参考までに、詳細は以下の通りです。

導入

MySQL マスター スレーブ レプリケーションは、レプリケーションや AB レプリケーションとも呼ばれます。少なくとも 2 つの MySQL サーバーが必要です (同じマシン上にあっても、異なるマシン上にあってもかまいません)。

たとえば、サーバー A がマスター サーバーで、サーバー B がスレーブ サーバーであるとします。データはサーバー A で更新され、バイナリ ログ レコードを通じてサーバー B に同期されます。同期されたバイナリ ログ データは、2 つのサーバーでデータの一貫性を保つために再実行されます。

MySQL データベースのマスター スレーブ レプリケーション スキームは、データのリモート転送である scp/rsync などのコマンドを使用するファイル レベルのレプリケーションに似ています。

ただし、MySQL のマスター スレーブ レプリケーションは組み込み機能であり、サードパーティ ツールを使用する必要はありません。また、MySQL のマスター スレーブ レプリケーションでは、データベース ディスク上のファイルを直接コピーするのではなく、論理 binlog ログをローカル サーバーにコピーして同期し、その後、ローカル スレッドがログ内の SQL ステートメントを読み取って MySQL データベースに再適用します。

効果

1.リアルタイムの災害復旧とフェイルオーバー。

2.読み取りと書き込みの分離、クエリ サービスの提供、負荷分散の実現。

3.ビジネスへの影響を避けるためのデータのホットバックアップ。

原理

1. マスター サーバーの MySQL サービスは、すべての書き込み操作を binlog ログに記録し、ログ ダンプ スレッドを生成し、binlog ログをスレーブ サーバーの MySQL サービスの I/O スレッドに渡します。

2. サーバーの MySQL サービスから 2 つのスレッドを生成します。1 つは I/O スレッドで、もう 1 つは SQL スレッドです。

3. スレーブ I/O スレッドはマスターの binlog ログを要求し、binlog ログ内のファイルをリレーログに書き込みます。

4. スレーブ データベースの SQL スレッドは、リレーログの内容を読み取り、それを特定の操作に解析して、マスターとスレーブの操作の一貫性を実現し、最終的に 2 つのデータベース間のデータの一貫性を実現します。

注記:
- マスタースレーブレプリケーションは非同期かつ論理的な SQL ステートメントレベルのレプリケーションです。
- レプリケーション中、マスターには 1 つの I/O スレッドがあり、スレーブには I/O スレッドと SQL スレッドの 2 つのスレッドがあります。
- マスタースレーブレプリケーションを実装するための必要条件は、マスターデータベースで binlog 機能を有効にすることです。
- レプリケーションとして使用されるすべての MySQL ノードのサーバー ID は同じにすることはできません。
- binlog ファイルには、データの内容を変更する SQL ステートメントのみが記録され、クエリ ステートメントは記録されません。

形状

一人の主人と一人の奴隷

マスター-マスターレプリケーション

一人の主人に多くの奴隷

複数のマスターと 1 つのスレーブ (5.7 以降でサポート)

カスケードレプリケーション

練習する

必要

マスタースレーブレプリケーションモードを実装し、同じホスト上に2つのMySQLインスタンスを配置する

環境

マック: 10.15.1
Docker: 2.0.0.3 // Docker を使用して MySQL をインストールする主な目的は、管理とメンテナンスの容易さ、独立した IP、数秒での起動です。MySQL-master: 5.7.29 // メイン サーバー MySQL-master IP: 172.17.0.3
MySQL-slave: 5.7.29 // サーバーからの MySQL-slave IP: 172.17.0.4

ステップ

ステップ1: 2つのMySQLサーバーを準備する
mysql-master (マスターサーバー):
1. ディレクトリ構造を作成します。
マスター/conf、マスター/データ、マスター/ログ
2. 実行中のインスタンス コンテナを起動します。
docker run --name mysql-master
> -p 3310:3306
> -v ~/docker/master/conf:/etc/mysql/conf.d
> -v ~/docker/master/data:/var/lib/mysql
> -v ~/docker/master/logs:/var/log/mysql
> -e MYSQL_ROOT_PASSWORD=123456
> -d mysql:5.7
3. コンテナに入る docker exec -it mysql-master bash
4. MySQLにログインする
mysql -uroot -p
mysql-slave (スレーブサーバー):
1. ディレクトリ構造を作成します。
スレーブ/conf、スレーブ/データ、スレーブ/ログ
2. 実行中のインスタンス コンテナを起動します。
docker run --name mysql-slave
> -p 3310:3306
> -v ~/docker/slave/conf:/etc/mysql/conf.d
> -v ~/docker/slave/data:/var/lib/mysql
> -v ~/docker/slave/logs:/var/log/mysql
> -e MYSQL_ROOT_PASSWORD=123456
> -d mysql:5.7
3. コンテナに入る docker exec -it mysql-slave bash
4. MySQLにログインする
mysql -uroot -p
ステップ2: 設定ファイル(my.cnf)を変更する
プライマリサーバー:

[mysqld]
ポート = 3306
サーバーID = 1
#同期するデータベース binlog-do-db = school
#バイナリログファイルを生成するには、マスターサーバーでlog-bin = mysql-binを有効にする必要があります

MySQLを再起動します: docker restart mysql-master
サーバーから:

[mysqld]
ポート = 3306
サーバーID = 2
#同期するデータベース binlog-do-db = school
#バイナリログファイルを生成するには(サーバーからのオプション)
ログ bin = mysql bin

MySQLを再起動します: docker restart mysql-slave
ステップ3: マスターサーバーのレプリケーションユーザーと関連する権限を作成する
create user 'slave'@'%' identified by '123456'; //ユーザーを作成 grant replication slave,replication client on *.* to 'slave'@'%'; //ユーザー権限を設定 flush privileges; //権限を更新 show grants for 'slave'@'%'; //ユーザー権限を表示
ステップ4: データのバックアップと同期
1. マスターにログインし、テーブルロック操作mysql -uroot -pを実行します。
読み取りロック付きでテーブルをフラッシュします。
2. マスターで同期する必要があるDBのデータをダンプします。mysqldump -uroot -p school > school.dump
3. スレーブにデータをインポートする
mysql -uroot -h172.17.0.4 -p 学校 < 学校.dump
4. マスターのロックを解除する
テーブルのロックを解除します。
ステップ5: マスターサーバーのレプリケーションステータス
1. 新しいデータテーブルを作成し、データを追加します。create table user( id int(10) auto_increment, name varchar(30), primary key (id) )charset=utf8mb4;
ユーザー(名前)値(222)に挿入します。
2. マスター サーバーの binlog レコードのステータス mysql> show master status;
+------------------+----------+--------------+------------------+------------------+
| ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------+
| mysql-bin.000001 | 769 | 学校 | | |
+------------------+----------+--------------+------------------+------------------+

ステップ6: サーバーからコピーを開始する
1. マスターサーバーに接続し、レプリケーションの開始ノードを設定します。mysql> マスターをmaster_host='172.17.0.3'に変更します。
-> マスターポート=3306、
-> マスターユーザー='スレーブ'、
-> マスターパスワード='123456',
-> マスターログファイル='mysql-bin.000001',
-> マスターログ位置 = 769;
2. レプリケーションを開始します。スレーブを起動します。
3. レプリケーションステータスを確認する mysql> show slave status \G
************************** 1. 行 ****************************
Slave_IO_State: マスターがイベントを送信するのを待機中
マスターホスト: 172.17.0.3
マスターユーザー: スレーブ
マスターポート: 3306
接続再試行: 60
マスターログファイル:mysql-bin.000001
読み取りマスターログ位置: 961
リレー ログ ファイル: 87dc5224655d-relay-bin.000003
リレーログ位置: 320
リレーマスターログファイル: mysql-bin.000001
Slave_IO_Running: Yes //I/O スレッドが正常に読み取りを行ったことを示します Slave_SQL_Running: Yes //SQL スレッドが正常に実行されたことを示します Replicate_Do_DB:
レプリケート_無視_DB:
テーブルの複製:
無視テーブルを複製:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
最終エラー番号: 0
最終エラー:
スキップカウンタ: 0
実行マスターログポジション: 961
リレーログスペース: 892
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: 45540733-4e0c-11ea-b0ac-0242ac110003
マスター情報ファイル: /var/lib/mysql/master.info
SQL_遅延: 0
SQL_残り遅延: NULL
Slave_SQL_Running_State: スレーブはすべてのリレーログを読み取りました。さらに更新を待機しています。
マスター再試行回数: 86400
マスターバインド:
最終IOエラータイムスタンプ:
最終SQLエラータイムスタンプ:
マスターSSL証明書:
マスターSSLCrlパス:
取得済み_Gtid_Set:
実行されたGtidセット:
自動位置: 0
Replicate_Rewrite_DB:
チャンネル名:
マスター TLS バージョン:
4. データテーブルを表示する datamysql> show create table user\G
************************** 1. 行 ****************************
テーブル: ユーザー
テーブルの作成: CREATE TABLE `user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(30) デフォルト NULL,
主キー (`id`)
) エンジン=InnoDB AUTO_INCREMENT=2 デフォルト文字セット=utf8mb4

mysql> ユーザーから * を選択します。
+----+------+
| ID | 名前 |
+----+------+
| 1 | 222 |
+----+------+
コピー制御関連のコマンド:
stop salve //スレーブ接続を停止 reset slave //スレーブ接続をリセット start slave //スレーブ接続を開く stop master //マスター接続を停止 reset master //マスター接続をリセット start master //マスター接続を開く
ステップ7: マスターサーバーとスレーブサーバーのプロセスを確認する
mysqlマスター:

mysqlスレーブ:

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • Mysqlマスタースレーブ同期の実装原理
  • MySQL マスタースレーブ構成の解釈とその原理分析 (マスタースレーブ)
  • MySQL マスタースレーブレプリケーションの役割と動作原理の詳細な説明
  • MySQL マスタースレーブの原理と構成の詳細
  • MySQL マスタースレーブ同期原理の紹介
  • MySQL の例 DTID マスタースレーブ原理の分析

<<:  vue3.0+echarts は 3 次元の縦棒グラフを実現します

>>:  docker run 起動パラメータ コマンドを表示する方法 (推奨)

推薦する

Docker のインストールと構成イメージの高速化の実装

目次DockerバージョンCentOS に Docker エンジンをインストールするシステム要件古い...

MySQL 8.0.15 winx64 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.15のインストールと設定方法を参考までに紹介します。具体的な内容は...

ハイパーリンクの表示と開き方

<br />関連記事: ハイパーリンクを表示して開く方法症状<br />ユー...

MySQLに必要な共通知識のまとめ

目次主キー制約一意の主キー非 Null 制約デフォルトの制約外部キー制約1NF 2NF 3NFデータ...

IE8互換表示(IE7モード)とスタンドアロンIE7の違いの詳細な説明

1つ。 IE8 互換表示の概要<br />新しいバージョンのブラウザが古い Web サイ...

CentOS 8.1 で LEMP (Linux+Nginx+MySQL+PHP) 環境を構築する (チュートリアルの詳細)

目次ステップ1: CentOS 8でパッケージを更新するステップ2: CentOS 8にNginx ...

k8sとDockerの関係についての簡単な説明

最近、プロジェクトでは kubernetes (以下、k8s と表記、k と s の間には 8 つの...

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明

MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明以下は私が作成した M...

Vueデータ変更検出の基本的な実装の簡単な分析

目次1. オブジェクトの変更検出2. オブジェクトに関する質問配列変更検出3.1 背景3.2 実装I...

ボタンのタイプが送信として指定されていません。ボタンをクリックしても、指定された URL にジャンプしません。

現在、プロジェクトの要件により、フォームの送信を制御し、送信前にデータを検証および処理するために j...

TSで最も一般的な宣言マージ(インターフェースマージ)

目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...

Zabbix動的実行監視収集スクリプトの実装原理

Zabbix カスタム スクリプトを使用して監視データを収集する場合、通常、次の問題が発生します。サ...

Apple の携帯電話のロックを解除するときに光沢のあるフォント効果を実現するために CSS3 を使用する例

0. はじめに2016 年 8 月 18 日 今日、iPhone をスライドさせてロックを解除すると...

HTML のキャンバスに基づくスクリーンショットのデモ

冒頭に書いた以前、Renren で JS ベースのスクリーンショット ソリューションについて説明した...

SQL文のパフォーマンスを分析するための標準的な要約

この記事では、explain を使用して SQL ステートメントを分析する方法を紹介します。実際、イ...