OceanBaseデータベースはマルチテナント型のデータベースシステムであり、1つのクラスタ内に複数の独立したテナントを含むことができます。各テナントは独立したデータベースサービスを提供します。OceanBaseデータベースでは、リソース設定(unit_config)、リソースプール(Resource Pool)、リソースユニット(Unit)という3つの概念を用いて、各テナントの利用可能なリソースを管理します。
テナントリソースの作成
テナントを作成する前に、まずテナントのリソース構成や使用するリソースの範囲などを決定する必要があります。テナント作成の一般的な手順は以下のとおりです:
リソース構成の作成
リソースプールの作成
テナントの作成
リソース構成の作成
リソース構成とは、リソースプールの設定情報を記述したものであり、リソースプール内の各リソースユニットが利用可能なCPU、メモリ、ストレージ容量、IOPSなどの仕様を示します。リソース構成を変更することで、リソースユニットの仕様を動的に調整できます。ここで注意すべき点として、リソース構成で指定されるのは対応するリソースユニットが提供できるサービス能力であり、リソースユニットの実際の負荷ではないということです。 リソース構成を作成するためのサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE UNIT uc1 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T' ;
CREATE RESOURCE UNIT ステートメントの必須パラメータには、以下が含まれます:
MAX_CPU:このリソース構成を使用するリソースユニットが提供できるCPUの上限を表します。MEMORY_SIZE:このリソース構成を使用するリソースユニットが提供できるメモリの仕様を表します。
オプションパラメータ MIN_CPU、MAX_IOPS、MIN_IOPS、LOG_DISK_SIZE について:
MIN_CPU:このリソース構成を使用するリソースユニットが提供できるCPUの下限を表します。デフォルトはMAX_CPUと等しいです。MAX_IOPSとMIN_IOPS:それぞれこのリソース構成を使用するリソースユニットが提供できるIOPSリソースの上限と下限を表します。最小値はいずれも1024であり、MAX_IOPS >= MIN_IOPSを満たす必要があります。MIN_IOPSとMAX_IOPSの値が指定されていない場合、MIN_IOPSとMAX_IOPSの値はデフォルトでINT64_MAXとなります。MAX_IOPSの値のみが指定されている場合、MIN_IOPSの値はMAX_IOPSの値となります。同様に、MIN_IOPSの値のみが指定されている場合、MAX_IOPSの値はMIN_IOPSの値となります。
LOG_DISK_SIZE:ログディスク容量を表します。デフォルトはメモリサイズの3倍で、最小は2GBです。
Metaテナントのリソース構成
Metaテナントには独立したユニットがなく、テナントのリソース管理プロセスではMetaテナントは管理されません。システムはテナントを作成する際に、デフォルトでMetaテナント用のリソースを予約し、各種リソースはユーザーテナントのリソースから差し引かれます。現在、Metaテナントの各種リソースはデフォルト設定を採用しており、ユーザー指定はサポートされていません。これには、CPU、MEMORY、IOPS、LOG_DISK_SIZEが含まれます。
そのうち:
CPUリソース:MetaテナントとユーザーテナントはCPUリソースを共有し、分離されません。パブリッククラウドの最小販売単位が1c2Gであることを考慮し、CPUスペックの最小値は1cです。
GV$OB_UNITSビューに表示されるMetaテナントのCPUリソーススペックはNULLであり、これはユーザーテナントとCPUリソースを共有していることを示します。MEMORYリソース:メモリリソースは共有をサポートしておらず、Metaテナントとユーザーテナントのメモリリソースは分離する必要があります。デフォルトでは、Metaテナントは全体のテナントスペックの10%を占めます。Metaテナントの正常な動作を保証するため、Metaテナントのメモリリソーススペックの最小値は512MBで、上限は設定されていません。全体のテナントスペックからMetaテナントのメモリスペックを差し引いたものが、ユーザーテナントのメモリスペックとなります。全体のテナントスペックの最小値は1GBに調整されました。以下に例を挙げて説明します:
テナントスペックが10GB以上の場合、Metaテナントとユーザーテナントのメモリスペックの比率は1:9です。
テナントスペックが2GB以上の場合、Metaテナントのメモリスペックは固定で1GBとなり、残りのリソースはユーザーテナントに割り当てられます。
テナントスペックが2GB未満の場合、Metaテナントには固定で512MBが割り当てられ、残りのリソースはユーザーテナントに割り当てられます。
テナントスペックの最小値は1GBで、Metaテナントが512MBを占有し、ユーザーテナントが512MBを占有します。
ログディスクリソース:ログディスクリソースのスペックはユーザーが指定しなくてもよく、デフォルト値はメモリリソースの3倍で、最小値は2GBです。ログディスクリソースもメモリリソースと同様に共有をサポートしておらず、Metaテナントとユーザーテナントのログディスクリソースは分離する必要があります。デフォルトでは、Metaテナントは全体のテナントスペックの10%を占めます。Metaテナントの正常な動作を保証するため、Metaテナントのログディスクリソーススペックの最小値は512MBです。
IOPSリソース:MetaテナントとユーザーテナントはIOPSリソースを共有し、分離されません。
GV$OB_UNITSビューに表示されるMetaテナントのIOPSリソーススペックはNULLとなり、これはユーザーテナントとIOPSリソースを共有していることを示します。
ユーザーテナントとMetaテナントのリソーススペックの値は、以下の表に示されています。
| リソースパラメータ | テナント仕様 | ユーザーテナント | Metaテナント |
|---|---|---|---|
| MIN_CPU / MAX_CPU | 最小 1C | 共有CPUリソース仕様 | 共有CPUリソース仕様 |
| MEMORY_SIZE | 最小 1G | 最小 512M | テナント仕様の10%:
|
| LOG_DISK_SIZE | 最小 2G | 最小 1.5G | テナント仕様の10%、最小512M |
| MAX_IOPS / MIN_IOPS | 最小 1024 | 共有IOPSリソース仕様 | 共有IOPSリソース仕様 |
リソースプールの作成
リソースプールは複数のリソースユニットで構成されており、リソースプールにリソース設定を指定することで、そのリソースプール内の各リソースユニットの物理リソースを指定できます。リソースプールを作成するサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
このサンプルステートメントでは、リソースプール rp1 を作成しています。このリソースプールには3つの要素があり、いずれか1つでも欠けることはできません:
UNIT 'uc1'は、このリソースプールに指定されたリソース設定がuc1であることを示し、このリソースプール内の各リソースユニットはuc1の仕様で設定されます。ZONE_LIST ('zone1','zone2')は、リソースプールに指定された使用範囲であり、このリソースプールがzone1およびzone2にリソースユニットを作成することを示します。UNIT_NUM 2は、リソースプールに指定されたリソースユニットの数であり、ZONE_LIST内の各ゾーンに2つのリソースユニットを作成することを示します。
どのリソースユニットも、十分なリソースを持つ物理マシンに配置する必要があり、単一の物理マシン上には同一リソースプールのリソースユニットを最大1つしか配置できません。もし zone1 または zone2 上の物理マシン数が2未満、あるいは物理マシンのリソースが uc1 の仕様を満たさない場合、上記のリソースプール作成サンプルステートメントは正常に実行できず、最終的にリソースプールの作成は失敗します。
テナントの作成
リソースプールを作成した後、次にテナントを作成します。1つのリソースプールは1つのテナントにのみ属し、1つのテナントは1つ以上のリソースプールを持つことができます。また、テナントは同一ゾーン上に1つのリソースプールしか持つことができません。すなわち、同一テナントに属する複数のリソースプールの ZONE_LIST は互いに重複してはなりません。1つのテナントのすべてのリソースプールに含まれる全リソースユニットの集合は、そのテナントが利用可能なすべての物理マシンリソースを表します。
テナントを作成するサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z1', 'z2');
obclient>CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z3');
obclient>CREATE TENANT tt resource_pool_list=('pool1','pool2');
サンプルステートメントでは、最初に2つのリソースプール pool1 と pool2 を作成し、その上でテナント tt を作成しています。テナント tt は z1、z2、z3 上にそれぞれ2つのリソースユニットを持ち、各リソースユニットの仕様はすべて uc1 で指定されたリソース設定を使用します。
注意
同一テナントに属する複数のリソースプールの ZONE_LIST は互いに重複してはなりません。
テナントリソースの変更
テナントのリソース変更は、テナント内の各リソースの3つの要素を調整することで完了します。具体的には、リソースプールのUnit構成、ZONE_LIST、およびUNIT_NUMを個別に調整することで、テナントリソースを変更できます。さらに、リソースプールに対してSplitまたはMergeという2つの特殊な変更操作もサポートされています。
リソース構成の変更
リソースプールのリソース構成を変更すると、CPUやメモリなどの値を直接調整することになり、それによってそのリソースプール上でのテナントのリソース仕様およびサービス能力に直接影響します。 リソースプールのリソース構成を変更するためのサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE UNIT uc1 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '32G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T';
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z1', 'z2');
obclient> CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('z3');
obclient> CREATE TENANT tt resource_pool_list=('pool1','pool2');
obclient> ALTER RESOURCE UNIT uc1 MAX_CPU 6, MEMORY_SIZE '36G';
例では、リソースプールpool1とpool2のリソース構成はuc1であり、ステートメントALTER RESOURCE UNIT uc1 MAX_CPU 6, MEMORY_SIZE '36G';により、リソース構成uc1のMAX_CPUを6に、MEMORY_SIZEを36Gに調整します。他の構成オプションは変更しません。リソース構成の各オプションを調整することで、対応するゾーン上のテナントのリソースプールのリソース仕様を調整し、結果としてテナントのサービス能力に影響を与えることができます。
リソースプールの設定変更
リソースプールの設定を変更することで、そのリソースプール内の各リソースユニットのリソース仕様を調整し、結果としてテナントがそのリソースプール上で利用可能なリソース仕様およびサービス能力を調整できます。
リソースプールの設定を変更するためのサンプルステートメントは以下のとおりです:
obclient> ALTER RESOURCE POOL rp1 UNIT 'uc2';
リソースプール rp1 の以前の設定が uc1 であると仮定すると、サンプルステートメントは rp1 の設定を uc1 から uc2 に変更します。理論的には、OceanBaseデータベースはリソース仕様の MIN_CPU、MAX_CPU、および MEMORY_SIZE を同時に変更することをサポートしています。ただし、一般的には、設定の変更や切り替えによってテナントのサービス能力を調整できます。これは、テナントレベルでは実際にはテナントのリソースユニットの仕様を調整することになります。リソース仕様の変更には通常、以下の2つのシナリオがあります:
リソース仕様の引き上げ
リソース仕様の引き上げは主にテナントのリソース拡張シナリオで使用され、CPUとMemoryそれぞれに対してリソース拡張を行うことができます。
サンプル1:
obclient> CREATE RESOURCE UNIT u_c0 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T'; obclient> CREATE RESOURCE POOL pool1 unit='u_c0', unit_num=3, zone_list=('z1','z2','z3'); obclient> ALTER RESOURCE UNIT u_c0 MAX_CPU 10, MIN_CPU 8, MEMORY_SIZE '72G';上記のサンプル1では、リソース設定
u_c0を作成し、リソースプールpool1を作成しました。pool1はu_c0を自身のリソース設定として使用し、その後u_c0のMIN_CPU、MAX_CPU、またはMEMORY_SIZEを引き上げます。この調整は、リソースプールpool1のリソース仕様を引き上げることを目的としており、対応するテナントのサービス能力を向上させることを目指しています。サンプル2:
obclient> CREATE RESOURCE UNIT u_c0 MAX_CPU 5, MIN_CPU 4, MEMORY_SIZE '36G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T'; obclient> CREATE RESOURCE UNIT u_c1 MAX_CPU 10, MIN_CPU 8, MEMORY_SIZE '72G', MAX_IOPS 128000, MIN_IOPS 128000, LOG_DISK_SIZE '2T'; obclient> CREATE RESOURCE POOL pool1 unit='u_c0', unit_num=3, zone_list=('z1','z2','z3'); obclient> ALTER RESOURCE POOL pool1 unit='u_c1';上記のサンプル2では、2つのリソース設定
u_c0とu_c1を作成しました。また、リソースプールpool1を作成し、pool1は最初にu_c0を自身のリソース設定として使用し、その後リソース設定をu_c1に調整しました。この調整は、リソースプールpool1のリソース仕様を引き上げることを目的としており、対応するテナントのサービス能力を向上させることを目指しています。リソース仕様の引き下げ
リソース仕様の引き上げのサンプルに基づいて、システムはリソース仕様の引き下げもサポートしており、その方法はリソース仕様の引き上げと同じです。
アロケーションされていないリソースプールのUNIT_NUM変更
リソースプールのUNIT_NUMを調整することで、リソースプール内の各ゾーンにおけるリソースユニット数を変更し、それによって該当するゾーン上でのテナントのサービス能力を向上または低下させることができます。
リソースプールのUNIT_NUMを調整するためのサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
obclient> ALTER RESOURCE POOL rp1 UNIT_NUM 3; // UNIT_NUMを増やす
obclient> ALTER RESOURCE POOL rp1 UNIT_NUM 2; // UNIT_NUMを減らす
obclient> ALTER RESOURCE POOL rp1 UNIT_NUM 1 DELETE UNIT = (1001, 1003); // リソースユニットを指定してUNIT_NUMを減らす
UNIT_NUMの変更も、UNIT_NUMを増やす場合と減らす場合の2種類に分かれます。その中で、ALTER RESOURCE POOL rp1 UNIT_NUM 3;はUNIT_NUMを増やす処理であり、ALTER RESOURCE POOL rp1 UNIT_NUM 2;とALTER RESOURCE POOL rp1 UNIT_NUM 1 DELETE UNIT = (1001, 1003);はUNIT_NUMを減らす処理です。
テナントリソースプールのUNIT_NUM変更
リソースプールをテナントに割り当てた後でも、UNIT_NUMの変更が可能です。リソースプールの変更はテナント単位で行われ、すべてのリソースプールで増加させる必要があります。テナントリソースプールのUNIT_NUMを調整するためのサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE POOL pool1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');
obclient> CREATE RESOURCE POOL pool2 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone3');
obclient> CREATE TENANT tt resource_pool_list=('pool1','pool2');
obclient> ALTER RESOURCE TENANT tt UNIT_NUM = 3;// UNIT_NUMを増やす
obclient> ALTER RESOURCE TENANT tt UNIT_NUM = 1;// UNIT_NUMを減らす
ZONE_LISTの変更
リソースプールのZONE_LISTを調整することで、リソースプールのゾーン単位での使用範囲を変更し、それによってテナントデータのゾーン単位でのサービス範囲を調整することができます。
リソースプールのZONE_LISTを調整するためのサンプルステートメントは以下のとおりです:
obclient> CREATE RESOURCE POOL pool1 UNIT_NUM=3, UNIT='unit_config', ZONE_LIST=('z1','z2','z3');
obclient> CREATE RESOURCE POOL pool2 UNIT_NUM=3, UNIT='unit_config', ZONE_LIST=('z1','z2','z3');
obclient> ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4');
obclient> ALTER RESOURCE POOL pool2 ZONE_LIST=('z1','z2');
ZONE_LISTの変更も、ゾーン単位での使用範囲を拡大する場合と縮小する場合の2種類に分かれます。その中で、ALTER RESOURCE POOL pool1 ZONE_LIST=('z1','z2','z3','z4');はゾーン単位での使用範囲を拡大する処理であり、ALTER RESOURCE POOL pool2 ZONE_LIST=('z1','z2');はゾーン単位での使用範囲を縮小する処理です。
リソースプールの分割
リソースプールを分割すると、1つのリソースプールが複数のリソースプールに分割されます。リソースプールを分割するための基本構文と例は以下のとおりです:
obclient> CREATE RESOURCE POOL pool1 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z1','z2','z3');
obclient> ALTER RESOURCE POOL pool1 SPLIT INTO ('pool10','pool11','pool12') ON ('z1','z2','z3');
obclient> ALTER RESOURCE POOL pool10 UNIT='uc1';
obclient> ALTER RESOURCE POOL pool11 UNIT='uc2';
obclient> ALTER RESOURCE POOL pool12 UNIT='uc3';
リソースプールの統合
リソースプールを統合すると、複数のリソースプールが1つのリソースプールに統合されます。リソースプールを統合するための基本構文と例は以下のとおりです:
obclient> CREATE RESOURCE POOL pool1 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z1');
obclient> CREATE RESOURCE POOL pool2 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z2');
obclient> CREATE RESOURCE POOL pool3 UNIT='uc0', UNIT_NUM=1, ZONE_LIST=('z3');
obclient> ALTER RESOURCE POOL MERGE ('pool1','pool2','pool3') INTO ('pool0');
説明
リソースプールを統合しても、テナントによる使用には影響しません。Root Serviceの管理層では、複数のリソースプールが1つのリソースプールに統合され、一元管理が容易になります。