MySQL マスタースレーブレプリケーションの詳細な分析

MySQL マスタースレーブレプリケーションの詳細な分析

序文:

MySQL では、マスター/スレーブ アーキテクチャが最も基本的かつ最も一般的に使用されるアーキテクチャになります。その後の読み取り/書き込み分離、マルチアクティブ高可用性アーキテクチャなどは、主にマスター/スレーブ レプリケーションに依存します。マスタースレーブ レプリケーションも、MySQL 学習プロセスに欠かせない要素です。マスタースレーブ レプリケーションに関する記事は数多くあります。私もこの面について楽しく書いて、自分の経験と方法を共有したいと思います。

1. マスタースレーブレプリケーションの概要と原理

マスタースレーブ レプリケーション (AB レプリケーションとも呼ばれます) とは、1 つのサーバーがマスター データベース サーバーとして機能し、別のサーバーまたは複数のサーバーがスレーブ データベース サーバーとして機能することを意味します。マスター サーバーのデータは、スレーブ サーバーに自動的にコピーされます。マルチレベルレプリケーションでは、データベース サーバーはマスターとスレーブの両方として機能できます。 MySQL はデフォルトで非同期レプリケーションを使用します。

マスタースレーブレプリケーションのプロセスと原理は、次のように要約できます。

  1. マスター サーバーは、データの変更をバイナリ ログに記録します。マスター上のデータが変更されると、その変更がバイナリ ログに書き込まれます。
  2. スレーブ サーバーは、一定の時間間隔でマスター バイナリ ログが変更されたかどうかを検出します。変更された場合は、I/O スレッドを開始してマスター バイナリ イベントを要求します。
  3. 同時に、マスター ノードは各 I/O スレッドのダンプ スレッドを開始し、バイナリ イベントを送信してスレーブ ノードのローカル リレー ログに保存します。スレーブ ノードは SQL スレッドを開始し、リレー ログからバイナリ ログを読み取り、ローカルで再生して、マスター ノードのデータと一致するようにします。

2. バイナリファイルの場所に基づいてマスタースレーブレプリケーションを構成する

バイナリ ファイルの位置に基づくマスター スレーブ レプリケーションは、従来のレプリケーションとも呼ばれます。つまり、スレーブ サーバーはマスター サーバーの binlog ファイルの位置に依存します。マスター データベースのデータが変更されると、binlog の位置が増加し、スレーブ データベースは変更を感知して同期を完了します。

マスタースレーブレプリケーションを構成するには、まずマスターサーバーとして 1 つ、スレーブサーバーとして 1 つ、合計 2 つの MySQL インスタンスを準備する必要があります。マスター スレーブ レプリケーションは binlog に依存するため、マスター データベースで binlog が有効になっている必要があり、マスターとスレーブは異なる server_ids で構成されている必要があります。次に、構成プロセスの詳細な説明を示します。

2.1 マスタースレーブライブラリ構成パラメータを確認する

MySQL マスタースレーブサーバーには以下の構成が推奨されています。まずはこれを確認してください。設定されていない場合は、構成ファイルを変更して再起動する必要があります。

# メインライブラリパラメータ設定には次のパラメータが必要です vim /etc/my.cnf 
[mysqld] 
log-bin = binlog //バイナリログを有効にする server-id = 137 //サーバーの一意のID。デフォルト値は1で、通常はIPアドレスの最後の桁に設定されます binlog_format = row //レプリケーションエラーを防ぐために、バイナリログは行モードに設定されます # スレーブには次のパラメータが推奨されます vim /etc/my.cnf 
[mysqld] 
リレーログ = リレービン
サーバーID = 138

2.2 メインライブラリのバイナリの場所を決定し、同期アカウントを作成する

マスター データベースとスレーブ データベースが初期化されたばかりで、マスター データベースに操作がない場合、スレーブ データベースはマスター データベースのデータを同期する必要がなく、マスター データベースの binlog 位置を直接特定できます。

# メインライブラリの binlog ファイルの場所を表示します。show master status;

# メイン データベースに同期アカウントを作成します。create user 'repl'@'%' identified by '123456';
*.* のレプリケーションスレーブを 'repl'@'%' に付与します。

マスター データベースがしばらく実行されていてビジネス データがあり、スレーブ データベースが初期化されたばかりの場合は、マスター データベースのデータをバックアップしてからスレーブ データベースにインポートし、マスター データとスレーブ データの整合性を確保する必要があります。

# メイン データベースに同期アカウントを作成します。create user 'repl'@'%' identified by '123456';
*.* のレプリケーションスレーブを 'repl'@'%' に付与します。

# mysqldump -uroot -pxxxx -A -R -E --single-transaction --master-data=2 > all_db.sql

# データベースからmysqlを復元 -uroot -pxxxx < all_db.sql

# メインライブラリのbinlogの場所はバックアップファイルから確認できます

2.3 スレーブデータベースに入り、マスタースレーブレプリケーションを有効にする

マスター ライブラリ バイナリ ファイルの場所を見つけ、マスター スレーブ データの整合性を完了したら、マスター スレーブ レプリケーションを正式に開始できます。

# スレーブライブラリからMySQLコマンドラインを入力し、マスターライブラリに接続するためにマスター変更ステートメントを実行します # バイナリファイル名と位置は上記の手順から取得されます CHANGE MASTER TO MASTER_HOST='MySQLマスターサーバーのIPアドレス'、
 マスターポート=3306、
 MASTER_USER='repl',
 マスターパスワード = '123456'、
 MASTER_LOG_FILE='binlog.000002',
 マスターログPOS = 154;
 
# マスタースレーブレプリケーションを開始し、ステータスを維持します start slave;
スレーブステータスを表示 \G //スレーブステータスをチェックして、Slave_IO_Running: Yes、Slave_SQL_Running: Yes であることを確認します。

3. GTIDに基づくマスタースレーブレプリケーション

GTID は MySQL 5.6 の新機能です。正式名称は Global Transaction Identifier で、MySQL のマスターとスレーブの切り替えとフェイルオーバーを簡素化できます。 GTID は、binlog 内のトランザクションを一意に識別するために使用されます。トランザクションがコミットされると、MySQL サーバーはまず、次のトランザクションの GTID を指定する GTID_Event タイプの特別な Binlog イベントを書き込み、次にトランザクションの Binlog を書き込みます。

GTID ベースのレプリケーションでは、スレーブ サーバーは最初にマスター サーバーにスレーブ サーバーで実行されたトランザクションの GTID 値を伝えます。次に、マスター データベースはスレーブ データベースで実行されていないすべてのトランザクションをスレーブ データベースに送信して実行します。GTID を使用したレプリケーションでは、指定されたスレーブ データベースで同じトランザクションが 1 回だけ実行されるようにできるため、オフセットの問題によるデータの不整合を回避できます。つまり、カスケード状況でも、1 つのマスターと複数のスレーブの状況でも、以前のように File_name と File_position を通じてメイン ライブラリの binlog の位置を見つける必要がなく、GTID を通じて位置を自動的に見つけることができます。

GTID に基づくマスター スレーブ レプリケーションは、上記のバイナリ ファイルの場所に基づくマスター スレーブ レプリケーションに似ています。以下は、セットアップ プロセスの簡単なデモンストレーションです。

3.1 マスタースレーブライブラリ構成を確認し、GTIDを有効にする

# メインライブラリパラメータ設定には次のパラメータが必要です vim /etc/my.cnf 
[mysqld] 
サーバーID = 137
ログビン = binlog 
binlog_format = 行 
gtid-mode = ON //gtid モードをオンにするenforce-gtid-consistency = ON //gitd 起動後のトランザクションのセキュリティを確保するために gtid の一貫性を強制する # ライブラリ vim /etc/my.cnf から次のパラメータを設定することをお勧めします 
[mysqld] 
サーバーID = 138
ログビン = binlog 
binlog_format = 行 
gtidモード = オン 
強制GTID一貫性 = ON 
リレーログ = リレービン

3.2 マスターとスレーブのデータベースデータの一貫性を保つために同期アカウントを作成する

マスター データベースが初期化されたばかりの場合、またはすべてのバイナリ ファイルがマスター データベースに保持されている場合は、データをスレーブ データベースと手動で同期する必要はありません。それ以外の場合は、マスターとスレーブの一貫性を保つためにデータを手動で同期する必要があります。

# メイン データベースに同期アカウントを作成します。create user 'repl'@'%' identified by '123456';
*.* のレプリケーションスレーブを 'repl'@'%' に付与します。

# マスターデータベースが初期化されたばかりの場合、または完全なバイナリファイルがある場合は、次の手順を実行する必要はありません。# マスターデータベースデータの完全バックアップ mysqldump -uroot -pxxxx -A -R -E --single-transaction > all_db.sql
# データベースからmysqlを復元 -uroot -pxxxx < all_db.sql

3.3 スレーブデータベースに入り、マスタースレーブレプリケーションを有効にする

# スレーブライブラリからMySQLコマンドラインを入力し、マスターライブラリに接続するためにマスター変更ステートメントを実行します。CHANGE MASTER TO MASTER_HOST='MySQLマスターサーバーのIPアドレス'、
 マスターポート=3306、
 MASTER_USER='repl',
 マスターパスワード = '123456'、
 マスター自動位置 = 1;
 
# マスタースレーブレプリケーションを開始し、ステータスを維持します start slave;
スレーブステータスを表示 \G

4. 経験と提案

日々の勉強と仕事の過程で、マスタースレーブレプリケーションの経験も蓄積してきました。ここでいくつかの簡単なポイントを共有します。落とし穴を避けられることを願っています。

  • マスター側とスレーブ側の両方のデータベース バージョンは、可能な限り一貫性を保つ必要があります。
  • 文字セットや sql_mode など、マスター データベースとスレーブ データベースのパラメータは同じにすることをお勧めします。
  • サーバー パフォーマンスによるマスター スレーブ間の遅延を回避するために、スレーブ サーバーのパフォーマンスはマスター サーバーに比べて大幅に遅れることはできません。
  • 主キーのないテーブルをスレーブ データベースに同期すると、マスター スレーブ間の遅延が発生する可能性が非常に高いため、すべてのテーブルに主キーが必要です。
  • スレーブ データベース データの操作における人為的エラーを防ぐために、スレーブ データベースを読み取り専用に設定することをお勧めします。
  • マスターとスレーブ間の遅延とステータスを監視し、同期の中断や遅延をタイムリーに解決します。

要約:

この記事では、マスタースレーブレプリケーションの原理と構築プロセスを紹介します。実際には、マスタースレーブレプリケーションについてはまだ多くのコンテンツがあり、継続的な学習が必要です。ここでは、GTID モードを使用してマスタースレーブ レプリケーションを構築することを推奨します。この後で共有する経験も、私の日々の蓄積です。皆さんの参考になれば幸いです。書くのは簡単ではありません。良いと思ったらシェアしてください。

上記はMySQLマスタースレーブレプリケーションの詳細な分析です。MySQLマスタースレーブレプリケーションの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL マスタースレーブレプリケーション構成プロセス
  • MySQL マスタースレーブレプリケーションの原理からインストールと設定までを包括的に解説します。
  • MySQL 4 の一般的なマスタースレーブレプリケーションアーキテクチャ
  • MySQL マスタースレーブレプリケーションのいくつかのレプリケーション方法の概要
  • MySQL マスタースレーブレプリケーションの原理と実践の詳細な説明
  • Windows で MySQL マスター スレーブ レプリケーションを構成する方法
  • MySQL マスタースレーブレプリケーションの役割と動作原理の詳細な説明
  • MySQLデータベースのマスタースレーブレプリケーションの長い遅延に対する解決策
  • MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要
  • MySQL マスタースレーブレプリケーションスレッドの状態遷移に関する詳細な理解
  • MySQL マスタースレーブレプリケーションの遅延の原因と解決策

<<:  Vue プロジェクトで TypeScript クラスを適用する方法

>>:  Linux usermod コマンドの使用

推薦する

MySQL の union と union all の簡単な分析

データベースでは、UNION キーワードと UNION ALL キーワードの両方が 2 つの結果セッ...

MySQL 集計関数のネストされた使用操作

目的: MySQL 集計関数のネストされた使用集計関数は直接ネストできません。例: max(coun...

Linux 上の Vim で色とテーマを変更する方法

Vim は Linux でよく使用されるテキスト エディターです。 Vim は、Sublime や ...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

MySQLパーティションテーブルの詳細な説明

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...

MySQL 8.0.11 圧縮版のインストールチュートリアル

この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...

jwtを使用してノードによって生成されたトークンをどこに保存するかについての簡単な説明

A: 通常はクライアントに保存されます。 jwt または JSON Web Token は、リクエス...

JS の compose 関数と pipe 関数の使い方の詳細な説明

目次作成機能配列プロトタイプの削減Array.prototype.reduceRightパイプ関数作...

mysql バックアップ スクリプトを作成し、7 日間保存します。

スクリプトの要件: MySQL データベースを毎日バックアップし、スクリプトを 7 日間保存します。...

Vue が学ぶべき知識ポイント: forEach() の使用

序文フロントエンド開発では、目的のコンテンツを取得するためにループをトラバースする必要がある状況に頻...

CSSはBEM命名規則の実践を使用する

クラスを見るとき、どのような情報を得たいですか?このクラスはどこで使用され、その機能は何ですか?この...

Linuxフラッシュのインストール方法

Linuxにフラッシュをインストールする方法1. Flashの公式サイトにアクセスし、ダウンロードを...

Vueはシンプルなショッピングカートの例を実装します

この記事では、参考までに、シンプルなショッピングカートケースを実装するためのVueの具体的なコードを...

MySQLで負荷分散を実装する方法

序文MySQL は、クライアント/サーバー構造に基づく、高速、高性能、マルチスレッドのオープン ソー...

Zabbixは複数のmysqlプロセスの監視を実装します

1 つのサーバー上で 3 つの MySQL インスタンス プロセスが開始され、それぞれ異なるポート ...