リソースユニット(Unit)は、OceanBaseデータベースシステム内でノード上のユーザーリソースを格納するコンテナ(または仮想マシン)であり、マルチテナント分散データベースアーキテクチャにおけるOceanBaseデータベースの重要な概念です。RSモジュールはリソースユニットを管理し、複数のノード間でリソースユニットをスケジューリングすることで、システムリソースを効率的に利用します。
RSによるリソースユニットの管理には以下が含まれます:
リソースユニットの割り当て、つまり新しいリソースユニットを作成する際、RSはそのUnitをどのノードに割り当てるかを決定する必要があります。
リソースユニットの均衡、つまりシステム稼働中に、RSがUnitのリソース仕様などの情報に基づいてUnitを再均衡するスケジューリングプロセスです。
現在、Unitの割り当てと均衡戦略の目標は以下の通りです:
CPUリソースとMemoryリソースを主とする、多様なリソースの割り当てと均衡スケジューリングをサポートすることを考慮しています。
Zone内のノード間でリソースを均衡して割り当てることをサポートします。
複数のリソース
現在のUnit割り当てと均衡アルゴリズムでは、主に2種類のリソース(CPUリソースとMemoryリソース)の割り当てと均衡が考慮されています。複数のリソースが同時に存在する場合、リソースの割り当てと均衡には一定の問題が生じる可能性があります。問題の記述を簡略化するため、まず単一リソースのみの割り当てと均衡アルゴリズムを検討します。以下ではCPUリソースを例に、単一リソースの割り当てと均衡アルゴリズムについて説明します。
CPU単一リソースの均衡例
例の背景
2つのOBServerノードが存在すると仮定します:OBS0(10個のCPU)とOBS1(10個のCPU)。そのうち、OBS0には6つのUnitが含まれ、各Unitのリソース仕様は1個のCPUです。OBS1には4つのUnitが含まれ、各Unitのリソース仕様も1個のCPUです。
均衡の目標
ノード間でUnitを移動することで、各ノードのCPU利用率を可能な限り近づけることです。
均衡のプロセス
この例からわかるように、OBS0のCPU利用率は
(6 / 10) * 100% = 60%、OBS1のCPU利用率は(4 / 10) * 100% = 40%です。2つのノードのCPU利用率の差は0.2です。OBS0上の1つのUnitをOBS1に移動すると、移動後のOBS0のCPU利用率は(5 / 10) *100% = 50%、OBS1のCPU利用率も(5 / 10) *100% = 50%となり、2つのノードのCPU利用率は等しくなります。Unitを移動する前と比較して、2つのノードのリソース利用率がより均等になりました。
複数リソース利用率の計算
システム内に複数のリソースが存在し、それらを割り当てと均衡が必要な場合、単一のリソースの利用率のみを用いて割り当てと均衡を行うのは正確さに欠け、良好な結果を得ることも難しいです。そのため、OceanBaseデータベースでは、複数のリソース(CPUリソースとMemoryリソース)の均衡と割り当てにおいて、以下のような割り当てと均衡方法を採用しています。すなわち、割り当てと均衡に参加する各リソースに重みを割り当て、ノード全体のリソース利用率を計算する際にそのリソースが占める割合とします。各リソースの重みは以下の方法で計算されます。あるリソースの使用量が多いほど、そのリソースの重みは高くなります。
例えば、あるクラスタの総CPUリソースが50個、Unitが合計で20個のCPUを占有している場合、CPUの総利用率は40%となります。同クラスタの総Memoryリソースが1000GB、Unitが合計で100GBのMemoryリソースを占有している場合、Memoryの利用率は10%となります。クラスタ内には均衡に参加する他のリソースはありません。正規化した後、CPUとMemoryリソースの重みはそれぞれ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:移動対象のリソースユニットIDを入力します。これはoceanbase.GV$OB_UNITSビューで照会できます。$
server:リソースユニットを移動先のサーバーアドレスを入力します。形式はIPアドレス:ポート番号です。例えば、10.10.10.1:2882です。
移動中のリソースユニットについては、手動でその移動をキャンセルすることもできます。具体的なステートメントは以下のとおりです。
obclient> ALTER SYSTEM CANCEL MIGRATE UNIT $unit_id;