OceanBaseデータベースはマルチテナント機能を備えており、クラスタレベルでインスタンスリソースのプール化を実現しています。OceanBaseデータベースでは、各テナントが1つのインスタンス(MySQLインスタンスに類似)となります。テナント間ではデータ、権限、リソースが分離されており、各テナントは独立したアクセスポートおよびCPU、メモリなどのリソースを保有します。
背景
OceanBaseデータベースでは、テナントのリソース割り当て(CPU、メモリ)を柔軟に調整でき、そのプロセスは上位の業務に対して透過的です。マルチテナント機構により、OceanBaseクラスタはユーザーがリソースを効率的に活用し、可用性とパフォーマンスを保証しつつコストを最適化し、ニーズに応じた弾力的なスケールアウトを実現することができます。
OceanBaseデータベースのマルチテナントの概念をより容易に理解していただくため、以下ではOceanBaseデータベースのテナントを作成する例を用いて、手順を追って説明します。
リソース構成Unit Configの作成
OceanBaseデータベースにおいて、リソースユニット(Unit)は、テナントがCPUやメモリを使用する最小の論理単位であり、クラスタの拡張やロードバランシングの基本単位でもあります。クラスタノードの追加・削除、拡張・縮小時には、リソースユニットのノード上での配置を動的に調整することで、リソースの均等な利用を実現します。一方、Unit Configは、一つのUnitが使用する計算・ストレージリソース(メモリ、CPU、I/Oなどを含む)の仕様を規定した設定情報です。
分散アーキテクチャを採用しているため、OceanBaseデータベースのテナントは、リソース構成、リソースプール、レプリカタイプ、レプリカの配置という複数の異なる次元で柔軟に定義できます。そのため、テナントの作成時も、「unit config -> resource pool -> tenant」という順序で作成・定義を行う必要があります。
OceanBaseデータベースでテナントを作成する前に、まずテナントのUnit Configを決定する必要があります。これはsysテナントの管理者として、以下のSQLステートメントを使用して作成します。
以下では、CPU、メモリ、使用量の最大・最小しきい値をそれぞれ指定して、unit1とunit2という二つのUnit Configを作成します。
unit1リソースユニットのCPU、メモリ使用サイズを3コア、6GBに設定します。obclient [oceanbase]> CREATE RESOURCE UNIT UNIT1 MAX_CPU =3,MIN_CPU =3 ,MEMORY_SIZE ='6G';unit2リソースユニットのCPU、メモリ使用サイズを4コア、8GBに設定します。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に関連付ける必要があります。
二つの異なるリソースプールpool1、pool2を作成し、それぞれをunit1、unit2に割り当てます。これにより、リソースユニットとリソースプールの対応関係が確立されます。UNIT_NUMは、一つのレプリカで指定するunitユニットの数を表します(同一テナント内で、一つのノード上には最大一つのunitしか存在できません)。ZONE_LISTは、テナントを現在のクラスタ内のどのレプリカにデプロイするかを指定します。
本例では単一ノードクラスタを想定しているため、両方とも単一のUnitとZone Listを指定します。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名は、実際に作成する状況に応じて具体的に記入する必要があります。
作成済みのリソースプールに基づいてテナントを作成する
ユニットコンフィグとリソースプールの作成、およびリソースユニットとリソースプールの対応付けが完了したら、テナントの作成を開始できます。
この例では単一ノードクラスタであるため、作成できるのはシングルレプリカのテナントのみです。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;