MySQL の準同期レプリケーションについての簡単な説明

MySQL の準同期レプリケーションについての簡単な説明

導入

MySQL はレプリケーションを通じてストレージ システムの高可用性を実現します。現在、MySQL は次のレプリケーション方法をサポートしています。

  1. 非同期レプリケーション: 原理は最も単純で、パフォーマンスは最高です。ただし、プライマリ サーバーとバックアップ サーバー間のデータが不整合になる可能性が高くなります。
  2. 半同期レプリケーション: 非同期レプリケーションと比較すると、半同期レプリケーションでは一定のパフォーマンスが犠牲になり、プライマリ サーバーとスタンバイ サーバー間のデータの一貫性が向上します (場合によっては、プライマリ データとスタンバイ データは依然として不整合のままになります)。
  3. グループ レプリケーション: Paxos アルゴリズムに基づいて、分散データ レプリケーションの強力な一貫性を実現します。大多数のマシンが稼働している限り、システムは利用可能であることが保証されます。半同期レプリケーションと比較すると、グループ レプリケーションではデータの一貫性とシステムの可用性が高くなります。

この記事では主に MySQL の準同期レプリケーションについて説明します。

準同期レプリケーションの基本プロセス

MySQL 準同期レプリケーションの実装は、MySQL 非同期レプリケーションに基づいています。 MySQL は、AFTER_SYNC と AFTER_COMMIT (rpl_semi_sync_master_wait_wait_point によって制御) というわずかに異なる 2 種類の半同期レプリケーションをサポートしています。

半同期レプリケーションが有効になっている場合、マスターはスレーブの応答またはタイムアウトを待ってから戻ります。スレーブがタイムアウトすると、半同期レプリケーションは非同期レプリケーションに退化します。これは、MySQL の半同期レプリケーションでも発生する問題です。この記事では、Salve がタイムアウトする状況については説明しません (非同期レプリケーションについては説明しません)。

準同期レプリケーションの基本プロセス AFTER_SYNC モード

AFTER_SYNC モードは、MySQL 5.7 でサポートされている半同期レプリケーション モードであり、MySQL 5.7 のデフォルトの半同期レプリケーション モードでもあります。

  • ストレージ エンジンでトランザクションを準備します。
  • トランザクションを binlog に書き込み、binlog をディスクにフラッシュします。
  • 少なくとも 1 つのスレーブがトランザクションの binlog イベントの受信を確認するまで待機します。
  • トランザクションをストレージ エンジンにコミットします。

準同期レプリケーションの基本プロセス AFTER_COMMIT モード

MySQL 5.5 および 5.6 の半同期レプリケーションは AFTER_COMMIT のみをサポートします。

  • ストレージ エンジンでトランザクションを準備します。
  • トランザクションを binlog に書き込み、binlog をディスクにフラッシュします。
  • トランザクションをストレージ エンジンにコミットします。
  • 少なくとも 1 つのスレーブがトランザクションの binlog イベントの受信を確認するまで待機します。

AFTER_SYNCとAFTER_COMMITの概要

AFTER_SYNC: ログがスレーブにコピーされた後、マスターは再度コミットします。
マスターでコミットされたすべてのトランザクションがスレーブにコピーされました。
スレーブにコピーされたすべてのトランザクションがマスターによってコミットされない場合があります (たとえば、ログをスレーブにコピーした後、コミットする前にマスターがクラッシュした場合)

AFTER_COMMIT: マスターがコミットした後、ログがスレーブにコピーされます。
マスターでコミットされたすべてのトランザクションが必ずしもスレーブにコピーされるわけではありません。 (たとえば、マスターがコミットした後、ログをスレーブにコピーする前にクラッシュします)
スレーブにコピーされたすべてのトランザクションは、マスターでコミットされる必要があります。
明らかに、マスターがクラッシュした場合、AFTER_COMMIT はデータの一貫性を保証することはできません (マスターがコミットした後、ログをスレーブにコピーする前にクラッシュします)。この記事では、AFTER_SYNC モードについてのみ説明します。
MySQL 5.7.3 では、半同期レプリケーションが待機するスレーブ応答の数を構成する機能 (rpl_semi_sync_master_wait_slave_count) がサポートされています。

AFTER_SYNCモードでの異常状況の分析

異常事態 1: マスターがダウンした後、マスター・スレーブ切り替えが発生します。

マスターはトランザクション T を実行します。トランザクション T のバイナリログをハードディスクにフラッシュする前に、マスターがクラッシュします。スレーブがマスターにアップグレードされます。マスターが再起動されると、クラッシュリカバリによってトランザクション T がロールバックされます。プライマリ データとバックアップ データは一致しています。

マスターはトランザクション T を実行します。トランザクション T のバイナリログをハードディスクにフラッシュした後、スレーブから ACK を受信する前に、マスターがクラッシュします (保留中のログがあります)。スレーブがマスターにアップグレードされます。

2.1 スレーブはトランザクション T のバイナリログを受信して​​いません。マスターが再起動すると、クラッシュリカバリによって保留中のログが直接送信されます。プライマリデータとバックアップデータが矛盾しています。

2.2 スレーブはトランザクション T のバイナリログを受信しました。プライマリ データとバックアップ データは一致しています。

異常事態 2: マスターがクラッシュした後、ホストが切り替わりません。例外ケース 1 の 2.1 を検討してください。

マスターが再起動すると、pendinglog が直接送信されます。この時点では、マスターとスレーブのデータは不一致です。

スレーブはマスターに接続し、非同期レプリケーションを通じてトランザクション T のバイナリログを取得します。プライマリ データとバックアップ データは一致しています。
スレーブにはトランザクション T のバイナリログをコピーする時間がありませんでした。マスターが再度クラッシュすると、ディスクが破損します。マスターとスレーブのデータが矛盾しており、トランザクション T のデータが失われます。
異常事態への対応

上記の異常な状況の簡単な分析から、半同期レプリケーションでは、マスターがクラッシュして再起動し、保留中のログ (スレーブが応答していないバイナリログ) があるという特殊な状況を処理する必要があることがわかります。

マスターに障害が発生し、マスター スレーブの切り替えが実行されない状況の場合:

クラッシュからの回復後、マスターはスレーブ接続を待機し、少なくとも 1 つのスレーブがコミットされたすべてのトランザクションのバイナリ ログを複製するまで複製します。 (マスターでは SHOW MASTER STATUS、スレーブでは SELECT master_pos_wait())。

マスターに障害が発生し、マスター スレーブの切り替えが実行される状況の場合:

古いマスターが再起動された後、クラッシュ回復中に pendinglog がロールバックされます。 (マスターのバイナリログのコピーされていない部分を手動で切り捨てますか?)

考える

マスターが再起動した後、クラッシュ回復プロセス中に、スレーブの応答を要求しようと再試行するのではなく、pendinglog を直接コミットするのはなぜですか?

MySQL の非同期レプリケーションと半同期レプリケーションはどちらもスレーブによってトリガーされ、スレーブはマスターにアクティブに接続して binlog を同期します。

マスターとスレーブの切り替えは行われず、マシンの再起動後にどのマシンがスレーブであるかを知ることはできません。
マスターとスレーブの切り替えが発生すると、マスターではなくなり、スレーブは接続されなくなります。そのまま待つと正常に動作しなくなります。

要約する

MySQL の半同期レプリケーションには次の問題があります。

  1. スレーブがタイムアウトすると、非同期レプリケーションに移行します。
  2. マスターに障害が発生すると、データの一貫性が保証されず、手動処理が必要になります。
  3. レプリケーションはシリアルです。

MySQL にはマスターとスタンバイ データの一貫性に関する問題があり、インターネット ビジネスの 7*24 高可用性サービスに影響を与えるため、大手企業は独自の「パッチ」をリリースしました。Tencent の TDSQL、WeChat の PhxSQL、Alibaba の AliSQL、NetEase の InnoSQL などです。

MySQL は、MySQL 5.7 で新しいレプリケーション モードである MySQL グループ レプリケーションを正式にリリースしました。

参考文献

MySQL 準同期レプリケーションのデータ一貫性に関する議論

MySQL 高可用性ソリューション

MySQL 5.7.2 でのロスレス準同期レプリケーション

強化された準同期レプリケーション

以下もご興味があるかもしれません:
  • MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要
  • MySQL 半同期レプリケーションの原理構成と導入の詳細な説明
  • MySQL の半同期レプリケーションの原理とトラブルシューティング
  • 半同期および非同期のMySQLマスタースレーブレプリケーション構成の詳細な分析
  • MySQLの半同期の詳細な説明

<<:  Centos7 に PHP と Nginx をインストールする詳細なチュートリアル

>>:  Vue はブラウザのパスワード記憶機能を無効にするサンプル コードを実装します

推薦する

Vue の 2 択タブバー切り替えの新しいアプローチ

問題の説明プロジェクトに取り組んでいるときに、タブ バーの切り替え効果を作成する必要がある場合があり...

MySQL マルチインスタンス構成のアプリケーションシナリオ

目次MySQL 複数インスタンスマルチインスタンスの概要マルチインスタンスとは何ですか?複数のインス...

MySQL の自動増分主キーが使い果たされた場合の対処方法

面接では、次のようなシナリオを経験する必要があります。インタビュアー: 「MySQL を使用したこと...

HTMLでカスタムタグを使用する方法

カスタム タグは XML ファイルと HTML ファイルで自由に使用できますが、いくつか注意すべき点...

MySQL のユーザー権限を照会する方法の概要

MySQLユーザー権限を表示する2つの方法を紹介します1. MySQL grantsコマンドを使用す...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴

概要中小規模のプロジェクトでは、特にレポートを作成するときに、結合テーブル クエリが非常に一般的な操...

Dockerイメージを構築する2つの方法

目次既存のイメージからイメージを更新します。イメージを最初から構築する: Docker イメージ リ...

Uniapp は DingTalk スキャンコード ログイン サンプル コードを実装します

UniappにはDingTalk認証ログインがないため、この記事ではDingTalk QRコードログ...

JavaScript配列の重複排除のいくつかの方法についての詳細な説明

目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...

VMware に Centos8 をインストールする詳細なチュートリアル

CentOS公式サイトアドレスhttps://www.centos.org/まず必要なファイルをダウ...

Docker クロスホストネットワークの実装 (手動)

1. Macvlan の紹介Macvlan が登場する前は、イーサネット カードに複数の IP ア...

CSS を使用して fullpage.js のフルスクリーン スクロール効果を実装するサンプル コード

最近 CSS を勉強していたとき、 2 つの CSS プロパティだけを使用して全画面スクロール効果を...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

CSS3 で作成した本のページめくり効果

結果:実装コード: html <!-- よろしければハートを付けてください! --> &...