OceanBaseデータベースはマルチテナント機能を備え、クラスタレベルでインスタンスリソースのプール化を実現しています。OceanBaseデータベースでは、各テナントがそれぞれ一個のインスタンス(MySQLインスタンスに相当)となります。テナント間では、データ、権限、リソースが互いに分離されており、各テナントは独立したアクセスポートとCPU、メモリなどのアクセスリソースを保有します。
背景
OceanBaseデータベースは、テナントのリソース割り当て(CPU、メモリ)を柔軟に調整でき、その変更はアプリケーションレイヤーには透過的に行われます。マルチテナントの仕組みを通じて、OceanBaseクラスタはユーザーによる効率的なリソース活用を支援し、可用性とパフォーマンスを確保しつつ、コストを最適化し、需要に応じた柔軟な拡張を可能にします。
OceanBaseのマルチテナントの仕組みをより分かりやすく理解していただくために、以下では1つのテナントを作成する手順を例として説明します。
リソース構成Unit Configの作成
OceanBaseデータベースにおいて、リソースユニット(Unit)は、テナントがCPUとメモリを使用する最小の論理単位であり、クラスタの拡張とロードバランシングの基本単位でもあります。クラスタノードの追加・削除や拡張・縮小が行われる際に、リソースユニットのノード上での配置を動的に調整することで、リソース使用の均衡を図ります。一方、Unit Config(ユニット構成)は、一つのUnitが使用する計算・ストレージリソース(メモリ、CPU、IOなどを含む)の仕様を規定する設定情報です。
OceanBaseデータベースは分散アーキテクチャを採用しているため、一つのテナントはリソース構成、リソースプール、レプリカタイプ、レプリカの配置といった、いくつかの異なる観点から柔軟に定義できます。このため、テナントを作成する際も、「unit config -> resource pool -> tenant」の順序に従って作成・定義を行う必要があります。
OceanBaseデータベースでテナントを作成する前に、テナントのUnit Configを決定する必要があります。作成にはsysテナントの管理者として、以下に示すSQL文を使用します。
以下では、CPU、メモリ、最大使用量と最小使用量のしきい値をそれぞれ指定して、unit1とunit2という2つのUnit Configを作成します。
unit1リソースユニットを作成し、CPU使用量を3コア、メモリ使用量を6Gに設定します。obclient [oceanbase]> CREATE RESOURCE UNIT UNIT1 MAX_CPU =3,MIN_CPU =3 ,MEMORY_SIZE ='6G';unit2リソースユニットを作成し、CPU使用量を4コア、メモリ使用量を8Gに設定します。obclient [oceanbase]> CREATE RESOURCE UNIT UNIT2 MAX_CPU =4,MIN_CPU =4 ,MEMORY_SIZE ='8G';
リソースプールの作成とUnit Configの関連付け
Unit Config(ユニット構成)はテナントの設定仕様情報をまとめたものであり、Resource Poolはテナントのリソースエンティティです。このステップでは、Resource Poolを作成し、Unit Configと関連付けます。
2つの異なるリソースプールpool1、pool2を作成し、それぞれをunit1、unit2に指定することで、リソースユニットとリソースプールを対応させます。UNIT_NUMでは、1つのレプリカ内に作成するunitの数を指定します(同一テナント内では、1つのノードに最大1つのunitのみ配置可能)。ZONE_LISTでは、テナントを現在のクラスタ内のどのレプリカに配置するかを指定します。
この例は単一ノードのクラスタであるため、Unit数とゾーンリストはどちらも一つだけ指定します。Resource Poolを作成するには、十分なリソースの空き容量が必要です。リソースが不足している場合、既存のtestテナントを削除するか、既存のテナントのUnit Configをより小さな構成に調整してみることができます。調整方法については、下記[テナント設定の変更とインスタンスリソース構成の調整]を参照してください。
obclient [oceanbase]> CREATE RESOURCE POOL pool1 UNIT='UNIT1',UNIT_NUM=1,ZONE_LIST=('zone1');
obclient [oceanbase]> CREATE RESOURCE POOL pool2 UNIT='UNIT2',UNIT_NUM=1,ZONE_LIST=('zone1');
注意
上記の例は単一ノードのクラスタ環境を対象としています。クラスタが3ノードの場合、ZONE_LISTの値は('zone1', 'zone2', 'zone3')となります。Zoneの名前は、ご利用の環境に合わせて設定する必要があります。
作成済みのResource Poolに基づいてテナントを作成する
Unit ConfigおよびResource Poolの作成と、リソースユニットとリソースプールの対応付けが完了後、テナントの作成を開始できます。
この例は単一ノードクラスタであるため、作成できるのは単一レプリカのテナントのみです。もし3レプリカのテナントを作成したい場合は、OceanBaseクラスタに少なくとも3つのノードが必要です。
tenant1という名前の単一レプリカテナントを定義し、文字セットをutf8mb4、リソースプールをpool1に指定します。ob_tcp_invited_nodesはテナントのアローリスト定義で、初期値は'%'に設定できます。これは任意のIPアドレスからのアクセスを許可することを意味し、後で変更可能です。
obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant1 CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool1') SET ob_tcp_invited_nodes='%';
注意
上記の例は単一ノードのクラスタ環境を対象としており、単一レプリカのテナントしか作成できません。クラスタが3ノードの場合、PRIMARY_ZONEには 'zone1;zone2;zone3'と入力します。これは、テナントのリーダーレプリカが zone1に優先的に配置され、次にzone2が優先されることを意味します。
同様に、tenant2という名前の単一レプリカのテナントを定義し、文字セットをutf8mb4に設定しpool2のリソースプールを使用します。
obclient [oceanbase]> CREATE TENANT IF NOT EXISTS tenant2 CHARSET='utf8mb4', PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('pool2') SET ob_tcp_invited_nodes='%';
tenant1、tenant2テナントの作成が完了したら、oceanbase.DBA_OB_TENANTSビューを照会することで、テナントが正常に作成されたかどうかを確認できます。
obclient [oceanbase]> SELECT * FROM DBA_OB_TENANTS;
上記操作が完了したら、同一クラスタ内に2つのテナントを作成する手順が完了します。これで、テナント内で通常のデータベース操作を実行できます。
rootユーザーでクラスタのtenant1テナントにログインし、テストテーブルを作成します。
obclient -hxxx.xxx.xxx.xxx -P2883 -uroot@tenant1#ob_test -p******
obclient [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| information_schema |
| mysql |
| test |
+--------------------+
4 rows in set
obclient [(none)]> USE test;
Database changed
obclient [test]> CREATE TABLE t_f1(id DECIMAL(10,0),id2 DECIMAL(10,0),id3 DATE,id4 DATE,id5 FLOAT,id6 FLOAT,id7 VARCHAR(30),id8 VARCHAR(300));
Query OK, 0 rows affected
obclient [test]> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| t_f1 |
+----------------+
1 row in set
rootユーザーでクラスタのtenant2テナントにログインし、testデータベースの状態を確認します。
obclient -hxxx.xxx.xxx.xxx -P2883 -uroot@tenant2#ob_test -p******
obclient [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| oceanbase |
| information_schema |
| mysql |
| test |
+--------------------+
4 rows in set
obclient [(none)]> USE test;
Database changed
obclient [test]> SHOW TABLES;
Empty set
クラスタ内の2つのテナントのリソース、データ、権限はすべて分離されていることがわかります。さらにテストを行い、OceanBaseデータベースのテナント分離機能をご体験ください。
テナント設定の変更とインスタンスリソース構成の調整
OceanBaseデータベースでは、テナントリソースのCPUおよびメモリを柔軟に調整でき、その変更はオンラインで即座に有効になるため、業務への影響はありません。テナントが使用するCPUやメモリのサイズを変更するには、リソースプールやテナント自体を調整する必要はなく、テナントに対応するUnit Config(ユニット構成)を調整するだけです。
テナントのリソースユニットは、システムビューoceanbase.DBA_OB_UNIT_CONFIGSで確認できます。
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
| UNIT_CONFIG_ID | NAME | CREATE_TIME | MODIFY_TIME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT |
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
| 1 | sys_unit_config | 2022-11-17 18:00:47.297945 | 2022-11-17 18:00:47.297945 | 1 | 1 | 8053063680 | 8053063680 | 10000 | 10000 | 1 |
| 1010 | unit1 | 2022-12-15 11:40:17.811095 | 2022-12-15 11:40:17.811095 | 3 | 3 | 6442450944 | 2147483648 | 128 | 128 | 0 |
| 1011 | unit2 | 2022-12-16 16:16:27.053872 | 2022-12-16 16:16:27.053872 | 4 | 4 | 8589934592 | 8589934592 | 128 | 128 | 0 |
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
6 rows in set (0.003 sec)
クエリ結果によると、unit1リソースユニットのCPU使用率は3コア、メモリ使用量は6GBです。
以下のコマンドで、unit1リソースユニットのCPUとメモリの使用量を5コア、10GBに調整します。
obclient [oceanbase]> ALTER resource unit unit1 max_cpu =5,min_cpu =5 ,memory_size ='10G';
Query OK, 0 rows affected
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_UNIT_CONFIGS;
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
| UNIT_CONFIG_ID | NAME | CREATE_TIME | MODIFY_TIME | MAX_CPU | MIN_CPU | MEMORY_SIZE | LOG_DISK_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT |
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
| 1 | sys_unit_config | 2022-11-17 18:00:47.297945 | 2022-11-17 18:00:47.297945 | 1 | 1 | 8053063680 | 8053063680 | 10000 | 10000 | 1 |
| 1010 | unit1 | 2022-12-15 11:40:17.811095 | 2023-01-05 16:24:17.287801 | 5 | 5 | 10737418240 | 2147483648 | 128 | 128 | 0 |
| 1011 | unit2 | 2022-12-16 16:16:27.053872 | 2022-12-16 16:16:27.053872 | 4 | 4 | 8589934592 | 8589934592 | 128 | 128 | 0 |
+----------------+-----------------+----------------------------+----------------------------+---------+---------+-------------+---------------+----------+----------+-------------+
6 rows in set (0.037 sec)
上記のとおり、テナント設定の調整はオンラインで即時に有効になります。調整が成功すると、unit1のCPUは5コア、メモリは10GBとなります。OceanBaseデータベースは、カーネルの仮想化技術により、設定変更後にデータ移行や切り替えを行うことなくテナントのCPUとメモリリソースを即座に有効にできるため、業務への影響はありません。
DBA_OB_UNITSビューを確認することで、クラスタ内におけるリソースユニット、リソースプール、テナントの対応情報、およびCPU、メモリ情報を取得できます。
obclient [oceanbase]> SELECT * FROM DBA_OB_UNITS;