本記事では、OceanBaseデータベースのマルチテナントスレッドの実装原理について説明します。
OceanBaseデータベースは、マルチテナントアーキテクチャをサポートする分散型データベースです。OBServerノードが異なるテナントからのリクエストを処理する際には、テナント固有のスレッドに依存してリクエストを処理し、最終的にクライアント(例:OBClientまたはアプリケーション側がODPを通じて返す結果)に返します。このプロセスにおいて、OceanBaseデータベースのバックグラウンドシステムスレッドは、システムタスクやマルチテナント共有タスクを実行します。すべてのスレッドの健全な動作は、OBServerの安定した運用および信頼性の高い高可用性データサービスを支える基盤となります。OceanBaseデータベースがマルチテナントスレッドアーキテクチャの下でどのようにリクエスト処理を行うかを説明するために、OBServerが受信する3種類の基本的なテナントリクエストについて詳しく紹介します。
適用シナリオ
シナリオ1
OBServerノードがクライアントからテナントA(テナントID 1014)に対するSQLリクエストを受信した場合、そのSQL自体はOLTP型のSQLであり、単一のテナントスレッドによるローカル実行で完了します。リクエストの実行プロセスは以下のとおりです:
クライアントがOBServerノードにリクエストreq1を送信します。
req1はテナントリクエストキューに入ります。OBServerノードでは、この種のSQLリクエストはテナントリクエストキューのqueue4に入ります。
マルチテナントのワーカースレッドがリクエストキューを巡回し、テナント
1014のテナントスレッド(TNT_1014)がキュー内に処理待ちの新しいリクエストを検出すると、req1をキューから取り出します。TNT_1014がreq1を実行します。
TNT_1014が実行結果と戻り値をクライアントに返します。
OceanBaseデータベースのマルチテナントスレッドがローカルOLTP型SQLを処理するプロセスは以下の図のとおりです。

シナリオ2
OBServerノードがテナントB(テナントID 1011)から別のOBServerノードへのRPCリクエスト(例えば、分散型のOLTP型SQLリクエスト)を受信した場合、そのリクエストは当該テナントスレッドによって実行される必要があります。このRPCリクエストの実行プロセスは以下のとおりです:
テナント内の別のOBServerノードがRPCクライアントとして、現在のOBServerノードにRPCリクエストreq1を送信します。
req1はOLTP型のSQLリクエストであり、OBServerノードのテナントリクエストキューqueue2に入ります。
マルチテナントのワーカースレッドがリクエストキューを巡回し、テナント
1011のテナントスレッド(TNT_1011)がキュー内に処理待ちの新しいリクエストを検出すると、req1をキューから取り出します。TNT_1011がreq1を実行します。
TNT_1011が実行結果と戻り値をリモートのOBServerノードに返します。
OceanBaseデータベースのマルチテナントスレッドが分散型SQL RPCリクエストを処理するプロセスは以下の図のとおりです。

シナリオ3
OBServerノードがクライアントからテナントC(テナントID 1013)に対するPX SQLリクエストを受信し、すべてのSQLアクセスがローカルで実行される場合。リクエストの実行プロセスは以下のとおりです:
クライアントがOBServerノードにリクエストreq1を送信します。
req1はテナントリクエストキューに入ります。OceanBaseデータベースでは、通常のSQLはテナントリクエストキューのqueue4に入ります。
マルチテナントのワーカースレッドがリクエストキューを巡回し、テナント
1013のテナントスレッド(TNT_1013)がキュー内に処理待ちの新しいリクエストを検出すると、req1をキューから取り出します。テナントスレッドはLocal SchedulerとしてPXスレッドを駆動し、タスクを実行します。
実行完了後、req1の実行結果と戻り値をクライアントに返します。
OceanBaseデータベースのマルチテナントスレッドがローカルPX SQLリクエストを処理するプロセスは以下の図のとおりです。

関連パラメータ
cpu_quota_concurrency
Unitのパラメータmin_cpuとシステム構成パラメータcpu_quota_concurrencyが共同で、単一テナントのアクティブスレッド数を決定します。
単一テナントのアクティブスレッド数 = min_cpu × cpu_quota_concurrency
デフォルト値は4で、取り得る範囲は[1,20]です。このパラメータは動的に反映されます。
標準的な本番環境でのデプロイメントでは、デフォルト値のままにすることを推奨します。
workers_per_cpu_quota
Unitのパラメータmax_cpuとシステム構成パラメータworkers_per_cpu_quotaが共同で、単一テナントに割り当て可能なスレッド数の上限を決定します。
単一テナントのスレッド数上限 = max_cpu × workers_per_cpu_quota
デフォルト値は10で、取り得る範囲は[2, 20]です。このパラメータは動的に反映されます。
標準的な本番環境でのデプロイメントでは、デフォルト値のままにすることを推奨します。
関連ビュー
ビュー名またはテーブル名 |
説明 |
|---|---|
| GV$OB_TENANT_RUNTIME_INFO | OceanBaseデータベースのマルチテナントスレッドにおけるキューとスレッドの制限に関する情報。 |