リソースユニット(Unit)とは、OceanBaseデータベースシステム内において、ユーザーリソースがノード上で保持されるコンテナ(または仮想マシン)を指します。これは、マルチテナント分散型データベースアーキテクチャを採用するOceanBaseデータベースにおいて重要な概念です。RSモジュールはリソースユニットを管理し、複数のノード間でリソースユニットをスケジューリングすることで、システムリソースを効率的に活用します。
RSによるリソースユニットの管理には以下が含まれます:
リソースユニットの割り当て:新規にリソースユニットを作成する際、RSはそのユニットをどのノードに割り当てるかを決定する必要があります。
リソースユニットの均衡:システム運用中に、RSはユニットのリソース仕様などの情報に基づき、ユニットの再均衡を行うスケジューリングプロセスです。
現在、ユニットの割り当ておよび均衡戦略の目標は以下の通りです:
CPUリソースとMemoryリソースを主として、さまざまなリソースの割り当ておよび均衡スケジューリングをサポートすることを考慮しています。
ゾーン内のノード間でのリソース均衡の割り当てをサポートします。
複数のリソース
現在のユニット割り当ておよび均衡アルゴリズムでは、主に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データベースでは、リソースユニットの均衡を制御するために2つの構成パラメータを使用します:
enable_rebalanceこの構成パラメータはロードバランシングの全体的なスイッチであり、リソースユニットの均衡を制御するために使用されます。
server_balance_cpu_mem_tolerance_percentこの構成パラメータはリソースユニットの均衡をトリガーするしきい値です。特定のノードのリソースユニットの負荷と平均負荷との差が
server_balance_cpu_mem_tolerance_percentに設定された値を超えた場合、均衡のスケジューリングを開始し、すべてのノードのリソースユニットの負荷と平均負荷との差が構成パラメータserver_balance_cpu_mem_tolerance_percentの値よりも小さくなるまで続けます。
リソースユニットの手動移行
上記のリソースユニットの自動バランシングに加えて、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;