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テナントには独立したUnitがなく、テナントのリソース管理プロセスでは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テナントのメモリリソース仕様の最小は512Mで、上限値は設定されていません。全体のテナントメモリ仕様からMetaテナントのメモリ仕様を差し引いたものが、ユーザーテナントのメモリ仕様となります。全体のテナント仕様の最小値は1Gに調整されました。以下に例を挙げて説明します:
テナント仕様が10G以上の場合、Metaテナントとユーザーテナントのメモリ仕様の比率は1:9です。
テナント仕様が2G以上の場合、Metaテナントのメモリ仕様は固定で1Gとなり、残りのリソースはユーザーテナントに割り当てられます。
テナント仕様が2G未満の場合、Metaテナントには固定で512Mが割り当てられ、残りのリソースはユーザーテナントに割り当てられます。
テナント仕様の最小は1Gで、Metaテナントが512M、ユーザーテナントが512Mを使用します。
ログディスクリソース:ログディスクリソースの仕様はユーザーが指定しなくてもよく、デフォルト値はメモリリソースの3倍で、最小値は2Gです。ログディスクリソースもメモリリソースと同様に共有をサポートしておらず、Metaテナントとユーザーテナントのログディスクリソースは分離する必要があります。デフォルトで、Metaテナントは全体のテナント仕様の10%を占めます。Metaテナントの正常な動作を保証するため、Metaテナントのログディスクリソース仕様の最小は512Mです。
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 は互いに重複してはなりません。テナントのすべてのリソースプールに含まれる全リソースユニットの集合が、そのテナントが利用可能な全物理マシンリソースを表します。
テナントを作成するサンプルステートメントは以下のとおりです:
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やMemoryなどの値を直接調整することであり、それによってそのリソースプール上のテナントのリソース仕様とサービス能力に直接的な影響を与えます。 リソースプールのリソース構成を変更する例文は以下のとおりです:
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 に調整します。その他の構成オプションは変更しません。リソース構成の各オプションを調整することで、対応するZone上のテナントのリソースプールのリソース仕様を調整し、結果としてテナントのサービス能力に影響を与えることができます。
リソースプールのリソース構成の切り替え
リソースプールのリソース構成を切り替えることで、そのリソースプール内の各リソースユニットのリソース仕様を調整し、結果としてテナントがそのリソースプール上で利用可能なリソース仕様とサービス能力を調整できます。
リソースプールのリソース構成を切り替える例文は以下のとおりです:
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を異なる値に設定できますが、同一テナント内のすべてのゾーンで使用できるUNIT_NUMの種類は最大2種類までです。
注意
通常、既存のテナントやアップグレードされたテナントは、デフォルトで同種ゾーンモードに設定されています。異種ゾーンモードを有効にするには、テナントレベルの構成パラメータzone_deploy_modeの値をhetero(異種ゾーンモード)に変更する必要があります。変更後は、homo(同種ゾーンモード)に戻すことはできません。
同種ゾーンモードでの変更
未割り当てリソースプールのUNIT_NUM変更
同種ゾーンモードでは、リソースプールがテナントに割り当てられていない場合、
CREATE RESOURCE POOLステートメントを使用してリソースプールのUNIT_NUMを調整できます。これにより、リソースプール内の各ゾーンにおけるリソースユニット数を変更できます。未割り当てリソースプールの情報は以下のとおりです:
obclient> CREATE RESOURCE POOL rp1 UNIT 'uc1', UNIT_NUM 2, ZONE_LIST ('zone1', 'zone2');リソースプールの
UNIT_NUMを調整する例: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の変更も大きく2つに分類されます。UNIT_NUMを増やす場合と減らす場合です。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');テナントリソースプールのUNIT_NUMを調整する例:
obclient> ALTER RESOURCE TENANT tt UNIT_NUM = 3;// UNIT_NUMを増やすobclient> ALTER RESOURCE TENANT tt UNIT_NUM = 1;// UNIT_NUMを減らす注意点として、異種ゾーンモードでは、
UNIT_GROUPを指定してUNIT_NUMを減らすことはサポートされていません。また、異種ゾーンモードでは、個別のリソースプールの
UNIT_NUMを単独で調整することもサポートされています。ステートメントは以下のとおりです:obclient> ALTER RESOURCE POOL pool2 UNIT_NUM = 3;// UNIT_NUMを増やすobclient> ALTER RESOURCE POOL pool2 UNIT_NUM = 1;// UNIT_NUMを減らすobclient> ALTER RESOURCE POOL pool2 UNIT_NUM 1 DELETE UNIT = (1001, 1003); // 指定したリソースユニットで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の変更も大きく二つに分類されます。一つはゾーン単位での利用範囲を拡大するもの、もう一つはゾーン単位での利用範囲を縮小するものです。その中で、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つのリソースプールに統合され、一元的なメンテナンスが容易になります。