PolarDBのホットレプリカ機能を使用したフェールオーバーは、フェールオーバー速度を向上させ、トランザクションステータスの保存を実装できます。 このトピックでは、ホットレプリカ機能によるフェールオーバーの動作について説明します。
背景情報
ApsaraDB高可用性の進化は、プライマリ /セカンダリ高可用性 (HA) 、共有メモリHA、およびPolarDBクラウドネイティブHAのフェーズに分けられます。 プライマリ /セカンダリHAには、バイナリログレプリケーションを使用するため、DDLや大規模なトランザクションなどの場合にレプリケーション遅延の問題があります。 PolarDB HAは、物理レプリケーションを使用してレイテンシの問題を解決し、PolarStoreの共有ストレージを使用してスケーラビリティを向上させます。 ただし、バージョンのアップグレードなどのシナリオでは、接続の中断とトランザクションのロールバックが発生します。 多数のリクエストエラーもアプリケーションクライアントで報告されます。 ホットレプリカ機能を使用したフェールオーバーは、マイナーバージョンのアップグレード、スケーリング、ディザスタリカバリなどの問題に対処するために導入されました。 この機能は、PolarDBをサーバーレスに進化させるためにも必要です。
PolarDBのホットレプリカ機能付きフェールオーバーは、障害検出、フェールオーバー速度、エクスペリエンスの3つの側面を最適化します。 クラスター構成の変更やマイナーバージョンのアップグレードなどのスケジュールされた切り替えをフェールオーバーと区別します。 ホットレプリカ機能を備えたフェールオーバーは、複数の手法を組み合わせてお客様の課題に取り組みます。
投票ディスクサービス (VDS): VDSは、クラスタノードの自律管理を実装するために使用できる共有ディスクアーキテクチャに基づく高可用性モジュールです。 VDSは、障害検出およびプライマリノード選択に必要な時間を大幅に短縮します。
グローバルプリフェッチ: グローバルプリフェッチを利用して、ホットレプリカノードはストレージエンジン内の複数のモジュールをプリフェッチし、フェイルオーバーに必要な時間を短縮できます。
PolarProxyは、永続的な接続とトランザクションステータスの保存をサポートします。 永続的な接続とトランザクションステータスの保存が有効になった後、PolarDBは、クラスター構成の変更やマイナーバージョンのアップグレード中にサービスを中断することなく、アクティブなO&Mを実装します。
前提条件
この機能は、次の要件のいずれかを満たすPolarDB for MySQLクラスターでサポートされています。
PolarDBクラスターはMySQL 5.6を実行し、リビジョンバージョンは5.6.1.0.35以降です。
PolarDBクラスターはMySQL 5.7を実行し、リビジョンバージョンは5.7.1.0.24以降です。
PolarDBクラスターはMySQL 8.0.1を実行し、リビジョンバージョンは8.0.1.1.29以降です。
PolarDBクラスターはMySQL 8.0.2を実行し、リビジョンバージョンは8.0.2.2.12以降です。
注意事項
ホットレプリカ機能を使用したフェールオーバーが読み取り専用ノードで有効になっていない場合、フェールオーバーが発生したときにサービスが約20〜30秒間中断されることがあります。 したがって、アプリケーションがクラスターに自動的に再接続できることを確認してください。 ホットレプリカ機能が読み取り専用ノードで有効になっている場合、フェールオーバーは3〜10秒以内に完了できます。
ホットレプリカノードの仕様は、プライマリノードの仕様と同じである必要があります。
インメモリ列インデックス (IMCI) 機能は、次の条件でのみ、フェールオーバーwithホットレプリカ機能の投票ディスクサービス (VDS) モジュールと一緒に使用できます。
リビジョンバージョンが8.0.1.1.42以降または8.0.2.2.23以降のクラスターの場合:
ホットレプリカ機能を使用したフェールオーバーが有効になっている読み取り専用ノードがクラスターに含まれている場合、読み取り専用列ストアノードをクラスターに追加できます。
読み取り専用列ストアノードがすでにクラスターに存在する場合、クラスター内の読み取り専用ノードに対してホットスタンバイ機能を有効にすることはできません。
リビジョンバージョンが8.0.1.1.42より前または8.0.2.2.23より前のクラスターの場合、IMCI機能とホットレプリカ機能のフェールオーバーを併用することはできません。
ホットレプリカ機能を使用したフェールオーバーが有効になっている読み取り専用ノードがクラスターに含まれている場合、読み取り専用列ストアノードをクラスターに追加することはできません。
説明読み取り専用列ストアノードをクラスターに追加する場合は、テクニカルサポートに問い合わせてVDSを無効にしてください。 VDSを無効にすると、クラスター内のすべてのノードが自動的に再起動されます。
読み取り専用列ストアノードがすでにクラスターに存在する場合、クラスター内の読み取り専用ノードに対してホットスタンバイ機能を有効にすることはできません。
クラスターのホットレプリカ機能を使用してフェールオーバーを有効にする場合は、最初に読み取り専用列ストアノードを削除します。
制御ポリシー機能の動作
次のコアテクノロジーを使用して、PolarDBのホットレプリカ機能でフェールオーバーを実装します。
新しい高可用性モジュール: VDS
ホットレプリカ機能を使用したフェールオーバーが有効になると、PolarDBはVDSをアクティブにします。 PolarDBの共有ディスクアーキテクチャにより、VDSはクラスターノードの自律的な管理、障害検出、およびプライマリノードの選択を提供します。 VDSのアーキテクチャの詳細:
VDS内の各計算ノードは、独立したスレッドを有します。 VDSスレッドは、リーダー、フォロワー、オブザーバーの3つのカテゴリに分類されます。 PolarDBクラスターでは、リーダースレッドはプライマリノードで実行され、フォロワースレッドはホットレプリカノードで実行され、オブザーバースレッドは読み取り専用ノードで実行されます。 PolarDBクラスターには、1つのリーダースレッド、1つのフォロワースレッド、および複数のオブザーバースレッドを含めることができます。
VDSは、PolarStoreに2つのデータモジュールを作成します。Compare-and-Swap (CAS) ブロックとPolar Cluster Registry (PCR) です。
CASブロックは、PolarStoreによって提供されるCAS操作をサポートするアトミックデータブロックです。 CASはVDSでリースベースの分散ロックを可能にし、ロックホルダーやリース時間などのメタデータを記録します。 PolarDBクラスターのプライマリノードとホットレプリカノードは、ロック取得とロック更新セマンティクスを使用して、障害を検出し、プライマリノードを選択します。
PCRには、クラスターのトポロジ状態など、PolarDBノード管理の情報が格納されます。 リーダースレッドには、PCRにデータを書き込む権限がありますが、フォロワースレッドとオブザーバースレッドには、PCRからデータを読み取る権限のみがあります。 FollowerスレッドがLeaderスレッドとして指定されると、元のLeaderスレッドはFollowerスレッドになります。 PCRにデータを書き込む権限を持つのは、最新のリーダースレッドだけです。 PCRはまた、トポロジーを再構築します。
一般に、プライマリノードは読み取りおよび書き込みサービスを提供し、対応するリーダースレッドはVDSのロックを定期的に更新します。 プライマリノードが使用できなくなると、ホットレプリカノードが引き継ぎます。 このプロセスについては、次のセクションで説明します。
プライマリノードのリースが期限切れになると、フォロワースレッドがロックされ、リーダースレッドとして選択されます。 この時点で、ホットレプリカノードがプライマリノードになります。
元のプライマリノードが回復すると、ロックの取得に失敗します。 次いで、元のプライマリノードは、ホットレプリカノードに劣化されます。
主ノード選択プロセスが完了すると、PCRは新しいトポロジ情報をすべてのオブザーバスレッドにブロードキャストします。 このようにして、読み取り専用ノードは新しいプライマリノードに自動的に接続し、ログシーケンス番号 (LSN) とバイナリログの同期リンクを復元できます。
グローバルプリフェッチシステム
通常の読み取り専用ノードと比較して、ホットスタンバイノードは、切り替え速度を最適化するためにCPUおよびメモリリソースのごく一部を予約する特別な種類の読み取り専用ノードです。 グローバルプリフェッチシステムは、ホットレプリカとのフェイルオーバーで最も重要なモジュールです。 プライマリノードのメタデータをリアルタイムで同期し、キーデータをメモリにプリフェッチしてフェイルオーバー速度を向上させます。 グローバルプリフェッチシステムは、Buffer Pool、Undo、Redo、Binlogの4つのモジュールで構成されています。
バッファプール
バッファプールモジュールは、プライマリノードのためのバッファプール内のLRU (Least Recently used) アルゴリズムをリアルタイムで実装するために使用されるリンクリストを監視し、関連データをホットレプリカノードに送信します。 ホットレプリカノードは、読み取り専用ノードがプライマリノードとして選択されたときに、バッファプールヒット率の大幅な低下によるパフォーマンス低下を回避するために、頻繁にアクセスされるページを選択し、それらをメモリにプリフェッチします。
元に戻す
Undoモジュールは、トランザクションシステム内のデータをプリフェッチします。 フェイルオーバー中、PolarDBはアンドゥページから保留中のトランザクションを見つけてトランザクションをロールバックします。読み取り専用ノードは大規模な分析クエリ要求のみを処理し、プライマリノードのコミットされていないトランザクションにはアクセスしません。 これにより、アンドゥページのI/O待ち時間が長くなる。 ホットレプリカ機能を備えたフェールオーバーは、トランザクションシステムの復旧時間を短縮するために、Runtime Applyを使用してアンドゥページをプリフェッチし、最新バージョンに再生します。
やり直し
Redoモジュールは、ホットレプリカと読み取り専用ノードのredoログをメモリのredoハッシュテーブルにリアルタイムでキャッシュします。
Binlog
バイナリログを有効にすると、準備状態のInnoDBトランザクションは、バイナリログに基づいてトランザクションをコミットするかロールバックするかを決定します。 多数のトランザクションが実行される場合、システムは、すべてのバイナリログを読み取って解析するのに数秒または数分を要することがあります。 ホットレプリカノードはバックグラウンドスレッドを使用して、最新のバイナリログをI/Oキャッシュに非同期にキャッシュし、事前に解析してフェールオーバー速度を向上させます。
PolarDBは、ホットレプリカノードと共通スタンバイノード間の動的変換をサポートします。 実際のシナリオでは、1つのホットレプリカノードを長期間有効にするか、構成の変更またはアップグレード中にホットレプリカ機能を短時間のみ有効にすることができます。 PolarDBを使用すると、プライマリノードと異なる仕様の読み取り専用ノードを設定できます。 ただし、少なくとも1つの読み取り専用ノードは、ディザスタリカバリ用のプライマリノードと同じ仕様を使用する必要があります。 このノードをホットレプリカノードとして設定することを推奨します。
永続的な接続とトランザクションステータスの保存
ただし、フェールオーバーまたはホットアップグレードはサービスに影響を与え、一時的な接続、接続障害、既存のトランザクションのロールバックなどの問題を引き起こす可能性があります。 これにより、アプリケーション開発の複雑さとリスクが増加します。
PolarDBは永続接続機能をサポートしています。 永続接続は、PolarProxyがアプリケーションとPolarDB間の接続ブリッジとして機能する方法で実装されます。 データベースがプライマリ /セカンダリフェイルオーバーを実行すると、PolarProxyはデータベースノードをアプリケーションに接続し、元のシステム変数、ユーザー変数、文字セットエンコーディングなどの情報を含む以前のセッションを復元します。
永続接続機能は、アイドル接続にのみ適用できます。 ノードが切り替えられた時点で現在のセッションに実行中のトランザクションがある場合、PolarProxyはPolarDBから元のトランザクションコンテキストを取得できません。 新しいプライマリノードは、コミットされていないトランザクションをロールバックし、これらのトランザクションによって保持されている行ロックを解放します。 この場合、永続的な接続は維持できません。 この問題を解決するために、PolarDBはトランザクションステータス保存機能を提供します。 トランザクションステータスの保存は、永続的な接続機能とともに、サービスを中断することなく高可用性を提供する高速フェールオーバーを可能にします。
バイナリログに基づく論理レプリケーションとは異なり、物理レプリケーションアーキテクチャでは、PolarDBがホットレプリカノードでプライマリノードと同じトランザクションを再構築できます。
たとえば、アプリケーションでトランザクションをコミットするプロセスは、BEGIN > INSERT > UPDATE > COMMITであり、トランザクションステータス保存機能が有効になっています。 トランザクションの実行が開始されると、PolarProxyは最後に実行されたSQL文をキャッシュし、SQL文をプライマリノードに転送します。 INSERTステートメントがプライマリノードで実行されると、PolarDBはトランザクション情報の一部として最新のステートメントのセーブポイントを自動的に保存します。 セッショントラッカーは、現在のセッションおよびトランザクション情報をPolarProxyに返します。 その後、PolarProxyはデータを内部キャッシュに一時的に保存します。 文字セットやユーザー変数などのセッション情報は、接続を維持するために使用されます。 trx_idやundo_noなどのトランザクション情報は、トランザクションステータスの保存に使用されます。 さらに、トランザクション情報は、別個のRDMAリンクを介してホットレプリカに連続的に同期されます。 バックエンドデータベースに対してバイナリログが有効になっている場合、各トランザクションに対応するローカルバイナリログキャッシュがホットレプリカノードに同期されます。
たとえば、UPDATEステートメントがPolarDBで実行されている場合、プライマリノードは使用できません。 PolarProxyは、エラーを基になるレイヤーからアプリケーション接続にすぐには送信しませんが、リクエストを一定期間保持します。 フェールオーバー後、新しいプライマリノードは、redoログに基づいてコミットされていないすべてのトランザクションを構築し、トランザクションをロールバックせずにコミットされていないトランザクションを非同期で待機できます。 PolarProxyがフェールオーバーメッセージの成功を検出すると、自身がキャッシュしたセッションとトランザクション情報を使用して、PolarDBのAttach Trx APIを呼び出してトランザクションを再構築します。 PolarDBは、PolarProxy情報に基づいてトランザクション情報が有効かどうかを判断します。 トランザクション情報が有効な場合は、接続にバインドされ、最後のステートメント (UPDATEステートメント) に対応するundo_noのセーブポイントにロールバックされます。
トランザクションが再構築された後、PolarProxyは、実行に失敗した最新のUPDATEステートメントをSQLステートメントキャッシュから新しいプライマリノードに再送信できます。 フェールオーバープロセス中、アプリケーションで接続エラーやトランザクションエラーは報告されません。 唯一の違いは、UPDATEステートメントが通常より遅くなる可能性があることです。
ホットレプリカ機能を使用したフェールオーバーは、VDS、グローバルプリフェッチシステム、永続的な接続とトランザクションステータスの保存を組み合わせることで、PolarDBの障害検出、フェールオーバー速度、エクスペリエンスを最適化します。 接続の中断やトランザクションの中断を心配することなく、いつでもクラスターをアップグレードでき、クラウドネイティブデータベースの真の弾力性を享受できます。