このページは機械翻訳によるものです。内容の正確さは保証しておりません。 人力翻訳を依頼する

MGR モードの概要

更新日時2025-03-27 16:31

MySQL グループレプリケーション (MGR) は、既存のバイナリロギングメカニズムに基づいて MySQL が提供する分散レプリケーションモードです。MGR モードは、Paxos プロトコルを使用して実装されます。RDS クラスタ版を実行する ApsaraDB RDS for MySQL インスタンスは、MGR をサポートしています。このトピックでは、MGR モードの利点と実装について説明します。また、AliSQL による MGR モードの安定性向上のための最適化についても説明します。

利点

次の表は、データの信頼性、データの整合性、グローバルトランザクションの整合性の観点から、MGR、準同期レプリケーション、非同期レプリケーションを比較したものです。

項目

MGR

準同期レプリケーション

非同期レプリケーション

項目

MGR

準同期レプリケーション

非同期レプリケーション

データの信頼性

★★★★★

★★★

データの整合性

確保済み

確保されていません

確保されていません

グローバルトランザクションの整合性

サポートされています

サポートされていません

サポートされていません

高いデータ信頼性

MGR モードでは、Paxos プロトコルの多数決ルールを使用してデータの信頼性を確保します。多数決ルールでは、RDS クラスタ内のほとんどのノードがトランザクションのバイナリログを受信した後にのみ、トランザクションをコミットできます。これにより、RDS クラスタ内の少数のノードに障害が発生した場合のデータ損失を防ぎます。

たとえば、RDS クラスタに 5 つのノードが含まれているとします。3 つのノードがトランザクションのバイナリログを受信し、2 つのノードはバイナリログを受信せず、2 つのノードに障害が発生しています。

  • 障害が発生したノードがバイナリログを受信した場合、バイナリログを受信したノードのうち少なくとも 1 つは正常に動作しています。

  • 障害が発生したノードがバイナリログを受信しなかった場合、バイナリログを受信した 3 つのノードは正常に動作しています。

強力なデータ 整合性

MGR モードでは、トランザクションは RDS クラスタ内の他のノードに送信され、バイナリログファイルに書き込まれてデータの整合性が確保されます。元のプライマリノードに障害が発生して再起動された場合、ノードは自動的に RDS クラスタに追加され、不足しているバイナリログは再起動されたノードに自動的に同期されて最新のデータが取得されます。

従来のプライマリセカンダリレプリケーションでは、トランザクションがバイナリログファイルに書き込まれた後、セカンダリノードに送信される前にプライマリノードに障害が発生した場合、データの不整合が発生する可能性があります。

グローバルトランザクションの整合性

MGR は、読み取り操作と書き込み操作の強力なグローバルトランザクション整合性をサポートしています。group_replication_consistency パラメータを設定して、整合性レベルを調整できます。

  • 強力な読み取り整合性セカンダリノードで group_replication_consistency=BEFORE 設定を使用します。この設定では、クエリより前に発生したすべてのトランザクションがプライマリノードで完了した後にのみ、クエリを実行できます。これにより、データの整合性が確保されます。

  • 強力な書き込み整合性プライマリノードで group_replication_consistency=AFTER 設定を使用します。この設定では、書き込みトランザクションは、すべてのノードで正常に適用された後にのみコミットできます。

デプロイ方法

  • マルチリーダー

    RDS クラスタ内のすべてのノードが読み取りリクエストと書き込みリクエストを処理できます。マルチリーダーモードは、RDS クラスタの書き込み機能を向上させるために使用されます。マルチリーダーモードでは、Paxos メカニズムを利用して複数のデータレコードを同時に書き込み、行レベルの競合を検出して、すべてのノードが同じ順序でデータを受信するようにします。

    RDS クラスタ内のノードの大部分が使用可能な場合、いずれかのノードの障害は、RDS クラスタの可用性に短時間影響します。

  • シングルリーダー

    RDS クラスタ内の 1 つのノードのみが書き込みリクエストを処理できます。RDS クラスタ内の他のノードは、読み取りリクエストのみを処理します。シングルリーダーモードでは、Paxos プロトコルのシングルリーダーレプリケーション戦略を利用して、読み取り機能を向上させ、RDS クラスタの高可用性を維持します。

    • RDS クラスタ内のノードの大部分が使用可能で、RDS クラスタ内のセカンダリノードに障害が発生した場合、RDS クラスタの可用性は影響を受けません。

    • プライマリノードに障害が発生した場合、RDS クラスタは Paxos プロトコルに基づいてプライマリ/セカンダリスイッチオーバーを自動的に完了し、強力なデータ整合性を確保します。

    ApsaraDB RDS for MySQL では、シングルリーダーモードで MGR モードを使用する RDS クラスタを作成できます。RDS クラスタでは、読み取り専用ノードが最適化され、RDS クラスタのパフォーマンスが向上し、高いデータ信頼性と強力なデータ整合性が確保されます。

アーキテクチャ

image

MGR のアーキテクチャは、MySQL のサーバー層とレプリカ層の下に次の層を持っています。

  • グループレプリケーションロジック層: MySQL のサーバー層と対話して、グループ通信システム (GCS) 層との間でトランザクションを送受信し、トランザクションを再生します。

  • GCS 層: メッセージの配信、障害の検出、クラスタメンバーの管理を行います。

  • XCom 層: Paxos プロトコルに基づいて開発され、データ順序の整合性とノードの大部分の可用性を確保します。

Paxos プロトコル

次のリストは、MGR モードにおける Paxos プロトコルの機能について説明しています。

  • クラスタ内のすべてのノードがトランザクションのバイナリログを同じ順序で受信することを保証します。これは、マルチリーダーモードに不可欠です。

  • クラスタ内のノードの大部分がトランザクションのバイナリログを受信した後にのみ、トランザクションをコミットできるようにして、データの信頼性を向上させます。

Paxos プロトコルでは、ロックを使用してノード間のデータ送信順序の整合性を実現します。この方法は効率が悪く、ノード間の負荷の不均衡を引き起こします。MySQL の XCom 層は、Paxos ベースのバリアントプロトコルである Mencius プロトコルに依存しています。Mencius プロトコルは、ポーリングメカニズムを使用して負荷分散を実装し、効率を向上させます。

マルチリーダーモードの実装

  • データ順序:各グループ内でデータが順番に送信され、グループ内でのデータ送信順序の整合性が確保されます。複数の Paxos グループからデータが送信される場合、ポーリングメカニズムを使用してデータ送信順序の整合性が確保されます。たとえば、データは (1,1)、(1,2)、(1,3) の順序で送信されます。

  • Noop メカニズム:あるノードの後にリストされているノードのデータがクラスタ内のノードの大部分によって受信され、そのノードに送信するデータがない場合、そのノードは noop 状態をブロードキャストして自身をスキップします。ノードは、その前にリストされているノードがデータを送信するか、noop 状態をブロードキャストした後にのみ、データを送信できます。

  • 欠点:ノードでジッターまたは障害が検出されると、ノードはデータを送信したり、noop 状態をブロードキャストしたりできません。この場合、ノードの後にリストされているノードはデータを送信できなくなり、クラスタは使用できなくなります。これは、マルチリーダーモードの重大な欠陥です。

説明

前の図では、(m,n) はグループ n が m 番目のデータレコードを送信することを示しています。たとえば、(2,1) はグループ 1 が 2 番目のデータレコードを送信することを示しています。

シングルリーダーモードの実装

マルチリーダーモードの欠点は最適化できますが、解消することはできません。したがって、MySQL は MGR モードにシングルリーダーモードを提供しています。これにより、クラスタ内の少数のノードに障害が発生した場合に、クラスタが使用できなくなるのを防ぐことができます。

前の図は、1 つのノードのみが書き込みリクエストを処理できるシングルリーダーモードの XCom アーキテクチャを示しています。したがって、アクティブにする必要がある Paxos グループは 1 つだけです。データがポーリングされると、レシーバーは他の Paxos グループを自動的に無視します。このようにして、Paxos プロトコルを使用してデータを送信し、クラスタ内のノードの大部分が使用可能な場合、クラスタの可用性に影響を与えることなくデータを送信できます。

シングルリーダーモードでは、クラスタ内のセカンダリノードはトランザクションを送信しません。セカンダリノードは、クラスタ管理に関する情報を送信します。セカンダリノードがデータを送信する前に、セカンダリノードはプライマリノードからデータ送信のための場所をリクエストし、次にクラスタ内のすべてのノードにデータを送信する必要があります。たとえば、前の図の <3,1> はデータ送信のための場所を示しています。シングルリーダーモードではデータの送信レイテンシが高く、効率が低いですが、クラスタ管理に関する情報は比較的低い頻度で送信されるため、クラスタのパフォーマンスには影響しません。

グループレプリケーションロジック層

image

グループ レプリケーション ロジック レイヤーは、クラスターとの間でトランザクションを送受信し、トランザクションを再生します。次のリストは、プライマリノードとセカンダリノードでグループ レプリケーション ロジック レイヤーがどのように動作するかを説明しています。

  • プライマリノード: トランザクションがプライマリノードでコミットされる前に、グループレプリケーションロジックレイヤーは、トランザクションのバイナリログを XCom レイヤーに送信し、次にクラスタ内の他のノードに送信します。クラスタ内のノードの大部分がトランザクションを受信した後、競合検出が実行されます。

    • トランザクションが競合検出に合格した場合、トランザクションはバイナリログファイルに書き込まれ、プライマリノードでコミットされます。

    • トランザクションが競合検出に失敗した場合、トランザクションはロールバックされます。

  • セカンダリノード: クラスタ内のノードの大部分がトランザクションを受信した後、XCom レイヤーはトランザクションをグループレプリケーションロジックレイヤーに送信して、競合検出を実行します。

    • トランザクションが競合検出に合格した場合、トランザクションはリレーログファイルに書き込まれ、次にアプリヤースレッドによって適用されます。

    • トランザクションが競合検出に失敗した場合、トランザクションのデータは破棄されます。

競合の検出

  • シナリオ

    MGR モードでは、以下のシナリオで競合検出を実行する必要があります。

    • マルチリーダーモード: すべての書き込み操作で競合検出が必要です。

    • シングルリーダーモード: プライマリ/セカンダリ スイッチオーバーが実行され、元のプライマリノードのリレーログが新しいプライマリノードに適用される前に書き込みトランザクションが実行された場合、競合検出が必要です。

  • 実装

    MGR モードでは、データ行のプライマリキーのハッシュ値に基づいて、行レベルの競合検出が実行されます。各ノードは、トランザクション認証情報の配列(ハッシュ配列)を保持します。ハッシュ配列は、次の要素で構成されます。

    • キー: データ行のハッシュ値。

    • 値: データ行を変更する現在のトランザクションのグローバルトランザクション ID(GTID)と、ソースノードで現在のトランザクションがコミットされる前に取得された gtid_executed の和集合。 gtid_executed は、ソースノードでコミットされたすべてのトランザクションの GTID セットを指定します。

    トランザクションをコミットする前に、次の項目に注意してください。

    • ソースノードは、トランザクションによって変更されたデータと、現在のトランザクションがコミットされる前にコミットされたトランザクションを含むコミットメントセットを送信します。

    • クラスタ内のすべてのノードは、現在のトランザクションによって変更されたすべてのデータ行のハッシュ値を使用して、認証情報配列から必要な値を読み取り、これらの値を依存関係セットに配置します。依存関係セットは、現在のトランザクションがコミットされる前に完了する必要があるトランザクションを示します。

    現在のトランザクションがコミットされる前、またはリレーログに書き込まれる前に、システムはコミットメントセットと依存関係セットを次の側面から比較します。

    • コミットメントセットに依存関係セットが含まれている場合、現在のトランザクションは競合検出に合格します。この場合、システムは現在のトランザクションをバイナリログファイルに書き込み、ソースノードでトランザクションをコミットし、現在のトランザクションを他のノードのリレーログファイルに書き込みます。

    • コミットメントセットに依存関係セットが含まれていない場合、現在のトランザクションは競合検出に失敗します。この場合、システムはソースノードで現在のトランザクションをロールバックし、他のノードのリレーログを破棄します。

    削除メカニズム:

    メモリ使用量を削減するために、認証情報配列内の冗長データは定期的に削除されます。

    • トランザクションがクラスタ内のすべてのノードで実行されると、トランザクションによって変更されたすべてのデータ行を認証情報配列から削除できます。

    • MGR モードでは、実行されたトランザクションのデータは 60 秒ごとに削除されます。

MGR モードの安定性に関する AliSQL による最適化

シングルリーダーモードは MGR モードの安定性を向上させます。ただし、一部のシナリオでは、依然として安定性の問題が存在します。セカンダリノードで高レイテンシが発生すると、多数のトランザクションをできるだけ早く適用できません。その結果、大量の認証情報が蓄積され、システムの安定性に影響します。

  • 大量のメモリが占有され、メモリ不足 (OOM) エラーが発生する可能性があります。

  • 蓄積された認証情報を削除するためのオーバーヘッドが高く、クラスタのパフォーマンスに影響します。

次のリストは、AliSQL がプライマリノードとセカンダリノードで蓄積された認証情報の削除を最適化する方法について説明しています。

  • プライマリノード認証情報配列はいかなる場合でも使用されません。したがって、プライマリノードのリソースと安定性への悪影響を排除するために、プライマリノードから認証情報配列を削除できます。

  • セカンダリノード認証情報は、group_replication_consistency パラメーターが EVENTUAL に設定されている場合にのみ保持する必要があります。group_replication_consistency パラメーターが EVENTUAL に設定されている場合、セカンダリノードは、リレーログが再生されるまで待機することなく、プライマリノードとして選出された後、すぐに外部サービスを提供します。これにより、データの競合が発生する可能性があります。この設定は、本番環境では一般的に使用されません。この設定が無効になっている場合、セカンダリノードに保持される認証情報の量は大幅に削減されます。これにより、セカンダリノードのメモリ消費量が削減され、クラスタの安定性が向上します。

  • 目次 (1, M)
  • 利点
  • 高いデータ信頼性
  • 強力なデータ 整合性
  • グローバルトランザクションの整合性
  • デプロイ方法
  • アーキテクチャ
  • Paxos プロトコル
  • マルチリーダーモードの実装
  • シングルリーダーモードの実装
  • グループレプリケーションロジック層
  • MGR モードの安定性に関する AliSQL による最適化
フィードバック