Pacemaker 1.1 Configuration Explained – (12)利用と配置ストラテジ

(12)利用と配置ストラテジ

 

Pacemakerのリソース配置は全ノードの割り当てスコアに基づき決定します。最も高いスコアのノードにリソースが配置されることになります。

スコアが同じ場合は、デフォルトでは割り当てリソースが少ないほうのノードを選びます。リソースの数が同じだった場合には、CIBに最初に記載されたノードを選びます。

通常、リソースごとに必要なシステムリソースは異なりますので、リソース数だけでシステム負荷を均一化することはできません。リソースを動作させるのに必要なシステムリソースがない場合には、リソースの起動が失敗するか、著しくパフォーマンスが落ちます。

そのため、これら要素を考慮してPacemakerを設定する必要があります。

  1. ノードのシステムリソース
  2. リソースが必要とするシステムリソース
  3. リソース配置に関する全体の戦略

利用属性

ノードのシステムリソースやリソソースが必要とするシステムリソースは、noderesourceオブジェクトの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-strategydefaultまたはutilizationだった場合は、リソースの割り当て数が少ないノードから先にリソースが割り当てられます。
      • リソース割り当て数も同じだった場合には、CIBへの記載が先のノードから割り当てていきます。
    • placement-strategybalancedだった場合には、システムリソースに空きがあるノードから先にリソースを割り当てていきます。
      • 複数ノードのシステムリソースの空き状況が同じだった場合には、リソースの割り当て数が少ない順に割り当てていきます。
        • リソースの割り当て数も同じだった場合には、CIBへの記載が先のノードから割り当てていきます。
      • placement-strategyminimalだった場合には、CIBへの記載が先のノードから割り当てていきます。

 

どのノードに最もシステムリソースの空きがあるか

1つのutilization属性のみが定義されていた場合、システムリソースの空き状況はシンプルに数値を比較して決定します。

複数のutilization属性が設定されていた場合には、複数の属性で、最も多くのシステムリソースに空きのあるノードを選択します。つまり、例えば

  • ノードAに最もcpuの空きがあり、ノードBに最もmemoryの空きがあった場合は、システムリソースの空き状況としてノードAノードBは同じです。
  • ノードAに最もcpuの空きがあり、ノードBは最もmemoryとstorageに空きがある場合には、ノードBがより空きがあるものと判断します。

 

リソースの割り当て順序

  • 高いpriorityのリソースから先に割り当てます。
  • priorityが同じだった場合は、すでに起動しているか調べます。それが起動しているノードで最も高いスコアを持つリソースが、リソースの混在を避けるため先に割り当てられます。
  • 上記のスコアが同じ、またはそのリソースが起動していなかった場合には、選好性の高いノードで最も高いスコアを持つリソースから先に割り当てられます。
  • 上記のスコアが同じだった場合は、起動できるリソースのうちCIBに先に書かれた順で割り当てられていきます。

 

制限と一時回避策

Pacemakerの扱うことになる課題の一部は、ナップサック問題やNP完全と呼ばれるコンピュータサイエンス上の問題です。これらは解くのに非常に時間を要します。

HAクラスタにおいては、そのような時間を要すわけにはいかないため、Pacemakerはベストエフォートなアルゴリズムでどのノードでサービスを提供するかを決定します。これは高速な決定を可能にしますが、特定の状況で一部のリソースを停止したままにしてしまうなど、望ましくないケースも発生します。

対策としては以下のようなものがあります。

  • 物理的に十分なシステムリソースを確保する

これは一見当然のことのように思えますが、システムリソースをすべて使い切ってしまうくらいまでリソースを動作させていた場合にはフェイルオーバーが失敗してしまうことがあるためです。

  • 設定するシステムリソースにバッファーを持たせる

割り当てたからといってすぐに実際にシステムリソースを消費するわけではないので、例えば実メモリ以上にメモリ割り当てを行えるなどのオーバーコミットが可能です。しかし、これは実際にシステムリソースが必要になった場合に問題になります。

  • リソースの優先度を決める

もしクラスタがサービスを犠牲にするとしても、それは最も優先度の低いものであるべきです。そのため、リソースの優先度設定が重要になります。