ODPは、ユーザーのリクエストに関連するレプリカの場所、ユーザーが設定した読み書き分離のルーティングポリシー、OceanBaseデータベースの複数地域展開における最適なリンク、およびOceanBaseデータベースの各マシンの状態と負荷状況を十分に考慮し、ユーザーのリクエストを最適なOBServerノードにルーティングします。これにより、OceanBaseデータベース全体の高性能な運用が最大限に保証されます。
このセクションの内容を読み始める前に、以下の内容をより深く理解するためのルーティング関連の概念をいくつか確認しておくと役立ちます。
Zone
Region
Server List
RS List
Location Cache
レプリカ
マージ
強整合性読み取り/弱整合性読み取り
読み書きZone
パーティションテーブル
パーティションキー
OceanBaseデータベースの実行計画
実行計画はLocal、Remote、Distributeの3種類に分類されます。ODPの主な役割は、Remote計画(効率が低く、パフォーマンスが悪い)をできるだけ回避し、ルーティングを可能な限り正確にLocal計画に変換することです。
ODPルーティングの仕組み
上記のゾーン/リージョン/パーティション/レプリカの基本概念と物理的意味を理解すれば、ODPのルーティングの考え方が理解できます。パーティションの設計からその物理的配置、そしてローカル実行計画の効率性を考慮し、ODPはSQLを可能な限り正確にルーティングする必要があります。主な処理過程は、SQL解析、パーティション計算、パーティション情報取得、レプリカ戦略選択などです。
非パーティションテーブルのルーティング
非パーティションテーブルは、Location Cache内のレプリカ情報を直接利用できます。ODPはパーティションとOBServerノードアドレスのマッピングを保持しており、SQL内のテーブル名を解析し、そのテーブル名でODPキャッシュ内のパーティション対応のマシンIPを照会します。キャッシュの有効性には以下の3つのケースがあります:
キャッシュで見つからない場合、OBServerノードにアクセスして最新のマッピングを照会し、キャッシュします。
キャッシュに存在するが利用できない場合、OBServerノードに再び照会して更新する必要があります。
キャッシュに存在し、かつ利用可能な場合、そのまま使用できます。
パーティションテーブルのルーティング
パーティションテーブルのルーティングは、非パーティションテーブルと比較して、パーティションID及びそれに関連する計算と照会のプロセスが追加されます。Location Cacheを取得した後、パーティションテーブルはテーブルのパーティション/サブパーティションを判断し、異なるパーティションキーのタイプと計算方法に基づいてパーティションIDを計算し、対応するプライマリ/スタンバイレプリカ情報を取得する必要があります。
パーティション計算時には、テーブル構造からパーティションキーとそのタイプを把握し、次にSQL文を解析して対応するパーティションキーの値を取得します。そして、テーブル構造とパーティションキーのタイプに基づいてパーティション計算を行い、対応するパーティションが配置されているマシンに転送します。
通常、パーティション計算により、ODPはSQLをパーティションに対応するマシンにルーティングし、Remote実行を回避して効率を向上させることができます。ODP V3.2.0では、パーティションテーブルでパーティションルートが計算できない場合の最適化が行われ、テナントのマシンをランダムに選択してルーティングする方式から、パーティションが分散配置されているマシンの中からランダムにルーティングする方式に変更されました。これによりヒット率が向上し、Remote実行を可能な限り削減しています。
レプリカのルーティング選択(通常デプロイ)
強整合性読み取りでSQLにテーブル名が指定されている場合、そのテーブルの対応するパーティションのリーダーを保持しているOBServerノードにルーティングされます。弱整合性読み取り、ログイン認証リクエスト、強整合性読み取りでテーブル名が指定されていない場合などでは、プライマリ/スタンバイ均等ルーティング(デフォルト)、スタンバイ優先ルーティング、非メジャーコンパクション時のスタンバイ優先ルーティングの3種類のルーティングポリシーが存在します。
プライマリ/スタンバイ均等ルーティング(デフォルト)
ルーティング選択は以下の優先順位で行われます:
同一リージョン、同一IDC(同一データセンター)、メジャーコンパクション中でないノード。
同一リージョン、異なるIDC(異なるデータセンター)、メジャーコンパクション中でないノード。
同一リージョン、同一IDC(同一データセンター)、メジャーコンパクション中のノード。
同一リージョン、異なるIDC(異なるデータセンター)、メジャーコンパクション中のノード。
異なるリージョン、メジャーコンパクション中でないノード。
異なるリージョン、メジャーコンパクション中のノード。
スタンバイ優先ルーティング
通常デプロイでは、スタンバイ優先読み取りポリシーをサポートしています。ユーザーレベルのシステム変数 proxy_route_policy で制御し、通常デプロイと弱整合性読み取りの場合にのみ有効です。プライマリ/スタンバイ均等ルーティングではなく、Followerから優先的に読み取ります。
通常モードデプロイと弱整合性読み取り時に、set @proxy_route_policy='follower_first'; を設定すると、ルーティングはOBServerノードがメジャーコンパクション中であっても、優先的にスタンバイノードに送信されます。ルーティング選択は以下の優先順位で行われます:
同一リージョン、同一IDC、メジャーコンパクション中でないスタンバイノード。
同一リージョン、異なるIDC、メジャーコンパクション中でないスタンバイノード。
同一リージョン、同一IDC、メジャーコンパクション中のスタンバイノード。
同一リージョン、異なるIDC、メジャーコンパクション中のスタンバイノード。
同一リージョン、同一IDC、メジャーコンパクション中でないプライマリノード。
同一リージョン、異なるIDC、メジャーコンパクション中でないプライマリノード。
異なるリージョン、メジャーコンパクション中でないスタンバイノード。
異なるリージョン、メジャーコンパクション中のスタンバイノード。
異なるリージョン、メジャーコンパクション中でないプライマリノード。
異なるリージョン、メジャーコンパクション中のプライマリノード。
非メジャーコンパクション時のスタンバイ優先ルーティング
通常デプロイでは、弱整合性読み取りで set @proxy_route_policy='unmerge_follower_first'; を設定すると、ルーティングはメジャーコンパクション中でないスタンバイノードに優先的に送信されます。ルーティング選択は以下の優先順位で行われます:
同一リージョン、同一IDC、メジャーコンパクション中でないスタンバイノード。
同一リージョン、異なるIDC、メジャーコンパクション中でないスタンバイノード。
同一リージョン、同一IDC、メジャーコンパクション中でないプライマリノード。
同一リージョン、異なるIDC、メジャーコンパクション中でないプライマリノード。
同一リージョン、同一IDC、メジャーコンパクション中のスタンバイノード。
同一リージョン、異なるIDC、メジャーコンパクション中のスタンバイノード。
異なるリージョン、メジャーコンパクション中でないスタンバイノード。
異なるリージョン、メジャーコンパクション中でないプライマリノード。
異なるリージョン、メジャーコンパクション中のスタンバイノード。
異なるリージョン、メジャーコンパクション中のプライマリノード。
読み取り専用レプリカへの強制送信ルーティング
通常デプロイでは、弱整合性読み取りで set @proxy_route_policy='FORCE_READONLY_ZONE'; を設定すると、ルーティングはすべての読み取り専用リクエストを非読み取り専用レプリカに転送しません。そのルールは以下の通りです:
- 弱い整合性の読み取りリクエスト:読み取り専用レプリカ内のノードにルーティングされます。
- 弱くない整合性の読み取りリクエスト:
4007エラーを返します。このルーティングルールでは非読み取り専用リクエストは許可されません。業務上非読み取り専用リクエストの送信が必要な場合は、変数ob_route_policyの値を他のルールに設定してください。
その他
通常デプロイでは、弱整合性読み取りで proxy_route_policy 変数が他の値を取る場合、ルーティング選択は通常の弱整合性読み取りのプライマリ/スタンバイ均等ルーティングポリシー、すなわちプライマリ/スタンバイ均等ルーティング(デフォルト)に退化します。
レプリカルーティング選択(読み書き分離デプロイ)
読み取り専用レプリカのデプロイモードを使用します。読み書き分離デプロイでは、スタンバイ優先読み取りのルーティングポリシーは存在せず、ルーティングはシステム変数 ob_route_policy に依存します。主なケースは以下のとおりです:
強整合性読み取りステートメントで、かつSQLがテーブル名を指定している場合、そのテーブルに関連するパーティションのリーダーを保持するOBServerノードに直接ルーティングされます。
強整合性読み取りステートメントで、SQLが「select テーブル名未指定 / use database / set session セッションレベルのシステム変数」の場合、Zone属性は無視され、この時点では通常デプロイのプライマリ/スタンバイ均等ルーティング(デフォルト)と同等です。
強整合性読み取りステートメントで、ログイン認証リクエストを含まず、かつ1および2のケースを除外したリクエストは、以下のポリシーに従ってルーティングされます:
同一Region、同一IDC、メジャーコンパクション中でない読み書きZone内のノード。
同一Region、異なるIDC、メジャーコンパクション中でない読み書きZone内のノード。
同一Region、同一IDC、メジャーコンパクション中の読み書きZone内のノード。
同一Region、異なるIDC、メジャーコンパクション中の読み書きZone内のノード。
異なるRegion、メジャーコンパクション中でない読み書きZone内のノード。
異なるRegion、メジャーコンパクション中の読み書きZone内のノード。