OLAP クエリと OLTP クエリの両方を同一アプリケーション経由でデータベースに送信する必要がある場合は、クラスターエンドポイントの読み書きモードを設定し、リクエストの自動分散を有効にすることができます。有効にすると、データベースプロキシは受信した SQL ステートメントの推定クエリコストを使用してリクエストを自動的にルーティングし、クエリパフォーマンスを最大化します。ステートメントのクエリコストが指定されたしきい値を超えると、データベースプロキシはリクエストを読み取り専用列ストアノードに自動的にルーティングします。それ以外の場合、リクエストは読み取り専用行ストアノードまたはプライマリノードが処理します。
仕組み
PolarDB for MySQL のデータベースプロキシは、SQL 文の推定 [クエリコスト] を使用して、そのルートを決定します。このコストを設定可能な閾値と比較することで、プロキシはリクエストを行ストアノードまたは列ストアノードにルーティングし、両方のパフォーマンスを最適化します。
リクエスト配布ルール:
OLTPサービス: ほとんどの場合、読み取りおよび書き込み要求が含まれます。 すべての書き込み要求は、プライマリノードによって処理されます。 読み取り要求は、読み取り専用の行ストアノードまたはプライマリノードによって処理されます。
OLAPサービス: ほとんどの場合、読み取り要求のみが含まれます。 すべての読み取り要求は、読み取り専用列ストアノードによって処理されます。
自動リクエスト配信ソリューション:
プライマリノードと読み取り専用列ストアノード間のリクエストの配布: プライマリノードも行ストアモードにあるため、プライマリノードはOLTP読み取りリクエストを処理できます。 このソリューションでは、書き込み要求とOLTP読み取り要求がプライマリノードに分散されます。 OLAP読み取り要求は、読み取り専用列ストアノードに配信されます。
読み取り専用の行ストアノードと読み取り専用の列ストアノード間のリクエストの分散: このソリューションでは、書き込みリクエストはプライマリノードに分散され、OLTP読み取りリクエストは読み取り専用の行ストアノードまたはプライマリノードに分散され、OLAP読み取りリクエストは読み取り専用の列ストアノードに分散されます。

制限事項
サービスノードには、少なくとも 1 つの読み取り専用列ストアノードと 1 つの行ストアノード (プライマリノードまたは読み取り専用行ストアノード) を含める必要があります。
ステップ1:リクエストの自動分散の有効化
-
PolarDB コンソールにログインします。左側メニューで、クラスター をクリックし、クラスターがデプロイされている [リージョン] を選択してから、クラスター ID をクリックします。
-
概要 ページで、データベースプロキシ セクションの対象のクラスターエンドポイントの横にある [変更] をクリックします。
-
要件に基づいて 読み書きモード を選択します。
クラスターエンドポイントの読み取り /書き込みモードは、読み書き に設定されています。
クラスターエンドポイントの読み取り /書き込みモードはReadOnlyに設定され、負荷分散ポリシーはアクティブな要求ベースの負荷分散に設定されます。
-
ノード設定 で、プライマリノード、読み取り専用の行ストアノードと列ストアノードを選択します。右側の HTAP の最適化 セクションで、トランザクションと分析処理の分離 を有効にします。OK をクリックします。
説明-
ノード設定 で、少なくとも 1 つの読み取り専用列ストアノードを選択する必要があります。
-
トランザクションと分析処理の分離 を有効にした後、この機能が有効になるには、IMCI を作成する必要もあります。
-
トランザクションと分析処理の分離 を有効にすると、変更は新しい接続にのみ適用されます。既存の接続は影響を受けません。変更を適用するには、切断してから再接続する必要があります。
例 1:プライマリノードに加えて、サービスノードに 1 つの読み取り専用行ストアノードと 2 つの読み取り専用列ストアノードが含まれているとします。リクエストの自動分散を有効にした場合:
-
書き込みリクエストはプライマリノードにルーティングされます。
-
OLAP 読み取りリクエストは読み取り専用列ストアノードにルーティングされます。
-
OLTP 読み取りリクエストは読み取り専用行ストアノードにルーティングされます。[負荷分散設定] で [プライマリノードでの読み取りリクエスト受付] が [はい] に設定されている場合、プロキシはプライマリノードにリクエストをルーティングすることもあります。
例 2:サービスノードにプライマリノードと 1 つの読み取り専用列ストアノードが含まれているとします。リクエストの自動分散を有効にすると、書き込みリクエストと OLTP 読み取りリクエストはプライマリノードにルーティングされ、OLAP 読み取りリクエストは読み取り専用列ストアノードにルーティングされます。
説明読み書き モードでは、プライマリノードがサービスノードとして選択されているかどうかにかかわらず、プロキシはすべての書き込みリクエストをプライマリノードに送信します。
-
ステップ2:分散しきい値の設定
リクエストの自動分散を有効にした後、[クエリコスト]のしきい値を設定する必要があります。データベースプロキシはこのしきい値を使用してリクエストをルーティングします。リクエストのクエリコストがしきい値を超えると、プロキシはリクエストを列ストアノードにルーティングします。それ以外の場合、プロキシはリクエストを行ストアノードにルーティングします。
クエリコストのしきい値は、次の表のパラメーターで制御します。クラスターの パラメーター ページでこれらの値を変更して、リクエストの自動分散を微調整できます。
|
パラメーター |
説明 |
|
loose_imci_ap_threshold |
SQL ステートメントを列ストアノードにルーティングするためのクエリコストのしきい値。デフォルト値:50000。 説明
リクエストの自動分散が有効になると、プロキシはクエリコストが 50000 を超える SQL ステートメントを列ストアノードにルーティングします。 重要
PolarDB for MySQL バージョン 8.0.1.1.39、8.0.2.2.23 以降では、このパラメーターは非推奨です。代わりに |
|
loose_cost_threshold_for_imci |
列ストアノードが、列ストアの実行計画を使用するかどうかを判断するためのクエリコストのしきい値。デフォルト値:50000。 説明
SQL ステートメントが列ストアノードにルーティングされた後、そのクエリコストが 50000 を超える場合、列ストアノードは列ストアの実行計画を選択します。それ以外の場合は、行ストアの実行計画を選択します。 |
SHOW STATUS LIKE 'Last_query_cost_for_imci' コマンドを実行して、直前の SQL ステートメントのクエリコストを確認できます。この情報を参考に、パラメーター値を調整できます。
クラスターエンドポイントを使用してデータベースに接続する場合、SHOW STATUS LIKE 'Last_query_cost_for_imci' コマンドの前に hint /* ROUTE_TO_LAST_USED*/ を追加する必要があります。これにより、正しいノードから前のステートメントのクエリコストを取得できます。たとえば、
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost_for_imci';
たとえば、次のステートメントを実行して、前の SQL ステートメントのクエリコストを表示します。
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost_for_imci';
出力は次のとおりです:
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| Last_query_cost_for_imci | 2 |
+--------------------------+-------+
1 row in set (0.01 sec)
この SQL ステートメントのクエリコストは 2 です。
この SQL クエリを列ストアノードにルーティングして列ストアで実行するには、次のようにパラメーター値を設定します。
-
PolarDB for MySQL バージョン 8.0.1.1.38、8.0.2.2.22 以前の場合
loose_imci_ap_threshold と loose_cost_threshold_for_imci の両方のパラメーターを 1 に設定します。
-
PolarDB for MySQL バージョン 8.0.1.1.39、8.0.2.2.23 以降の場合
loose_cost_threshold_for_imci パラメーターを 1 に設定します。
hints を使用して実行計画を強制する
リクエストの自動分散が期待どおりに動作しない場合は、hints を使用して行ストアまたは列ストアの実行計画を強制できます。
-
hintは、それが指定されている SQL 文にのみ適用され、他の文や接続には影響しません。 -
バージョン 5.7.7 より前の MySQL クライアントを使用して
hintsを含むステートメントを実行する場合、データベースエンジンに接続する際に--commentsオプションを追加する必要があります。お使いの MySQL クライアントのバージョンは、mysql --versionコマンドを実行することで確認できます。
-
列ストア実行計画の強制
-
PolarDB for MySQL バージョン 8.0.1.1.38、8.0.2.2.22 以前の場合
データベースプロキシを使用してリクエストを自動配布する際、
ヒントを使用すると、 loose_imci_ap_threshold の設定に関係なく、SQL ステートメントを強制的にカラムストアノードにルーティングさせることができます。 SQL キーワードの前に/* FORCE_IMCI_NODES */を追加します。 たとえば、/*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;列ストアノードにルーティングされる SQL 文は、引き続き loose_cost_threshold_for_imci 設定の影響を受けます。 SQL 文で列ストアの実行計画を強制的に使用するには、
ヒントを使用して loose_cost_threshold_for_imci の値を下げることができます。 例:/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1; -
PolarDB for MySQL バージョン 8.0.1.1.39、8.0.2.2.23 以降の場合
ヒントを使用して、loose_cost_threshold_for_imci パラメーターを 0 に設定します。
EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;
説明/*+SET_VAR()*/を使用してしきい値を変更する場合、パラメーター名からloose_プレフィックスを削除する必要があります。そうしないと、hintは有効になりません。 -
-
行ストア実行計画の強制
hintを使用してUSE_IMCI_ENGINEの値を OFF に設定すると、SQL 文で強制的に行ストア実行計画が使用されます。例:EXPLAIN SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;