アプリケーションが OLAP サービスと OLTP サービスの両方にアクセスするリクエストを送信し、実行コストに基づいてリクエストを自動的に分散させたい場合は、クラスターエンドポイントの読み取り/書き込みモードを構成し、自動リクエスト分散機能を有効にする必要があります。 自動リクエスト分散機能が有効になっている場合、データベースプロキシは、推定スキャン行数に基づいてリクエストを自動的に分散し、リクエスト処理を高速化します。 SQL リクエストによってスキャンされる推定行数がしきい値を超えると、リクエストは列ストアノードに分散されます。 SQL リクエストによってスキャンされる推定行数がしきい値を超えない場合、リクエストは行ストアノードまたはプライマリノードに分散されます。
自動分散ソリューション
PolarDB for MySQL のデータベースプロキシは、リクエストによって [推定スキャン行数] が指定されたしきい値を超えているかどうかによって、SQL リクエストを列ストアノードに分散するかどうかを決定します。 これにより、行ストアノードと列ストアノードのパフォーマンスを最大限に活用できます。
リクエスト分散ルール:
OLTP サービス: ほとんどの場合、読み取りリクエストと書き込みリクエストが含まれます。 すべての書き込みリクエストはプライマリノードによって処理されます。 読み取りリクエストは、読み取り専用行ストアノードまたはプライマリノードによって処理されます。
OLAP サービス: ほとんどの場合、読み取りリクエストのみが含まれます。 すべての読み取りリクエストは、読み取り専用列ストアノードによって処理されます。
自動リクエスト分散ソリューション:
プライマリノードと読み取り専用列ストアノード間のリクエスト分散: プライマリノードは行ストアモードでもあるため、OLTP 読み取りリクエストを処理できます。 このソリューションでは、書き込みリクエストと OLTP 読み取りリクエストはプライマリノードに分散されます。 OLAP 読み取りリクエストは、読み取り専用列ストアノードに分散されます。
読み取り専用行ストアノードと読み取り専用列ストアノード間のリクエスト分散: このソリューションでは、書き込みリクエストはプライマリノードに分散され、OLTP 読み取りリクエストは読み取り専用行ストアノードまたはプライマリノードに分散され、OLAP 読み取りリクエストは読み取り専用列ストアノードに分散されます。

制限事項
クラスターには、少なくとも 1 つの読み取り専用列ストアノードと 1 つの行ストアノードが含まれています。
手順 1: 列ストアノードと行ストアノード間の自動リクエスト分散を有効にする
[PolarDB コンソール] にログインします。左上隅で、クラスターがデプロイされている [リージョン] を選択します。左側のナビゲーションウィンドウで [クラスター] をクリックします。 クラスターを見つけて、その ID をクリックします。
Enterprise Edition セクションの 概要 ページで、クラスターエンドポイントを探し、クラスターエンドポイントの右側にある [変更] をクリックします。
適切な 読み書きモード を選択します。
クラスターエンドポイントの読み取り/書き込みモードは、読み書き に設定されています。
クラスターエンドポイントの読み取り/書き込みモードは ReadOnly に設定され、負荷分散ポリシーは [アクティブリクエストベースの負荷分散] に設定されています。
ノード設定 セクションで、リクエストの処理に使用するプライマリノード、読み取り専用行ストアノード、および読み取り専用列ストアノードを選択します。 HTAP の最適化 セクションで、トランザクションと分析処理の分離 を有効にします。 [OK] をクリックします。
説明ノード設定 で、少なくとも 1 つの読み取り専用列ストアノードを選択する必要があります。
[列ストアノードと行ストアノード間の自動リクエスト分散] を有効にした後、機能を実装するには IMCI を追加する必要があります。
例 1: 次の図では、1 つのプライマリノード、1 つの読み取り専用行ストアノード、および 2 つの読み取り専用列ストアノードが選択されています。 この場合、システムは次のポリシーに基づいてクエリを分散します。
書き込みリクエストはプライマリノードに分散されます。
OLAP 読み取りリクエストは、読み取り専用列ストアノードに分散されます。
OLTP 読み取りリクエストは、読み取り専用行ストアノードに分散されます。 [SLB 設定] セクションの [プライマリノードが読み取りリクエストを受け入れる] が [はい] に設定されている場合、OLTP 読み取りリクエストはプライマリノードにも分散される可能性があります。

例 2: 次の図では、1 つのプライマリノードと 1 つの読み取り専用列ストアノードが選択されています。 自動リクエスト分散機能が有効になっている場合、書き込みリクエストと OLTP 読み取りリクエストはプライマリノードに分散され、OLAP 読み取りリクエストは読み取り専用列ストアノードに分散されます。
説明読み書き モードでは、[ノード設定] セクションでプライマリノードが選択されているかどうかに関係なく、すべての書き込みリクエストはプライマリノードのみに分散されます。
手順 2: 自動リクエスト分散のしきい値を指定する
自動リクエスト分散を有効にした後、[SQL 文のスキャン行数] のしきい値を指定する必要があります。 しきい値が指定されると、データベースプロキシはこのしきい値に基づいてリクエストを分散するノードを決定します。 SQL リクエストによってスキャンされる推定行数がしきい値を超えると、リクエストは列ストアノードに分散されます。 SQL リクエストによってスキャンされる推定行数がしきい値を超えない場合、リクエストは行ストアノードまたはプライマリノードに分散されます。
次の表で説明するパラメーターは、実行コストに関連するしきい値を決定します。 クラスターの パラメーター ページで、パラメーターの値を変更できます。
パラメーター | 説明 |
loose_imci_ap_threshold | SQL 文を列ストアノードに分散するかどうかを決定するしきい値。 デフォルト値: 50000。 説明 たとえば、デフォルト値を使用する場合、SQL 文によってスキャンされる行数が 50,000 を超えると推定されると、文は列ストアノードに分散されます。 重要 8.0.1.1.39 以降の PolarDB for MySQL 8.0.1.x バージョンと 8.0.2.2.23 以降の 8.0.2.x バージョンでは、このパラメーターの代わりに |
loose_cost_threshold_for_imci | 列ストアノードで列ストア実行プランを使用して SQL 文を実行するかどうかを決定するしきい値。 デフォルト値: 50000。 説明 たとえば、デフォルト値を使用する場合、SQL 文によってスキャンされる行数が 50,000 を超えると推定されると、文は列ストア実行プランを使用して実行されます。 それ以外の場合、行ストア実行プランが使用されます。 |
SHOW STATUS LIKE 'Last_query_cost 文を実行して、最後の SQL 文の推定実行コストをクエリし、クエリされた値を使用してパラメーター値を変更できます。
クラスターエンドポイントを使用してデータベースに接続する場合は、SHOW STATUS LIKE 'Last_query_cost' 文の前に /* ROUTE_TO_LAST_USED*/ ヒントを追加して、最後の SQL 文の推定実行コストが予期されるノードでクエリされるようにする必要があります。 次の文は例を示しています。
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost';例:
SHOW STATUS LIKE 'Last_query_cost';次の結果が返されます。
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Last_query_cost | 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 に設定します。
8.0.1.1.39 以降の PolarDB for MySQL 8.0.1.x バージョンと 8.0.2.2.23 以降の 8.0.2.x バージョン
loose_cost_threshold_for_imci パラメーターを 1 に設定します。
hints を使用して、列ストア実行プランまたは行ストア実行プランを使用してリクエストを強制的に実行する
自動リクエスト分散の結果が期待どおりでない場合は、hints を使用して、列ストア実行プランまたは行ストア実行プランを使用してリクエストを強制的に実行できます。
hintは、それが含まれている SQL 文に対してのみ有効です。 ヒントは、同じ接続内の他の文や他の接続内の文には影響しません。MySQL 5.7.7 以前を使用して
hintsとともに文を実行する場合は、データベースエンジンに接続するときに--commentsオプションを追加する必要があります。mysql --versionコマンドを実行して、MySQL クライアントのバージョンを確認できます。
列ストア実行プランを使用して文を強制的に実行する
PolarDB for MySQL 8.0.1.1.38 および 8.0.2.2.22 以前
loose_imci_ap_threshold 値に関係なくリクエストを列ストアノードに強制的に分散する場合は、SQL キーワードの前に
/* FORCE_IMCI_NODES */ヒントを追加できます。 文の例:/*FORCE_IMCI_NODES*/EXPLAIN SELECT COUNT(*) FROM t1 WHERE t1.a > 1;loose_cost_threshold_for_imci パラメーターの値に関係なく、列ストア実行プランを使用して文を強制的に実行する場合は、文に /*+SET_VAR(cost_threshold_for_imci=0)*/ ヒントを追加することで、しきい値を 0 に変更できます。
文の例:/*FORCE_IMCI_NODES*/EXPLAIN SELECT /*+ SET_VAR(cost_threshold_for_imci=0) */ COUNT(*) FROM t1 WHERE t1.a > 1;8.0.1.1.39 以降の PolarDB MySQL 8.0.1.x バージョンと 8.0.2.2.23 以降の 8.0.2.x バージョン
hints を使用して、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は有効になりません。行ストア実行プランを使用して文を強制的に実行する
行ストア実行プランを使用して文を強制的に実行する場合は、文に /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ ヒントを追加できます。
文の例:EXPLAIN SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ COUNT(*) FROM t1 WHERE t1.a > 1;