この記事では、MySQLのマスタースレーブ同期の原理を説明します。

この記事では、MySQLのマスタースレーブ同期の原理を説明します。

MySQL マスタースレーブ同期原理の簡単な分析

原理の説明を始める前に、まずは知識をまとめてみましょう。
マスタースレーブとは何か、なぜマスタースレーブが必要なのか、マスタースレーブをどのように実装するのか、MySQL マスタースレーブ同期の原理

1. マスタースレーブとは何ですか?

実際、マスター スレーブの概念は非常に単純です。ホストは、読み取りと書き込みに通常使用するサービスです。これをマスターと呼びます。
スレーブはホストの拡張機能です。通常は読み取りや書き込みには使用されません。これをスレーブと呼びます。
スレーブ上のデータは、何らかの形でホストから取得され、スレーブに書き込まれます。理論的には、スレーブは外部から直接データを取得することはできません。

2. 主従関係はなぜ必要なのでしょうか?

最も初期のマスター スレーブ システムはマスター スレーブ、つまりマスターがメイン マシンでスレーブがバックアップ マシンでした。初期のソフトウェアではデータ量と同時実行性が高くなかったためです。ホストは日常的な使用を完全にサポートできます。
したがって、マスタースレーブモードを通じてデータベースの高可用性が保証されます。マスターデータベースのダウンが検出されると、サービスのデータソースは自動的にバックアップデータベースに切り替わります。
ビジネスが発展するにつれて、単一のマスターではビジネスニーズをサポートできないことがわかったので、従来のマスター/スレーブ システムを拡張し始めました。


(1)マスター1台とスレーブ1台。スレーブはバックアップマシンとしてだけでなく、データソースを読み取るためのデータベースとしても機能します。業務サービスがデータを書き込むときはマスターマシンに書き込み、データを読み取るときはスレーブマシンから読み取ります。これにより、ホストへの負荷が軽減されます(2)1つのマスターと複数のスレーブ。マスターが書き込み、スレーブが読み取りを行った後、ビジネスクエリデータをサポートするときに単一のスレーブノードでは依然としてパフォーマンスのボトルネックがあることがわかったため、スレーブを水平に拡張して複数のスレーブを実現します。
(3)ダブルM
スレーブはマスターに昇格し、2つのマスターは互いにスレーブとなり、読み取りと書き込みの負荷を共有します。 (4) カスケードレプリケーション カスケードレプリケーションは、1つのマスターと複数のスレーブに似ていますが、セカンダリスレーブのデータソースがマスターではなくスレーブから取得される点が異なります。これは主に、スレーブの数が増えた後に同期データがホストのパフォーマンスに与える影響によるものです。(5)複数のマスターと1つのスレーブ。書き込みが多く読み取りが少ないシナリオでは、複数のマスターを使用してホストへの負荷を軽減し、1つのスレーブを使用して読み取り操作とデータバックアップを完了します。

3. マスタースレーブ同期を実現するにはどうすればいいですか?

マスター スレーブ同期は理解するのが難しすぎると考えないでください。実際には非常に簡単です。ソフトウェア エンジニアにとって必要なのは、コードを記述し、マスター データベースからデータを検索し、バックアップ データベースに接続して、そこにデータを書き込むことだけです。これは、最も理解しやすいマスター スレーブ同期です。
しかし、この方法はあまりにも大雑把でパフォーマンスも悪いため、MySQL 自体は、ホストからスレーブへのデータの効率的な同期を保証する完全なマスター スレーブ同期メカニズムを提供しています。
MySQL 独自のマスター スレーブ同期に加えて、業界には Alibaba の Canal など、それをサポートするコンポーネントもいくつかあります。これは主に、同期されたデータの解析など、より柔軟なデータ同期のためです。同期されたスレーブ マシンは、MySQL ではなく、他のストレージ サービスを使用する必要がなくなりました。

4. MySQLのマスタースレーブ同期の原理

MySQL 自体は、主に binlog ログを使用して、マスターとスレーブの同期を実装しています。
この記事の焦点では​​ないので、binlog ログについて簡単に説明します。
これは、MySQL が DB の変更を記録するために使用するログです。
たとえば、データの値が 0 から 1 に変更されます (DML ステートメント)
たとえば、テーブルが削除される(DDL文)
binlog には 3 つの形式があります。
(1)ステートメント:insert xxxxx...など、変更を引き起こした特定の操作ステートメントを記録します。
(2)行:データ行に基づきます。元のデータ行の値はxxからyyに変更されます。このタイプのデータ行は通常、より多くのスペースを占有します。
(3)混合:混合モードでは、サービス自体が変更の形式を決定します。
SQL 操作が binlog に書き込まれると、対応するディスク (フラッシュ ディスク) に書き込まれるのではなく、SQL 実行が成功したとみなされます。したがって、binlog 内の対応する値は、mysql のマッピングとして理解できます。mysql データの同期は、ディスク内のデータの同期とは異なりますが、必要なのは binlog ログの同期だけです。
具体的な同期の原則は次のとおりです。
(1)マスタースレーブ同期が設定された後(IP、ポート、サービスIDなどの関連操作が設定された後)
(2) 関連する変更がバイナリログに書き込まれます。 (3) マスターはスレッドを開始します: バイナリログ ダンプログ スレッド。 このスレッドは、SQL の変更があったことをスレーブに通知し、バイナリログの変更をスレーブに送信します。 (4) スレーブは要求を受信すると、スレッドを開始します: i/o スレッド。 このスレッドは、受信したバイナリログ ログをリレー ログ遅延ログにロードします。 (5) スレーブ内の別のスレッド: SQL スレッドがリレー ログの情報を読み取り、スレーブに更新します。 詳細については、下の図を参照してください。

CAP 理論 (ここでは明確ではありません) によれば、このアーキテクチャでは次のようなリアルタイムのデータ一貫性を保証することはできません。
1. ホストへの書き込み後、ホストはすぐにハングアップし、マスター/スレーブ切り替えが実行され、この時点でデータが失われる可能性があります。
2. マスターで書き込み操作が発生すると、スレーブのバイナリログへのデータの同期に遅延が発生します。そのため、スレーブにすぐにクエリを実行しても、データが見つからない場合があります。この状況の解決策は次のとおりです。
1. 半同期レプリケーションを有効にします。以前は、マスターとスレーブの同期情報は非同期であり、マスター データベースのロジックには影響しませんでした。半同期レプリケーションでは、ホストは、バイナリログが (少なくとも 1 つの) スレーブのリレー ログに書き込まれるのを待ってから、クライアントに返すことを決定します。
2. 機密データをホストに強制的に呼び出すが、これにより読み取りと書き込みの分離の概念が曖昧になるため、推奨されない。
3. ミドルウェア (チャネル) を使用します。一般的な原則としては、書き込み要求が発生すると、それがキャッシュに記録され、スレーブに同期する時間が推定されます。
マスター データベースにデータを書き込んでスレーブ データベースを照会する場合、キャッシュへの書き込みの推定時間を使用してスレーブ マシン上の時間が決定され、スレーブ データベースを待機するか、スレーブ データベースを直接照会するかが決定されます。

これで、MySQL マスター スレーブ同期原理の理解に関するこの記事は終了です。MySQL マスター スレーブ同期原理の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MYSQLデータベースのマスタースレーブ同期設定の実装手順
  • MySQL マスタースレーブレプリケーション 準同期レプリケーション
  • MySQL マスタースレーブ同期の原理と応用
  • Mysql データベースのマスタースレーブ同期構成
  • MySQLはマスタースレーブ同期を構築して操作を実装します

<<:  背景画像の配置におけるbackground-position属性の自己理解

>>:  HTMLページ間で値を渡す問題の解決策

推薦する

ウェブページのテキストデザインは、服を着た賢い女の子のようであるべきだ

<br />「この世に醜い女性はいない、あるのは怠惰な女性だけだ」これは女性の美のバイブ...

Docker で MySQL をデプロイする詳細なプロセス (Docker でデプロイされる一般的なアプリケーション)

以前にも紹介しました: docker (一般的なアプリケーションのデプロイ): docker dep...

HTML+CSS マージテーブル境界線サンプルコード

table タグと td タグに境界線を追加すると、デフォルトでは次のように二重境界線が使用されます...

JS が WeChat の「クソ爆弾」機能を実装

みなさんこんにちは、Qiufengです。最近、WeChatは新しい機能をリリースしました(WeCha...

スクロール画像バーを実現するための CSS サンプルコード

一部の Web サイトでは、画像が連続的にスクロールしているのをよく見かけます。この効果は、CSS ...

Dockerfile を使用して Docker イメージをカスタマイズする方法

Dockerfile を使用したイメージのカスタマイズイメージのカスタマイズとは、実際には各レイヤー...

更新SQL文に基づくMySQLロックの理解

序文MySQL データベース ロックは、データの一貫性を実現し、同時実行性の問題を解決するための重要...

MySQLの日付文字列タイムスタンプ変換の詳細な説明

時刻、文字列、タイムスタンプ間の変換は、日常生活でよく使用されます。よく使用されますが、私は使用する...

HTML埋め込みタグの使用方法と属性の詳細な説明

1. 基本的な文法コードをコピーコードは次のとおりです。埋め込み src=url注: 埋め込みはさま...

jQueryはシンプルなボタンの色の変更を実装します

HTML と CSS で、ボタンの色を設定したいとします。 目的の効果は得られますが、プロセスはかな...

サーバーストレステストの概念と方法 (TPS/同時実行性)

目次1 ストレステストの指標1.1 秒あたり1.2 クォータ1.3 平均処理時間(RT) 1.4 同...

Centos サーバーに MySql をデプロイし、Navicat に接続するプロセスの詳細な説明

(1)サーバー構成: [root@localhost ~]# cd /usr/local/src/ ...

Kubernetes YAMLファイルの使用

目次01 YAMLファイルの概要YAML---キー値型YAML---リスト型02 K8Sにおけるマス...

USE DB 輻輳に対する MySQL ソリューションの詳細な説明

障害に遭遇すると、障害の根本的な原因を考えるのではなく、障害を解決する方法を考えることがよくあります...

Dockerのローカルイメージ作成方法の分析

コンテナと呼ばれるものは、実際には親イメージに基づいて読み取りおよび書き込み可能なファイル階層を作成...