本記事では、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リクエストであり、req1リクエストは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データベースのマルチテナントスレッドにおけるキューとスレッド制限に関する情報。 |