Pacemaker 1.1 Configuration Explained – (12)利用と配置ストラテジ
(12)利用と配置ストラテジ
Pacemakerのリソース配置は全ノードの割り当てスコアに基づき決定します。最も高いスコアのノードにリソースが配置されることになります。
スコアが同じ場合は、デフォルトでは割り当てリソースが少ないほうのノードを選びます。リソースの数が同じだった場合には、CIBに最初に記載されたノードを選びます。
通常、リソースごとに必要なシステムリソースは異なりますので、リソース数だけでシステム負荷を均一化することはできません。リソースを動作させるのに必要なシステムリソースがない場合には、リソースの起動が失敗するか、著しくパフォーマンスが落ちます。
そのため、これら要素を考慮してPacemakerを設定する必要があります。
- ノードのシステムリソース
- リソースが必要とするシステムリソース
- リソース配置に関する全体の戦略
利用属性
ノードのシステムリソースやリソソースが必要とするシステムリソースは、nodeとresourceオブジェクトのutilization属性を使って設定します。utilization属性は必要に応じて自由に、名前と値の組で設定することができます。ただし属性の値は整数である必要があります。
2ノードでCPUとRAMの設定をする例:
<node id="node1" type="normal" uname="node1"> <utilization id="node1-utilization"> <nvpair id="node1-utilization-cpu" name="cpu" value="2"/> <nvpair id="node1-utilization-memory" name="memory" value="2048"/> </utilization> </node> <node id="node2" type="normal" uname="node2"> <utilization id="node2-utilization"> <nvpair id="node2-utilization-cpu" name="cpu" value="4"/> <nvpair id="node2-utilization-memory" name="memory" value="4096"/> </utilization> </node>
各リソースが必要とするCPUとRAMの設定例:
<primitive id="rsc-small" class="ocf" provider="pacemaker" type="Dummy"> <utilization id="rsc-small-utilization"> <nvpair id="rsc-small-utilization-cpu" name="cpu" value="1"/> <nvpair id="rsc-small-utilization-memory" name="memory" value="1024"/> </utilization> </primitive> <primitive id="rsc-medium" class="ocf" provider="pacemaker" type="Dummy"> <utilization id="rsc-medium-utilization"> <nvpair id="rsc-medium-utilization-cpu" name="cpu" value="2"/> <nvpair id="rsc-medium-utilization-memory" name="memory" value="2048"/> </utilization> </primitive> <primitive id="rsc-large" class="ocf" provider="pacemaker" type="Dummy"> <utilization id="rsc-large-utilization"> <nvpair id="rsc-large-utilization-cpu" name="cpu" value="3"/> <nvpair id="rsc-large-utilization-memory" name="memory" value="3072"/> </utilization> </primitive>
実際のCPUやメモリ使用量はPacemakerは関知しません。
配置ストラテジ
ノードのシステムリソース情報と、リソースが必要とするシステムリソース情報を設定したら、次はplacement-strategyを設定します。これを設定しないと、実際には機能しません。
配置ストラテジでは、次の4つの値を設定できます。
- default
utilization値は考慮されません。リソースは割り当てスコアに応じて配置されます。スコアが同じ場合にはノードに均等に配置されます。
- utilization
リソースが動作するのに十分なシステムリソースのある適格なノードがある場合にのみ、utilization値が考慮されます。リソース配置の負荷分散はノードに割り振られたリソース数に基づいて行われます。
- balanced
リソース動作に適格なノードのある場合、及びリソース配置の負荷分散時にutilization値を考慮します。リソースのパフォーマンス最適化が図れるようにリソース配置が行われます。
- minimal
リソースが動作するのに十分なシステムリソースのある適格なノードがある場合にのみ、utilization値が考慮されます。リソース配置はできるだけ少ないノードに行い、電力消費を少なくするようにします。
これらplacement-strategyは、crm_attributeコマンドで設定することができます。
# crm_attribute --name placement-strategy --update balanced
上記のコマンドで、balancedにてノードへのリソース割り当てを設定することができます。
リソース割り当て時の詳細について
リソース割り当て時にどのノードから行うか
- ノード健全性を表すノードの重み情報をもとに、この重みの大きいノードからリソースを割り当てていきます。
- 複数のノードが同じ重みだった場合は:、
- placement-strategyがdefaultまたはutilizationだった場合は、リソースの割り当て数が少ないノードから先にリソースが割り当てられます。
- リソース割り当て数も同じだった場合には、CIBへの記載が先のノードから割り当てていきます。
- placement-strategyがbalancedだった場合には、システムリソースに空きがあるノードから先にリソースを割り当てていきます。
- 複数ノードのシステムリソースの空き状況が同じだった場合には、リソースの割り当て数が少ない順に割り当てていきます。
- リソースの割り当て数も同じだった場合には、CIBへの記載が先のノードから割り当てていきます。
- placement-strategyがminimalだった場合には、CIBへの記載が先のノードから割り当てていきます。
- 複数ノードのシステムリソースの空き状況が同じだった場合には、リソースの割り当て数が少ない順に割り当てていきます。
- placement-strategyがdefaultまたはutilizationだった場合は、リソースの割り当て数が少ないノードから先にリソースが割り当てられます。
どのノードに最もシステムリソースの空きがあるか
1つのutilization属性のみが定義されていた場合、システムリソースの空き状況はシンプルに数値を比較して決定します。
複数のutilization属性が設定されていた場合には、複数の属性で、最も多くのシステムリソースに空きのあるノードを選択します。つまり、例えば
- ノードAに最もcpuの空きがあり、ノードBに最もmemoryの空きがあった場合は、システムリソースの空き状況としてノードAとノードBは同じです。
- ノードAに最もcpuの空きがあり、ノードBは最もmemoryとstorageに空きがある場合には、ノードBがより空きがあるものと判断します。
リソースの割り当て順序
- 高いpriorityのリソースから先に割り当てます。
- priorityが同じだった場合は、すでに起動しているか調べます。それが起動しているノードで最も高いスコアを持つリソースが、リソースの混在を避けるため先に割り当てられます。
- 上記のスコアが同じ、またはそのリソースが起動していなかった場合には、選好性の高いノードで最も高いスコアを持つリソースから先に割り当てられます。
- 上記のスコアが同じだった場合は、起動できるリソースのうちCIBに先に書かれた順で割り当てられていきます。
制限と一時回避策
Pacemakerの扱うことになる課題の一部は、ナップサック問題やNP完全と呼ばれるコンピュータサイエンス上の問題です。これらは解くのに非常に時間を要します。
HAクラスタにおいては、そのような時間を要すわけにはいかないため、Pacemakerはベストエフォートなアルゴリズムでどのノードでサービスを提供するかを決定します。これは高速な決定を可能にしますが、特定の状況で一部のリソースを停止したままにしてしまうなど、望ましくないケースも発生します。
対策としては以下のようなものがあります。
- 物理的に十分なシステムリソースを確保する
これは一見当然のことのように思えますが、システムリソースをすべて使い切ってしまうくらいまでリソースを動作させていた場合にはフェイルオーバーが失敗してしまうことがあるためです。
- 設定するシステムリソースにバッファーを持たせる
割り当てたからといってすぐに実際にシステムリソースを消費するわけではないので、例えば実メモリ以上にメモリ割り当てを行えるなどのオーバーコミットが可能です。しかし、これは実際にシステムリソースが必要になった場合に問題になります。
- リソースの優先度を決める
もしクラスタがサービスを犠牲にするとしても、それは最も優先度の低いものであるべきです。そのため、リソースの優先度設定が重要になります。