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 起動パラメータ コマンドを表示する方法 (推奨)

推薦する

MySQL パフォーマンス最適化インデックス プッシュダウン

インデックス条件プッシュダウン (ICP) は MySQL 5.6 で導入され、クエリを最適化するた...

データベースアカウントのパスワード暗号化の詳細な説明と例

データベースアカウントのパスワード暗号化の詳細な説明と例データベースアカウントとパスワードはデータベ...

MySQLのユーザー権限の確認と管理方法の詳細な説明

この記事では、例を使用して、MySQL ユーザー権限を確認および管理する方法を説明します。ご参考まで...

Linux で仮想コンソール セッションをロックする方法

共有システムで作業しているときは、他のユーザーが自分のコンソールを覗き込んで、自分が何をしているか見...

CentOS 8.0.1905 は ZABBIX 4.4 バージョンをインストールします (検証済み)

Zabbix サーバー環境プラットフォームバージョン: ZABBIX バージョン 4.4システム:...

WeChat アプレット開発フォーム検証 WxValidate の使用

個人的には、WeChat アプレットの開発フレームワークは VUE と概ね似ていると感じていますが、...

Antd+vueは円形属性フォームの動的検証のアイデアを実現します

必要な項目をループして検証するために、クエリ フォームのいくつかのプロパティを実装したいと考えていま...

MySQL の永続性とロールバックの原理を 1 つの記事で理解する

目次再実行ログディスクデータを直接更新するのではなく、最初にメモリデータを更新する必要があるのはなぜ...

MySQLはテーブル内のフィールドを別のテーブル内のフィールドの値と等しくなるように更新します

以下のように表示されます。 table1 を z として更新し、table2 を zb として結合し...

Struts2 ジャンプ後に CSS と JS が無効になる問題の解決策のアイデアと実装手順

struts2 アクションの実行後にジャンプした jsp が表示されると、css が機能しません。問...

きちんとした標準的なHTMLタグの書き方を学ぶ

優れた HTML コードは美しい Web サイトの基礎となります。私が CSS を教えるときは、まず...

CSS 表示属性のインラインブロックレイアウト実装の詳細な説明

CSS 表示プロパティ注: !DOCTYPE が指定されている場合、Internet Explore...

Truncate Table の使用法の説明

テーブルを切り捨てる個々の行の削除をログに記録せずに、テーブル内のすべての行を削除します。文法 テー...

Winows Server 2019 アクティベーション コードとボリューム ライセンス エディション KMS インストール キー GVLK

最近、社内文書の整理とファイルサーバーの構成を予定しています。以前はサーバー2003を使い慣れていま...

Linux スワップメモリ​​を拡張する方法

スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...