この章では、ODPのテーブルルーティングメカニズムについて説明します。
OceanBaseデータベースでは、パーティションがデータ格納の基本単位です。テーブル作成時に、テーブルとパーティションのマッピングが存在します。非パーティションテーブルの場合、1つのテーブルは1つのパーティションに対応し、パーティションテーブルの場合、1つのテーブルが複数のパーティションに対応することがあります。現在、OceanBaseデータベースではパーティションのメジャーコンパクションとサブコンパクションは実装されていません。
OceanBaseデータベースでは、ローカルプラン、リモートプラン、分散プランの3種類のテーブルルーティングがあります。ローカルプランとリモートプランはどちらも単一パーティションのルーティングです。ODPの役割は、可能な限りリモートプランを排除し、ルーティングをローカルプランに変換することです。テーブルルーティングタイプがリモートプランのSQLが多すぎる場合、そのODPのルーティングに問題がある可能性があります(oceanbase.GV$OB_SQL_AUDIT ビューの plan_type フィールドを確認することで確認できます)。
非パーティションテーブルのルーティング
ODPには、パーティションとOBServer_addrのマッピングキャッシュが保存されています。パーティションはSQL Parserを通じてテーブル名を取得し、非パーティションテーブルはテーブル名からLocation Cacheでパーティション情報を取得します。パーティションテーブルにアクセスする際、ステートメントにパーティションキー値が提供されている場合は、そのパーティションキー値も取得し、テーブル名からLocation Cacheでパーティションメタデータを取得します。その後、パーティションキー値とパーティションメタデータからパーティションIDを計算し、パーティションが存在するノードのIPを取得します。
以下の3つのケースがあります:
Location Cacheに存在しない場合、OBServerノードの
__all_virtual_proxy_schemaテーブルから取得します。Location Cacheに存在し利用可能な場合、直接使用します。
Location Cacheに存在するが利用できない場合、Location Cacheから削除して再度取得します。
パーティションテーブルのルーティング
非パーティションテーブルと同様に、ODPにはパーティションとOBServer_addrのマッピングキャッシュが保存されています。パーティションはSQL Parser機能を通じてテーブル名を解析・取得します。非パーティションテーブルと比較して、パーティションテーブルはパーティションID情報が追加されており、テーブル名とパーティションIDを基にLocation Cacheからパーティションが存在するOBServerのIPを取得します。
パーティションIDはSQLステートメントから取得し、その出典は通常where句の式やINSERTステートメントのvalues値です。a = xxx を取得できるようにする必要があります。ここで、a がパーティションキー、xxx が定数です。例:
obclient> CREATE TABLE t1(c1 int, c2 int) PARTITION BY hash(c1) partitions 5;
obclient> UPDATE t1 SET c2 = 3 WHERE c1 = 5;
ここで c1 = 5 を抽出し、この情報から影響を受けるパーティションIDを計算し、SQLを対応するパーティションが存在するOBServerノードに転送します。
ODPがパーティションIDを計算できない場合、正確なルートを取得することはできません。obproxy.logログファイルで "calculate partition id" と検索し、計算が成功したかどうかを確認できます。例:
[root@ocp-deploy-obnorpm2-bfc89744b-qsfkz log]# grep "calculate partition id" obproxy.log
[2021-10-28 17:18:18.552825] DEBUG [PROXY] ob_mysql_route.cpp:577 [73979][Y0-7FB3C9D07A80] [lt=10] [dc=0] succ to calculate partition id(part_id_=1)
[2021-10-28 17:18:31.045191] INFO [PROXY] ob_mysql_route.cpp:575 [73979][Y0-7FB3C9D07A80] [lt=17] [dc=0] fail to calculate partition id, just use tenant server(tmp_ret=-4002)
パーティションテーブルに関する詳細は、パーティションの管理を参照してください。
ODPが依存するOceanBaseデータベースの内部テーブル
ルーティングの正確性は、ODP自体に加えて、OceanBaseデータベースの内部テーブルから正しい情報を取得できるかどうかにも依存します。以下はODPが依存するOceanBaseデータベースの内部テーブルです:
__all_virtual_proxy_schema:パーティションとそのマシンの対応関係情報を保存するために使用され、パーティションの一部の関連情報も含まれます。__all_virtual_proxy_partition_info:パーティションテーブル関連のパーティション情報を格納します。__all_virtual_proxy_partition:パーティション情報を格納します。__all_virtual_proxy_sub_partition:サブパーティション情報を格納します。