リソースユニット(Unit)とは、OceanBaseデータベースシステム内において、ノード上のユーザーリソースを格納するコンテナ(または仮想マシン)であり、マルチテナント分散データベースアーキテクチャにおけるOceanBaseデータベースの重要な概念です。RSモジュールはリソースユニットを管理し、複数のノード間でリソースユニットをスケジューリングすることで、システムリソースを効率的に利用します。
RSによるリソースユニットの管理には、以下が含まれます:
リソースユニットの割り当て:新規にリソースユニットを作成する際、RSはそのUnitをどのノードに割り当てるかを決定する必要があります。
リソースユニットの均衡:システム稼働中に、RSはUnitのリソース仕様などの情報に基づき、Unitを再バランスさせるスケジューリングプロセスです。
現在、Unitの割り当てと均衡戦略の目標は以下の通りです:
CPUリソースとMemoryリソースを主とする、多様なリソースの割り当てと均衡スケジューリングをサポートすることを考慮しています。
Zone内のノード間でリソースを均衡よく割り当てることをサポートします。
複数のリソース
現在のユニット割り当ておよびバランシングアルゴリズムでは、主にCPUリソースとメモリリソースの2種類のリソースの割り当てとバランシングを考慮しています。複数のリソースが同時に存在する場合、リソースの割り当てとバランシングには一定の問題が生じる可能性があります。問題の記述を簡略化するため、まず単一リソースのみの割り当てとバランシングアルゴリズムを検討します。以下では、CPUリソースを例に、単一リソースの割り当てとバランシングアルゴリズムについて説明します。
CPU単一リソースのバランシング例
例の背景
2つのOBServerノードが存在すると仮定します:OBS0(10個のCPU)とOBS1(10個のCPU)。そのうち、OBS0には6つのユニットが含まれ、各ユニットのリソース構成は1個のCPUです。OBS1には4つのユニットが含まれ、各ユニットのリソース構成も1個のCPUです。
バランシングの目標
ノード間でユニットを移動することで、各ノードのCPU利用率を可能な限り近づけます。
バランシングのプロセス
この例からわかるように、OBS0のCPU利用率は
(6 / 10) * 100% = 60%、OBS1のCPU利用率は(4 / 10) * 100% = 40%です。2つのノードのCPU利用率の差は0.2です。OBS0上の1つのユニットをOBS1に移動すると、移動後のOBS0のCPU利用率は(5 / 10) *100% = 50%、OBS1のCPU利用率も(5 / 10) *100% = 50%となり、2つのノードのCPU利用率は等しくなります。ユニットを移動する前と比較して、2つのノードのリソース利用率がより均等になりました。
複数リソース利用率の計算
システム内に複数のリソースが存在し、それらを割り当ておよびバランシングする必要がある場合、単一のリソースの利用率のみを用いて割り当てとバランシングを行うのは、精度が不十分であり、良好な割り当てとバランシングの効果を得ることは難しいかもしれません。そのため、OceanBaseデータベースでは、複数のリソース(CPUリソースとメモリリソース)のバランシングと割り当てにおいて、以下の割り当てとバランシング手法を採用しています。すなわち、割り当てとバランシングに参加する各リソースに重みを割り当て、ノード全体のリソース利用率を計算する際にそのリソースが占める割合とします。各リソースの重みは以下の方法で計算されます。特定のリソースの使用量が多いほど、そのリソースの重みは高くなります。
例えば、あるクラスタの総CPUリソースが50個、ユニットが合計で20個のCPUを占有している場合、CPUの総利用率は40%となります。同クラスタの総メモリリソースが1000GB、ユニットが合計で100GBのメモリリソースを占有している場合、メモリの利用率は10%となります。クラスタ内には他のリソースが存在せず、バランシングには関与しません。正規化した後、CPUとメモリリソースの重みはそれぞれ80%と20%に配置されます。各ノードはこの重みに基づいて自身のリソース利用率を計算し、その後ユニットの移動を通じてノード間のリソース利用率の差を縮小します。
リソースユニットの割り当て
新しいユニットを作成する際には、そのユニットに対するOBServerノードホストを選択する必要があります。ホストの割り当て方法は以下のとおりです:まず、前述の複数リソース利用率の計算ルールに基づいて、各ノードのリソース利用率を計算します。次に、リソース利用率が最も低いOBServerノードを選択し、新規ユニットのホストとします。
リソースユニットのバランシング
リソースユニットのバランシングは、ノード間でユニットを移動することで、各ノードのリソース利用率の差を可能な限り小さくすることです。上述の複数リソース利用率のアルゴリズムを用いて、各ノードのリソース利用率を計算し、ユニットの移動を繰り返し試みることで、ユニット移動完了後の各ノード間のリソース利用率が移動前よりも小さくなれば、リソースユニットのバランシングが完了したことになります。
リソースユニットの均衡制御
OceanBaseデータベースは、以下のパラメータを使用してリソースユニットの均衡を制御します:
-
このパラメータはロードバランシングの総合スイッチであり、リソースユニットの均衡を制御します。
server_balance_cpu_mem_tolerance_percent
このパラメータはリソースユニットの均衡をトリガーするしきい値です。特定のノードのリソースユニット負荷と平均負荷の差が
server_balance_cpu_mem_tolerance_percentで設定された値を超えると、均衡のスケジューリングが開始され、すべてのノードのリソースユニット負荷と平均負荷の差がパラメータserver_balance_cpu_mem_tolerance_percentの値より小さくなるまで続行されます。server_balance_disk_tolerance_percent
このパラメータは、ノード間のリソースユニット(Unit)均衡戦略において、ディスクの不均衡度に対する許容度を設定します。あるノードのディスクウォーターマークが同一ゾーン内のノードの平均ディスクウォーターマークを超え、その超過幅がパラメータ
server_balance_disk_tolerance_percentで設定された値に達した場合にのみ、そのノードはディスクに基づくリソースユニットの均衡に参加します。server_balance_critical_disk_waterlevel
このパラメータはディスク容量のロードバランシング機能のウォーターマークを設定します。ディスクウォーターマークがパラメータ
server_balance_critical_disk_waterlevelで設定された値を超えると、ロードバランシング戦略はディスクの均衡を優先する傾向があります。
リソースユニットの手動移行
上記のリソースユニットの自動均衡に加えて、OceanBaseデータベースはリソースユニットの手動移行もサポートしています。つまり、データベース管理者はSQL命令を使用してリソースユニットを手動で移行できます。具体的な移行ステートメントは以下のとおりです。
obclient> ALTER SYSTEM MIGRATE UNIT $unit_id DESTINATION '$server';
ここで:
$
unit_id:移行対象のUnitのIDを入力します。これはoceanbase.GV$OB_UNITSビューでクエリできます。$
server:Unitを移行先のServerアドレスを入力します。形式はIPアドレス:ポート番号です。例えば、10.10.10.1:2882です。
移行中のリソースユニットについては、手動でその移行をキャンセルすることもできます。具体的なステートメントは以下のとおりです。
obclient> ALTER SYSTEM CANCEL MIGRATE UNIT $unit_id;