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