メインコンテンツまでスキップ

Docker Swarm のマネージャーノードはいくつが良いのか

Docker Engine が標準的に提供するオーケストラレーションツールである Docker Swarm について、マネージャーノードはいくつが良いのかが分からなかったので、簡単に調べました。それについてちょっとだけまとめておきます。基本的に語っていることは公式のドキュメントと大差ありませんので、より詳細で正確な情報を知りたい場合は、公式ドキュメントをご確認ください。

Docker Documentation

ヒント

この投稿で言う「Docker Swarm」は、Docker Engine に標準的に組み込まれている Swarm mode を指しています。

Docker Swarm のマネージャーノードは Raft コンセンサスアルゴリズム(分散合意アルゴリズム)によって状態管理が行われます。通常、このアルゴリズムについて詳しく理解する必要はありませんが、概要を理解することでマネージャーノードの数を決定する役に立ちます。

マネージャーノードの数とパフォーマンス

Docker Swarm でクラスターに追加できるマネージャーノード数には、制限がなく、追加しようと思えばいくらでも追加することができます。基本的な考え方として、マネージャーノードの数が多ければ多いほど、障害耐性が強くなります。しかし、ほとんどの場合でマネージャーノードの増加はパフォーマンスの悪化を引き起こします。これは単純にノードの追加・削除といった処理を多数のノードで行う必要があるためです。数が増えればその分パフォーマンスが悪化します。

マネージャーノードと quorum

Docker Swarm でマネージャーノードが何らかのタスクを実行する際には、quorum と呼ばれるものが必要です。quorum は分散システムでよく利用されるものであり、処理の整合性を保つために使われます。Docker Swarm では、この quorum が全マネージャーノードの半数を超過する必要があります。これは単純な議決のように考えることができ、参加者の半数を超過した数が賛同しなければ、実行することができません。

警告

quorum は全マネージャーノードの半数を超過している必要があります。6ノード存在する場合、半数の3の超過、つまり4以上の quorum が必要です。

では、以上を踏まえて quorum が常に半数以上確保できる環境を考えてみます。

マネージャーノードが1つである場合: もしマネージャーノードが1つダウンした時、クラスターではタスクが実行できなくなります。この場合、必要な quorum が1となる為、1つでもダウンすると必要 quorum に達しません。

マネージャーノードが2つである場合: もしマネージャーノードが1つダウンした時、クラスターではタスクが実行できなくなります。この場合、必要な quorum が2となる為、1つでもダウンすると必要 quorum に達しません。

マネージャーノードが3つである場合: もしマネージャーノードが1つダウンした時、クラスターでのタスクが実行可能です。この場合、必要な quorum が2となる為、1つのダウンまでは許容されます。2つダウンした場合は、必要 quorum に達しません。

マネージャーノードが4つである場合: もしマネージャーノードが1つダウンした時、クラスターでのタスクが実行可能です。この場合、必要な quorum が3となる為、1つのダウンまでは許容されます。2つダウンした場合は、必要 quorum に達しません。

同様の考え方でそれ以上の数の場合でも考えていくことができます。

quorum について、以下に簡単にまとめます。

Docker Swarm では:

  • 最大 (N-1)/2 までの障害が許容されます。
  • クラスターでのタスク実行には (N/2)+1 ノードの quorum が必要です。

マネージャーノードの耐障害性

これまでの内容を踏まえ、マネージャーノードの耐障害性について考えていきます。

以下はマネージャーノード数が1~9の場合に必要な quorum と、ダウンが許容されるノード数を表にまとめたものです。表は、「Administer and maintain a swarm of Docker Engines | Docker Documentation」から引用しています。

マネージャノード数quorum許容値
110
220
321
431
532
642
743
853
954

マネージャーノード数が偶数(2, 4, 6, 8~)である場合、耐障害性に対するメリットはありません。例えば、マネージャーノード数が 4 である場合 2ノード 以上がダウンすると、quorumが足らなくなります。しかし、マネージャーノード数が 3 である場合も同様に 2ノード 以上のダウンでquorumが足らなくなります。マネージャーノード数が 3 もしくは 4 の場合のどちらであっても、ダウンが許容されるノード数は 1 です。

そのためマネージャーノード数は奇数(1, 3, 5, 7, 9)であることが、望ましいです。

適切なマネージャーノード数

最後に適切なマネージャーノード数について考えます。とはいえども、ここまで流れで読んできていれば、何となく分かっているかもしれません。

クラスターの耐障害性を確保するために、マネージャーノードが複数であることは必要です。Docker Swarmでは、マネージャーノードがなければクラスターでタスクの実行が不可能になるためです。

  • 通常、クラスターを構築する場合、マネージャーノード数 3 は目指すべき最低限のラインです。
  • クラスターが中規模である場合は、マネージャーノード数 5 を目指すべきです。
  • クラスターが大規模である場合は、マネージャーノード数 7 を目指すべきです。

中規模は数百のノードである場合を指し、大規模は数千のノードである場合を指します。この規模感のノード数は、殆どの場合エンタープライズなので、個人で検証することは難しいです。そのため明確な根拠を出すことができません。

では、上記よりも更にクラスターの規模が大規模であり、マネージャーノードが不足していると感じている場合は、マネージャーノード数を 9 にするべきでしょうか。この場合は、増やすべきではないという答えになります。

Dockerの公式ドキュメントでは、次のように言及されています。

Docker recommends a maximum of seven manager nodes for a swarm. Important Note: Adding more managers does NOT mean increased scalability or higher performance. In general, the opposite is true.

How nodes work | Docker Documentation

雑に翻訳すると以下のようになります。

Dockerでは、Swarmに対して最大7のマネージャーノードが推奨されています。 注意:マネージャーノードを追加しても、スケーラビリティーの向上やパフォーマンスの向上には繋がりません。通常、その逆が起こります。

一切の効果がないと断言することは私にはできませんが、少なくとも公式ドキュメントで非推奨である旨が明示されています。

参考