PolarDB for MySQLは、グローバルな一貫性 (高性能モード) をサポートしています。 PolarTransは、コミットタイムスタンプストア (CTS) とリモートダイレクトメモリアクセス (RDMA) を使用して、カーネルレベルでグローバルな一貫性 (高性能モード) を提供します。 これにより、クラスター内の読み取り専用ノードに転送されるすべての読み取り要求に対して、強力な一貫性が実装されます。 このトピックでは、グローバル一貫性 (高パフォーマンスモード) の制限、技術的ソリューション、パフォーマンスデータ、およびその有効化方法について説明します。
サポートされているバージョン
グローバル整合性 (高パフォーマンスモード) を有効にする場合、PolarDB for MySQLクラスターは次のバージョン要件のいずれかを満たす必要があります。
エンジンバージョンは8.0.2で、リビジョンバージョンは8.0.2.2.19以降です。
エンジンバージョンは8.0.1で、リビジョンバージョンは8.0.1.1.29以降です。
エンジンバージョンは、5.7.1.0.26以降のリビジョンバージョンで5.7されます。
エンジンバージョンを確認する方法の詳細については、「エンジンバージョンの照会」をご参照ください。
使用上の注意
デフォルトでは、サーバーレスクラスター内のすべての読み取り専用ノードでグローバル一貫性 (高パフォーマンスモード) が有効になっています。
グローバルデータベースネットワーク (GDN) 上のセカンダリクラスターの読み取り専用ノードに対して、グローバル整合性 (高パフォーマンスモード) を有効にすることはできません。
グローバル整合性 (高性能モード) は、高速クエリキャッシュ機能と互換性があります。 ただし、変更追跡テーブル (MTT) 最適化がグローバル整合性 (高パフォーマンスモード) に対して有効になっていて、高速クエリキャッシュ機能とグローバル整合性 (高パフォーマンスモード) の両方を有効にした場合、MTT最適化は無効になります。 高速クエリキャッシュ機能の詳細については、「高速クエリキャッシュ」をご参照ください。
背景情報
PolarDBの元のアーキテクチャは、1つのプライマリノードと複数の読み取り専用ノードで構成されています。 デフォルトでは、読み取り専用ノードは最終的な読み取り整合性を提供します。 物理レプリケーションと共有ストレージテクノロジーにより、読み取り専用ノードのレイテンシを効果的に削減できます。 ただし、読み取り専用ノードに転送された読み取り専用要求は、プライマリノードに書き込まれた最新のデータを読み取ることができません。 金融やゲームなどのレイテンシに敏感な業界では、読み取り専用ノードの読み取りが遅れると、データの不整合が発生する可能性があります。
前の図に示すように、マイクロサービスフレームワークを使用すると、複数のサービスが分離されます。 サービスAがデータを書き込んだ後、システムはメッセージキュー (MQ) サービスを使用してメッセージを送信し、データが正常に書き込まれたことをサービスBに通知します。 サービスBはメッセージを消費し、データが正常に書き込まれたことを認識する。 次に、サービスBは、フォローアップビジネスフローのデータを読み取るための読み取り要求を発行します。 最終的な読み取りの一貫性のみが保証される場合、サービスAもサービスBも、ステップ1で書き込まれた最新のデータが読み取られることを保証できません。 これにより、上位層のサービスにデータの一貫性の問題が発生します。 この状況に対する唯一の解決策は、読み取り専用要求をプライマリノードに転送して、書き込み後の読み取りの一貫性を確保することです。
グローバル整合性 (高性能モード) 技術ソリューション
PolarTransはCTSとRDMAを使用して、カーネルレベルで読み取り専用ノードに厳密な読み取り一貫性を提供します。 これにより、プライマリノードと読み取り専用ノードで常に最新のデータが表示されるようになり、クラスターに厳密な読み取り一貫性が提供されます。
PolarTransが有効になった後、PolarDBは、プライマリノードでトランザクションがコミットされたときに、各読み取りまたは書き込みトランザクションにタイムスタンプを割り当てます。 このタイムスタンプは、論理タイムスタンプまたはハイブリッドタイムスタンプとすることができる。 さらに、プライマリノードは、トランザクションIDおよびコミットシーケンス番号 (CSN) をredoログに書き込む。 次に、読み取り専用ノードがredoログを再生してトランザクションステータスを取得します。
次のセクションでは、読み取り専用ノードで厳密な読み取り整合性がどのように機能するかについて説明します。
クライアントがクエリを開始します。
読み取り専用ノードは、RDMA片側リモート読み取りを使用して、プライマリノードの最新のコミットタイムスタンプを取得します。
読み取り専用ノードは、プライマリノードの最大コミットタイムスタンプに基づいて厳密に整合性のある読み取りビューを作成し、対応するチェックポイントでredoログが再生されてトランザクションステータスが取得されるまで待機します。
読み取り専用ノードは、厳密に整合性のある読み取りビューに基づいてデータの可視性を判断し、結果をクライアントに返します。
グローバル一貫性 (高パフォーマンスモード) では、読み取り専用ノードはRDMA片側リモート読み取りを使用してプライマリノードから最新のコミットタイムスタンプを取得し、現在のトランザクションのレイテンシの計算や一貫性の高い読み取りビューの構築などの後続の操作でコミットタイムスタンプを使用します。 グローバル整合性 (高性能モード) は、複数の同時実行最適化方法と組み合わせて実装されます。 複数のスレッド間のクエリ結果を再利用して、リモート読み取り操作の数とオーバーヘッドを減らすことができます。 トランザクションステータス同期プロセスの時間は2% 以内に制限されます。
きめの細かいMTT
読み取り専用ノードに厳密な読み取り一貫性を実装するには、読み取り専用ノードはまずプライマリノードの最新のタイムスタンプを取得し、読み取り要求を処理するために対応するチェックポイントに再実行ログが再生されるまで待機します。 ただし、要求されたデータはすでに最新のものである可能性があり、ログの再生を待つ必要がなくなります。 このような不必要な待ち時間を回避するために、グローバル整合性 (高性能モード) は、よりきめ細かい修正追跡メカニズムを使用する。 3つのレベルの変更情報、すなわち、グローバルタイムスタンプ、テーブルレベルタイムスタンプ、およびページレベルタイムスタンプが、プライマリノード上で維持される。 MTTは、プライマリノードのデータ書き込みステータスを複数のレベルで追跡し、ページレベルのレイテンシチェックを実行できます。 読み取り専用ノードがリクエストを処理すると、読み取り専用ノードはまずプライマリノードのグローバルタイムスタンプを取得します。 グローバルタイムスタンプが厳密な読み取り整合性の要件を満たさない場合、読み取り専用ノードは現在のテーブルのタイムスタンプを取得します。 テーブルレベルのタイムスタンプが厳密な読み取り整合性の要件を満たしていない場合、読み取り専用ノードは、アクセスするページのタイムスタンプが要件を満たしているかどうかを確認します。 ページレベルのタイムスタンプが読み取り専用ノードのログ再生タイムスタンプより大きい場合、読み取り専用ノードはログ再生を待機します。
グローバル整合性 (高性能モード) とグローバル整合性
PolarDBは、さまざまなシナリオでの整合性の要件を満たすために、次の4つの整合性レベルを提供します。最終的な整合性、セッションの整合性、グローバルな整合性、およびグローバルな整合性 (高性能モード) です。
グローバル整合性 (高性能モード) は、元のグローバル整合性レベルのアップグレードであり、グローバル整合性よりも強力な整合性に対する要件が厳しい。 したがって、ビジネスシステムでより厳密な整合性が必要な場合は、グローバル整合性 (高性能モード) を使用することを推奨します。
PolarDB For MySQL 5.7、8.0.1、または8.0.2クラスターの場合、厳密な整合性が必要な場合は、グローバル整合性 (高パフォーマンスモード) を推奨します。
PolarDB For MySQL 5.6クラスターの場合、このバージョンはグローバル一貫性 (高パフォーマンスモード) をサポートしていないため、厳密な一貫性のためにグローバル一貫性を選択できます。
グローバル一貫性を有効にする方法の詳細については、「グローバル一貫性の有効化」をご参照ください。
グローバル整合性の有効化 (高性能モード)
PolarDB コンソールにログインします。 クラスターの [基本情報] ページの [データベースノード] セクションで、グローバル整合性 (ハイパフォーマンスモード) を有効にする読み取り専用ノードにポインターを移動し、[グローバル整合性の有効化] をクリックします。
この機能は、新しい接続に対してのみ有効です。
読み取り専用ノードのグローバル整合性 (高パフォーマンスモード) を有効にすると、この読み取り専用ノードと同じクラスターエンドポイントに属し、グローバル整合性 (高パフォーマンスモード) が有効になっていない他のノードの整合性レベルが自動的にセッション整合性に切り替えられます。 詳細については、「セッションの整合性」をご参照ください。
性能比較
テスト環境
8つのコアと32 GBのメモリを備えたPolarDB for MySQL 8.0 cluster Editionのクラスター
テストツール
sysbench
テストデータ
各テーブルに250,000行の25のテーブル
テスト結果
RDMAのパフォーマンス損失
読み取り専用ノードとプライマリノードの間にレイテンシが存在しない場合、プライマリノードでのトランザクションの現在の最大CSNを取得するRDMAパフォーマンスオーバーヘッドは、グローバル一貫性 (高性能モード) が有効になる前後のデータを比較することで計算できます。 この結果は、グローバル一貫性 (高パフォーマンスモード) が有効になった後、RDMAのパフォーマンス損失が2% 以内に制限されることを示しています。
読み取り専用パフォーマンス
通常の書き込みロード条件下では、読み取り専用ノードにレイテンシがあります。 厳密に一貫した読み取りには、トランザクションステータスの取得と検証が必要です。これは、読み取り専用ノードのピーク読み取り専用パフォーマンスに影響します。 ただし、最適化されたグローバル一貫性 (高性能モード) 技術ソリューションは、20% 内でこの影響を制御し、読み取り専用ノードがプライマリノードと同等の厳密に一貫した読み取りを提供できるようにします。
読み取りと書き込みのパフォーマンス
読み取りおよび書き込みシナリオでは、グローバル一貫性 (高パフォーマンスモード) を有効にした後、クラスターエンドポイントを使用することで、プライマリノードの書き込みパフォーマンスに影響を与えることなく、より多くの読み取り専用リクエストを読み取り専用ノードに配信できます。 これにより、クラスター全体の読み取りおよび書き込みスループットが向上します。 次の図は、sysbench oltp_read_writeテストのさまざまなモードのパフォーマンス比較結果を示しています。RWは、すべてのリクエストがプライマリノードに送信されることを示しています。 グローバル一貫性 (高パフォーマンスモード) が有効になった後、同時実行性の高いシナリオでは、クラスタのパフォーマンスはRWモードのパフォーマンスよりも約70% 高くなります。
スケーリングされた読み取り専用ノードのパフォーマンス
sysbench oltp_read_writeテストなど、読み書き比率が高いシナリオでは、読み取り専用ノードをスケーリングすることで、クラスターのパフォーマンスを向上させることができます。 さらに重要なことに、読み取り専用ノードのスケーリングは、クラスター仕様の変更よりもサービス継続性にとって比較的安全です。 これは、読み取り専用ノードのスケーリングでは、クラスタの切り替えやサービスの中断が必要ないためです。
高仕様クラスターのパフォーマンス
MTT技術を使用してグローバル整合性 (高性能モード) が最適化された後、グローバル整合性 (高性能モード) は、高同時書き込みシナリオにおけるクラスタの性能を大幅に改善することができる。 sysbench oltp_read_writeストレステストは、1つのプライマリノードと1つの読み取り専用ノードを含むクラスターで実行されます。 クラスターでは、512の同時スレッドが実行されます。 グローバル整合性 (高パフォーマンスモード) を有効にすると、クラスタのパフォーマンスはRWモードの1.7倍になります。 書き込みリクエストが増え続ける場合は、読み取り専用ノードの数を1から2に増やすことで、クラスターパフォーマンスを1秒あたりの数百万クエリ (QPS) に向上させることができます。