OceanBaseデータベースは、水平スケーリングやデータの動的均衡などのロードバランシング機能を提供します。
水平スケーリング機能とは、サービスノードの数を調整することでサービス能力の拡張・縮小を実現する機能です。例えば、単一のサービスノードから2つのサービスノードに拡張することで、サービス能力を拡大できます。同時に、水平スケーリングではデータの再分散もサポートする必要があります。例えば、単一のサービスノードから2つのサービスノードに拡張する場合、データを2つのサービスノード上に均等に分散させる必要があります。逆に、2つのサービスノードを単一のサービスノードに縮小する場合は、データを単一のサービスノードに再分散させる必要があります。
データの動的均衡機能とは、サービスノードを固定した状態で、データ分布を調整することで各サービスノードの負荷を動的に均衡させる機能です。例えば、テーブルやパーティションの動的な作成・削除に伴い、異なるサービスノード上のサービスのパーティション数に大きな差異が生じ、サービスノードの負荷が不均衡になることがあります。パーティションの動的均衡機能によって、パーティションを各サービスノード上に均等に分散させることで、ロードバランシングが実現できます。
水平スケーリング
OceanBaseデータベースにおけるテナントのストレージ容量および読み書きサービス能力は、主に以下の2つの側面の影響を受けます。
Unit Number、すなわち各Zoneでサービスを提供するUnitの数
Unit Numberを増減させることでサービスノードを増減し、読み書きサービスとストレージ容量の水平スケーリングを実現します。
Unit Numberの調整によるテナントのスケーリング手順の詳細については、Unit Numberの調整によるテナントのスケーリングを参照してください。
Primary Zone、すなわち読み書きサービスを提供するZoneのリスト
最優先順位を持つPrimary Zoneの数を増減することで、読み書きサービスを提供するZoneを増減し、Zone間での読み書きサービスの水平スケーリングを実現します。
Primary Zoneの調整によるテナントのスケーリング手順の詳細については、Primary Zoneの調整によるテナントのスケーリングを参照してください。
ユーザーはUnit NumberとPrimary Zoneを動的に調整することで、Zone内およびZone間でのテナントの読み書きサービス能力の水平スケーリングを実現できます。ロードバランシング機能は、ユーザーのサービス能力設定に応じて、ログストリームとパーティションの分散を適切に調整します。
パーティションの均衡化
パーティションの均衡化とは、テーブルやパーティションが動的に変化する状況で、パーティションの分布を動的に調整することにより、サービスノード上でのパーティション数、パーティションの重み、テーブルグループの重み、およびストレージ容量の均衡を実現することです。
OceanBaseデータベースは、非パーティションテーブル、パーティションテーブル、サブパーティションテーブルなど、さまざまなテーブルタイプをサポートしています。テーブルの種類によって均衡化するための手段は異なります。均衡化の効果を説明しやすくするため、OceanBaseデータベースでは異なるテーブルパーティションを均衡化グループに分類しています。各均衡化グループ内では、パーティション数の均衡とストレージ容量の均衡を実現する必要があります。均衡化グループ間には関係はなく、内部では自動的に均衡化グループ間の配置関係を調整します。デフォルトでは、OceanBaseデータベースのパーティション均衡化の方法は以下のとおりです:
パーティションテーブル:各パーティションテーブルは独立した均衡化グループであり、テーブルのすべてのパーティションが各サービスノードに分散配置されます。
サブパーティションテーブル:各パーティションの下にあるすべてのサブパーティションが独立した均衡化グループを形成し、各パーティションの下にあるすべてのサブパーティションが各サービスノードに分散配置されます。
非パーティションテーブル:すべての非パーティションテーブルを統合して考慮し、1つの均衡化グループを有します。すべての非パーティションテーブルが各サービスノードに分散配置されます。
異なるテーブルデータ間の集約と分散の関係をさらに柔軟に記述するため、OceanBaseデータベースではテーブルグループ(Table Group)の概念を導入しました。
テーブルグループは論理的な概念であり、一連のテーブルの集合を表します。テーブルグループ内のテーブルは物理的に近接しており、関連性のある複数のテーブルはしばしば同じパーティションルールを持ちます。同じルールのパーティションを集約して配置することで、Partition Wise Joinを実現し、読み書き性能を大幅に最適化できます。
以前のバージョンでは、OceanBaseデータベースはテーブルグループの SHARDING 属性を導入しました。V4.4.2バージョンでは、V4.4.2 BP1バージョンから、テーブルグループは SCOPE 属性もサポートするようになりました。テーブルグループ内のパーティションの分散方法は、SHARDING 属性と SCOPE 属性によって共同で決定されます。その中で、SHARDING 属性はテーブルグループ内の各テーブル間の対応するパーティションの集約方法を決定し、集約された一連のパーティションをパーティショングループ(Partition Group)と呼び、これが分散の最小単位です。SCOPE 属性は、テーブルグループ内のすべての集約後のPartition Groupの分散範囲を決定します。
テーブルグループの SHARDING 属性には NONE、PARTITION、ADAPTIVE の3つの値があります。それぞれの意味は以下のとおりです:
SHARDING = NONE:テーブルグループ内の各テーブルのパーティション方式に制限がなく、テーブル間でパーティションは集約されません。注意
V4.4.2バージョンでは、V4.4.2 BP1バージョン以前は、
SHARDING = NONEのテーブルグループ内のテーブルのすべてのパーティションは同一のログストリーム上に分散されませんでした。しかし、V4.4.2 BP1バージョン以降は、テーブルグループ内のテーブルのすべてのパーティションが分散されるかどうかは、テーブルグループのSCOPE属性にも依存します。パーティションテーブルの場合、各パーティションが独立したPartition Groupとなります。
サブパーティションテーブルの場合、各パーティションとサブパーティションが独立したPartition Groupとなります。
非パーティションテーブルの場合、テーブル全体が1つのPartition Groupとなります。
グローバルインデックステーブルについては、
SHARDING = NONEのテーブルグループ内で、テーブルのグローバルインデックステーブルは自動的にテーブルグループにバインドされます。グローバル非パーティションインデックステーブル全体が1つのPartition Groupとして、グローバルパーティションインデックステーブルの各パーティションが独立したPartition Groupとして扱われます。
SHARDING = PARTITION:テーブルグループ全体が1つの均衡したレンタルとなります。同一のパーティションインデックスを持つパーティションは同じPartition Groupに集約されます。SHARDING = ADAPTIVE:全てがパーティションテーブルの場合、テーブルグループ全体が1つの均衡グループとなります。同一のパーティションインデックスを持つパーティションは同じPartition Groupに集約されます。
全てがサブパーティションテーブルの場合、同一のパーティションインデックスを持つパーティションが1つの均衡グループとなります。均衡グループ内では、同一のサブパーティションインデックスを持つサブパーティションが同じPartition Groupに集約されます。
テーブルグループの SCOPE プロパティには SERVER、ZONE、CLUSTER の3つの値があります。それぞれの意味は以下の通りです:
SCOPE = SERVER:すべてのパーティショングループ(Partition Group)のリーダーが同一ノード上に配置されます。SCOPE = ZONE:すべてのパーティショングループ(Partition Group)のリーダーが同一ゾーン内の異なるノードに分散配置されます。SCOPE = CLUSTER:すべてのパーティショングループ(Partition Group)のリーダーがクラスタ内の異なるノードに分散配置されます。
テーブルグループの SHARDING プロパティと SCOPE プロパティの組み合わせによるパーティションの分散方法は、次の表の通りです。
SHARDING / SCOPEプロパティ値 |
SERVER |
ZONE |
CLUSTER |
|---|---|---|---|
| NONE | テーブルグループ内のすべてのパーティションが同一ノード上に集約される(パーティションの分散方法は SCOPE プロパティが以前のバージョンの SHARDING = NONE をサポートする場合と同等)。 |
テーブルグループ内のすべてのパーティションが特定のゾーン内に均等に分散される | テーブルグループ内のすべてのパーティションが各ノードに均等に分散される |
| PARTITION | サポートされていない | 現在はサポートされていない | パーティション単位で集約され、各パーティショングループはランダムに分散される。(パーティションの分散方法は SCOPE プロパティが以前のバージョンの SHARDING = PARTITION をサポートする場合と同等)。 |
| ADAPTIVE | サポートされていない | 現在はサポートされていない |
パーティションの分散方法は |
テーブルグループの詳細および操作については、テーブルグループの作成と管理(MySQLモード)およびテーブルグループの作成と管理(Oracleモード)を参照してください。
テーブルグループの重みに基づく均衡
OceanBaseデータベースのMySQLモードでは、DatabaseをSharding = 'NONE'のテーブルグループにバインドすることで、ユーザーテーブルの集約を実現します。現在、同一Database内のユーザーテーブルの自動集約および複数Database間のユーザーテーブル集約をサポートしています。
Sharding = 'NONE' のテーブルグループに重みを設定することで、テーブルグループの重み均衡を実現し、テーブルグループ内のテーブルを重みに応じて分散させることができます。ただし、V4.4.2バージョンでは、V4.4.2 BP1以降、Sharding = 'NONE' のテーブルグループに対しては、SCOPE = ZONE、SCOPE = 'SERVER' のテーブルグループにのみ重み設定が可能です。
テーブルグループの重み均衡は、パーティション均衡(PARTITION_BALANCE)タスクの一プロセスであり、ユーザーテナントは手動でトリガーするか、定期的なパーティション均衡タスクの実行を待機することができます。
パーティションの重みに基づく均衡
パーティションテーブル内のパーティションホットスポットやテーブル間のパーティションホットスポットなどの問題をさらに解決するため、OceanBaseデータベースは重みに基づくパーティション均衡戦略を提供しています。パーティションの重みとは、CPU、メモリ、ディスクなどのリソース使用量の相対比率です。パーティションの重み均衡もパーティション均衡(PARTITION_BALANCE)タスクの一つのプロセスであり、ユーザーテナントは手動でトリガーするか、定期的なパーティション均衡タスクの実行を待機させることができます。
パーティションの重み均衡アルゴリズムは、パーティションの移動と交換により、各ユーザーログストリーム上のパーティションの重みの合計の分散を可能な限り小さくします。
パーティションの重みが設定されているテーブルのみがパーティションの重み均衡に参加します。重みが設定されていないパーティションは、引き続きパーティション数に基づいて均衡されます。
データロードバランシング関連のパラメータ
-
テナントレベルの構成パラメータ
enable_rebalanceは、システムテナントではテナント間のロードバランシングを行うかどうかを制御し、ユーザーテナントではテナント内のロードバランシングを行うかどうかを制御します。デフォルト値はtrueです。 -
テナントレベルの構成パラメータ
enable_transferは、テナント内で Transfer を行うかどうかを制御します。デフォルト値はtrueです。詳細は以下のとおりです:パラメータ
enable_rebalanceの値がfalseの場合、パラメータenable_transferの値がtrueであってもfalseであっても、システムは自動ロードバランシングを行いません。パラメータ
enable_rebalanceの値がtrueかつenable_transferの値もtrueの場合、テナントのスケーリング時に、システムはテナント内のログストリーム数を自動的に調整し、ログストリームの分割・統合および Transfer などの操作を通じて、テナント内の Leader バランスとパーティションバランスを実現します。パラメータ
enable_rebalanceの値がtrueかつenable_transferの値がfalseの場合、テナントのスケーリング時に、システムは Transfer を行わず、ログストリーム数も変更しません。既存のログストリームをもとに、可能な限りログストリームのバランスを保証します。
partition_balance_schedule_interval
テナントレベルの構成パラメータ
partition_balance_schedule_intervalは、パーティションロードバランシングタスクを生成する時間間隔を制御します。enable_rebalanceの値がtrueの場合、システムはpartition_balance_schedule_intervalを時間間隔として設定し、パーティションロードバランシングタスクを自動的にトリガーします。デフォルト値は2hで、取り得る範囲は [0s, +∞) です。0sはパーティションバランシングを無効にすることを意味します。注意
V4.4.x系では、この構成パラメータのデフォルト値はV4.4.1から0sに変更されました。V4.4.1以降のバージョンでは、この構成パラメータを使用してパーティションバランシングを制御することは推奨されません。ユーザーは
DBMS_BALANCE.TRIGGER_PARTITION_BALANCEサブプログラムを呼び出すことで、定期的または手動でパーティションバランシングをトリガーできます。-
テナントレベルの構成パラメータ
enable_database_sharding_noneは、データベース作成時にユーザーテーブルの自動集約を有効にするかどうかを制御します。デフォルト値はFalseで、データベース作成時にはユーザーテーブルの自動集約がデフォルトで有効にならないことを意味します。 zone_disk_balance_tolerance_percentage
テナントレベルの構成パラメータ
zone_disk_balance_tolerance_percentageは、ゾーン間のテーブルグループディスクバランシングアルゴリズムが不均衡に対して許容する許容度を制御します。ディスク使用量が最も多いゾーンと最も少ないゾーンの差が、最大ゾーンのディスク使用量にこの割合を掛けた値を超えた場合にのみ、ゾーン間のディスクバランシングがトリガーされます。デフォルト値は10です。