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

推薦する

Vue検証コードコンポーネントの使い方の詳しい説明

この記事の例では、vue検証コードコンポーネントで使用される具体的な実装コードを参考までに共有してい...

Node.js で Bash スクリプトを書くための究極のソリューション

目次序文zxライブラリ$`コマンド` CD()フェッチ()質問()寝る()スローしない()チョークフ...

Node-Redを使用してMySQLデータベースに接続する方法

Node-red をデータベース (mysql) に接続するには、まずコンピューターに MySQL ...

MySQL 最適化の概要 - クエリエントリの合計数

1. COUNT(*) と COUNT(COL) COUNT(*)は通常、主キーに対してインデックス...

MySql テーブル、データベース、シャーディング、パーティショニングの知識ポイントの紹介

1. はじめにデータベース内のデータ量が一定レベルに達すると、システムパフォーマンスのボトルネックを...

CSS疑似クラス名を数字で始めないでください

初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...

js でクラスセレクターと名前属性セレクターを実装する手順の例

jQuery の登場により、DOM の操作効率が大幅に向上し、開発がより高いレベルに引き上げられまし...

Centos7 への mysql8.0rpm のインストール チュートリアル

まず、図をダウンロードしてください 1. まず、centos7に付属しているmariadbをアンイン...

Linux カーネルの探究: Kconfig の秘密

Linux 構成/ビルド システムがどのように機能するかを深く理解します。 Linux カーネル構成...

VueでJSXを使用する方法

JSXとは何かJSX は Javascript の構文拡張であり、JSX = Javascript ...

Docker+jenkins+python3環境を使用して非常に詳細なチュートリアルを構築する

序文:自動化を記述した後、毎日サーバー上で実行する必要があります。このような問題に遭遇しました。Je...

jsのイベントオブジェクトを深く理解しましょう

JS でよく使用されるイベントは次の通りです。ページイベント: load;フォーカス イベント: フ...

エラー 1862 (HY000): パスワードの有効期限が切れています。ログインするには、..... を使用してパスワードを変更する必要があります。

エラーメッセージ:エラー 1862 (HY000): パスワードの有効期限が切れています。ログインす...

DockerコンテナにPythonアプリケーションをデプロイするプロセスの分析

シンプルなアプリケーションの展開1. ディレクトリ構造: └── Pythonpro #ディレクトリ...

CSS と HTML とフロントエンド テクノロジーのレイヤー図

フロントエンドテクノロジー層 (写真は少し極端ですが、参考までに) Javascript と DOM...