PolarDB-X 1.0 は、アプリケーション層に対して透過的に、プライマリおよび読み取り専用の ApsaraDB RDS インスタンス間で SQL ステートメントを自動的にルーティングします。プライマリインスタンスと読み取り専用インスタンスの間にはミリ秒レベルのレプリケーションラグが存在するため、書き込み直後に送信されたクエリが読み取り専用インスタンスにルーティングされた場合、古いデータが返される可能性があります。TDDL ヒントを使用すると、ステートメントごとにデフォルトのルーティングをオーバーライドし、特定のクエリをプライマリインスタンスまたは読み取り専用インスタンスに強制的にルーティングできます。
このトピックは、PolarDB-X 1.0 バージョン 5.3 以降に適用されます。
ルーティングの仕組み
デフォルトのルーティング動作を理解することで、ヒントを使用するタイミングを判断しやすくなります:
| SQL タイプ | デフォルトの送信先 | ヒントによるオーバーライド |
|---|---|---|
INSERT、UPDATE、DELETE | プライマリ ApsaraDB RDS インスタンス | いいえ — 常にプライマリにルーティングされます |
SELECT (トランザクション内) | プライマリ ApsaraDB RDS インスタンス | いいえ — 常にプライマリにルーティングされます |
SELECT (トランザクション外) | 読み取り専用 ApsaraDB RDS インスタンス (負荷分散) | はい — master() または slave() |
TDDL ヒントは、オープントランザクション外の SELECT ステートメントにのみ適用されます。書き込みステートメントおよびトランザクション内のすべてのステートメントは、ヒントの有無にかかわらず、常にプライマリインスタンスで実行されます。
ヒント構文
/*+TDDL: master() | slave() */ヒントは、SQL ステートメントの最初のキーワードの直後に配置します:
SELECT /*+TDDL:master()*/ * FROM table_name;
SELECT /*+TDDL:slave()*/ * FROM table_name;| ヒント | ルーティング先 | 使用するケース |
|---|---|---|
master() | プライマリ ApsaraDB RDS インスタンス | 最新の書き込みを反映する必要があるデータを読み取る |
slave() | 読み取り専用 ApsaraDB RDS インスタンス (重みに基づいてランダムに選択) | プライマリインスタンスから読み取りトラフィックをオフロードする |
2 つのヒントフォーマットがサポートされています:
/*+TDDL:hint_command*/— 標準の MySQL コメントフォーマット/!+TDDL:hint_command*/— 代替フォーマット
mysql コマンドラインクライアントから/*+TDDL:hint_command*/フォーマットを使用する場合は、接続時に-cフラグを追加してください。-cを付けないと、クライアントはサーバーにステートメントを送信する前にコメントを削除するため、ヒントは効果がありません。詳細については、「mysql client options」をご参照ください。
mysql -c -u <username> -p例
プライマリインスタンスへの読み取りの強制
書き込み直後、つまりレプリケーションによって変更が読み取り専用インスタンスに伝播する前にデータを読み取る必要がある場合は、master() を使用します。
INSERT INTO orders (user_id, amount) VALUES (42, 100.00);
-- レプリケーションラグを避けるためにプライマリインスタンスにルーティング
SELECT /*+TDDL:master()*/ * FROM orders WHERE user_id = 42;master() ヒントがない場合、SELECT は通常、読み取り専用インスタンスにルーティングされ、古いデータが返される可能性があります。
読み取り専用インスタンスへの読み取りのルーティング
クエリを明示的に読み取り専用インスタンスにオフロードするには、slave() を使用します。
SELECT /*+TDDL:slave()*/ * FROM products WHERE category = 'electronics';複数の読み取り専用インスタンスが設定されている場合、PolarDB-X 1.0 は割り当てられた重みに基づいて 1 つを選択します。利用可能な読み取り専用インスタンスがない場合、クエリはプライマリインスタンスにフォールバックし、エラーは返されません。