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倍に等しく、最小値は2Gです。
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 は互いに重複してはなりません。
テナントリソースの変更
テナントのリソース変更は、テナント内の各リソースの三要素を調整することで完了します。具体的には、リソースプールのUnit構成、ZONE_LIST、UNIT_NUM を個別に調整することで、テナントのリソースを変更できます。さらに、リソースプールに対してSplitまたはMergeという二つの特殊な変更操作もサポートされています。
リソース構成の変更
リソースプールのリソース構成を変更するとは、リソース構成の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 を同時に変更することをサポートしています。しかし、通常の場合、リソース構成の変更と切り替えはどちらもテナントのサービス能力を調整するために使用できます。テナントレベルで見ると、実際にはテナントのリソースユニットの仕様を調整していることになります。リソース仕様の変更には通常、以下の二つのシナリオがあります:
リソース仕様の引き上げ
リソース仕様の引き上げは主にテナントのリソース拡張シナリオで使用され、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では、リソース構成
u_c0とu_c1の二つを作成しました。そして、リソースプールpool1を作成しました。pool1は最初、u_c0を自身のリソース構成として使用しますが、その後リソース構成u_c1に調整します。この調整も、リソースプールpool1のリソース仕様を引き上げ、対応するテナントのサービス能力を向上させることを目的としています。リソース仕様の引き下げ
リソース仕様の引き上げの例に基づき、システムはリソース仕様の引き下げもサポートしており、方法はリソース仕様の引き上げと同じです。
UNIT_NUMの変更
現在のバージョンでは、テナントの同種ゾーンモードと異種ゾーンモードをサポートしています:
同種ゾーンモードでは、テナント内の各ゾーンの
UNIT_NUMが同じである必要があります。異種ゾーンモードでは、テナント内の各ゾーンの
UNIT_NUMが異なることを許可しますが、一つのテナントのすべてのゾーンでUNIT_NUMが二種類を超えることはできません。
注意
通常、既存のテナントやアップグレードされたテナントは、デフォルトで同種ゾーンモードになっています。異種ゾーンモードを有効にするには、テナントレベルの構成パラメータ 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の変更には、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を変更できます。リソースプールの変更はテナント単位で行われ、すべてのリソースプールで増加させる必要があります。
テナントのリソースプール情報は以下のとおりです:
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の変更も、ゾーン単位での利用範囲を拡大する場合と縮小する場合の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つのリソースプールに統合され、一元管理が容易になるだけです。