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 権限制御の詳細分析

目次1. グローバルレベル2. データベースレベル3. 表面レベル4. 列レベルの権限5. サブルー...

MySQL シャーディング入門ガイド

序文リレーショナル データベースは、システムのボトルネックになる可能性が高くなります。単一のマシンの...

CSS 要素を表示および非表示にする 9 つの方法

Web ページの制作では、要素の表示と非表示は非常に一般的な要件です。この記事では、要素を表示したり...

CSS を使用して半透明の背景と不透明なテキストを実現する例

この記事では、CSS を使用して半透明の背景と不透明なテキストの効果を実現する方法の例を紹介します。...

マップタグパラメータの詳細な紹介と使用例

マップ タグはペアで表示する必要があります。 <map> ....</map>...

Centos7でポートを開く方法

CentOS7 のデフォルトのファイアウォールは iptables ではなく、firewalle で...

フロントエンドの面接でよく聞かれる JavaScript の質問の完全なリスト

目次1. 手書きのインスタンス2.配列のマップメソッドを実装する3. Reduceは配列のmapメソ...

CSS: 訪問した疑似クラスセレクタの秘密の記憶

昨日、a:visited を使用して「Guess You Like」の右側にある訪問済みテキストの色...

React のクラスからフックへの移行

目次リアクトフック序文なぜフックなのか?クラス関数クラスとフックの比較フックはコンポーネントの状態を...

Vue3 を使用して虫眼鏡効果を実現する方法の例

目次序文1. カプセル化の重要性2. どのようにカプセル化しますか? 1. 準備2. 梱包を開始する...

HTML マルチメディア アプリケーション: Web ページにフラッシュ アニメーションと音楽を挿入する

1. HTML_falshアニメーションでのマルチメディアの応用(WebページへのFlashアニメー...

Linux システムにおける時間設定の概要

1. 時間の種類は次のように分けられます。 1. ネットワーク時間(タイムゾーンの設定、ntpサーバ...

nginxを使用してドメイン名ベースの仮想ホストを構成する

1. 仮想ホストとは何ですか?仮想ホストは、特殊なテクノロジーを使用して、実行中のサーバーを論理的に...

React Stateの状態とライフサイクルの実装方法

1. コンポーネントの実装方法:組件名稱首字母必須大寫1. JS関数を通じてコン​​ポーネントを実装...