OceanBaseデータベースはマルチテナントアーキテクチャを採用しています。マルチテナントアーキテクチャは、リソース統合(Resource Consolidation)やSaaSサービスなどのシナリオに適しており、運用保守の複雑さも低減させます。
クラスタはデプロイメントレベルの物理的概念で、ゾーンとノードの集合です。ゾーンとノードには、デプロイメントリージョン(リージョンと呼ばれる)などの属性があります。一方、テナントはリソースレベルの論理的概念で、物理ノード上に分割されたリソースユニットであり、CPU、メモリ、ログディスク容量、IOPSなどのリソース仕様を指定できます。
テナントは従来のデータベースのデータベースインスタンスに類似しており、リソースプールを通じてリソースに関連付けられ、一定のリソースクォータを専有し、動的に調整することができます。テナント内では、データベース、テーブル、ユーザーなどのデータベースオブジェクトを作成できます。
テナントの概念を明確に説明するためには、まずリソース仕様、リソースユニット(Unit)、リソースプールなどの前提概念を明確に説明する必要があります。リソース仕様に対応するビューはDBA_OB_UNIT_CONFIGS、リソースプールに対応するビューはDBA_OB_RESOURCE_POOLS、リソースユニットに対応するビューはDBA_OB_UNITS、テナントに対応するビューはDBA_OB_TENANTSです。
リソース仕様
リソース仕様は、CPU、メモリ、ディスク容量、IOPSなどの一般的な物理リソース項目のサイズを定義します。リソースプールを作成する際にそのリソース仕様を指定し、定義に基づいてリソースユニットを作成します。
リソースユニット(Unit)
Unitはテナント管理において非常に重要な概念です。OceanBaseはUnitに基づいて管理される物理リソースで、CPU、メモリ、ストレージ容量、IOPSなどの物理リソースの集合です。Unitはリソーススケジューリングの基本単位でもあり、ノード、Zone、Regionなどの位置属性を持っています。ノードはサーバーが抽象化されたもの、Zoneはデータセンターが抽象化されたもの、Regionは地域が抽象化されたものです。Unitの位置属性を調整することで、テナントのデプロイメント方式を調整します。
リソースプール
各Unitは必ず一つのリソースプールに属し、各リソースプールは複数のUnitで構成されています。リソースプールはリソース割り当ての基本単位であり、同一リソースプール内の各Unitは同一のリソース仕様を持ち、すなわちそのリソースプール内のUnitの物理リソースサイズはすべて同じです。
上図は、6つのUnitで構成されるリソースプールa_poolを示しています。このリソースプールには以下の重要な属性があります:
ZONE_LIST:このリソースプール内のUnitがどのゾーンに配置されているかを記述します。この例ではZONE_LIST='zone1,zone2,zone3'です。Unit_NUM:ZONE_LIST内の各ゾーンのUnit数を記述します。この例ではUnit_NUM=2です。Unit_CONFIG_ID:このリソースプールが関連付けられているリソース仕様を記述します。それによってこのリソースプール内の各Unitの物理リソースサイズ(CPU、メモリ、ログディスク容量、IOPSなど)が決定されます。
Unitの概念により、OceanBaseデータベースの物理的概念と論理的概念が関連付けられました。各テナントは複数のUnitを持ち、複数のゾーンの複数のノード上に分散配置されます。また、各ノード上には複数のUnitが配置され、これらのUnitは異なるテナントに属します。要約すると、クラスタはノードで構成され、ノードはUnitのコンテナです。テナントはUnitで構成され、Unitはデータベースオブジェクトのコンテナです。
テナント作成時にRESOURCE_POOL_LISTを設定することで、そのテナントが関連付けるリソースプールを指定でき、結果としてそのテナントは指定されたリソースプールのUnitを保有します。例えば、テナントaのRESOURCE_POOL_LIST=('a_pool')を設定すると、そのデプロイメント図は以下のようになります:
このテナントは3つのゾーンにデプロイされ、各ゾーンには2つのUnitがあります。a_poolのUnit_CONFIG_IDパラメータを調整することで、テナントの物理リソースを動的に調整できます。
また、Unitを同一ゾーン内の異なるノードに配置すること(Unit移行と呼ばれる)で、ゾーン内の異なるノード間のロードバランシングを実現できます。ノード障害発生時には、その上のUnitを同一ゾーン内の他のノードに移行することで、自動ディザスタリカバリと復旧を実現します。Unitを異なるゾーンに配置すること(テナントのLocality属性を変更すること)で、テナントのデプロイメントモードを調整し、「同一リージョン内3データセンター」、「2リージョン・3データセンター」、「3リージョン・5データセンター」など、さまざまなディザスタリカバリレベルを実現できます。