第3章 スケーリング

あなたのクラウドが成功していれば、いずれ増加する需要に対応するためにリソースを追加しなければなりません。OpenStack は水平的にスケールできるよう設計されています。より大きなサーバーに取り換えるのではなく、もっと多くのサーバーを購入すればよいのです。理想的には、機能的に同一のサービス間でスケールアウトして負荷分散します。

 出発点

クラウドのスケーラビリティを決定することと、それをどう改善するのかは、多くの変数のバランスをとる問題です。万人のスケーラビリティ目標に適した解決策は存在しませんが、いくつかの指標を観察しておくと役に立つでしょう。

ほとんどの場合の出発点は、クラウドのコア数です。なんらかの比率を掛けることにより、実行される仮想マシン(VM)の数の期待値についての情報を得られます。 ((オーバーコミット率 × cores) / インスタンスごとの仮想コア数), 必要なストレージ容量は (フレーバーごとのディスクサイズ × インスタンス数). あなたのクラウドにどの程度の追加機材が必要なのか、これらの比率で判断することができます。

OpenStack のデフォルトフレーバー:

名前 仮想コア数 メモリ ディスク エフェメラル

m1.tiny

1

512 MB

1 GB

0 GB

m1.small

1

2 GB

10 GB

20 GB

m1.medium

2

4 GB

10 GB

40 GB

m1.large

4

8 GB

10 GB

80 GB

m1.xlarge

8

16 GB

10 GB

160 GB

以下の構築例では、 (200 / 2) × 16 = 1600 VM インスタンスをサポートし、 /var/lib/nova/instances 以下に80TBのストレージ領域が必要なものとします。

  • 200物理コア

  • ほとんどのインスタンスのサイズは m1.medium (仮想コア数2、ストレージ50GB)とします。

  • デフォルトの CPU オーバーコミット率 (cpu_allocation_ratio in nova.conf) は 16:1 とします。

しかし、APIサービスやデータベースサーバー、MQサーバーがおそらく遭遇する負荷を見積もるためには、コア数以外の検討も行う必要があります。クラウドの利用パターンも考慮しなければなりません。

特定の例としては、マネージドWebホスティングプラットフォームをサポートするクラウドと、コードコミットごとに仮想マシンを1つ作成するような開発プロジェクト用の結合テストを動かしているクラウドを比較してみましょう。前者では、VMを作成する重い処理は数か月に一度しか発生しないのに対して、後者はクラウドコントローラーに定常的に重い処理を発生させます。一般論として、VMの平均寿命が長いということは、クラウドコントローラーの負荷が軽いことを意味するため、平均的なVMの寿命を検討しなければなりません。

仮想マシンの起動、停止以外では、ユーザーアクセス、特に nova-api と関連データベースへのアクセスの影響を検討しなければなりません。インスタンス一覧を取得する処理は膨大な量の情報を収集しますし、ユーザーがこの処理を頻繁に行うと、ユーザー数が多いクラウドではこの負荷が著しく上昇します。この負荷は、ユーザーが知らずに発生します。つまり、ブラウザのOpenStack ダッシュボードのインスタンスタブを開いたままにすると、30秒ごとに仮想マシンの一覧が更新されます。

これらの要素を検討した後、クラウドコントローラーにどのくらいのコア数が必要なのか決定することができます。上記の注意事項において、典型的には、ラック1本分のコンピュートノードに対して8コア、メモリ8GBのサーバーで充分です。

ユーザーの仮想マシンの性能のために、ハードウェアのキーになるスペックも考慮に入れなければなりません。予算と性能への需要を検討するのです。例としては、ストレージ性能(スピンドル / コア)、メモリ(メモリ量 / コア)、ネットワーク帯域(Gbps / コア)、そして全般的なCPU性能 (CPU / コア)です。

クラウドをどうスケールさせるのか決定するために観察すべき指標については、14章ロギングと監視 を参照してください。

 コントローラーノードの追加

クラウドの水平的な拡張は、ノード追加によって容易に実行することができます。コンピュートノードの追加は簡単です。新規のコンピュートノードは既存のシステムから簡単に認識されます。しかし、クラスタを高可用なものにするためには、設計の際にいくつかの重要なポイントを検討しなければなりません。

クラウドコントローラーは、いくつかの異なるサービスを実行することを思い出してください。拡張のための新しいサーバーには、  nova-schedulernova-console のようなメッセージキューを用いて内部でのみ通信するサービスをインストールすることができます。しかし、他の不可欠な部分についてはもっと注意が必要です。

ダッシュボードやnova-api 、Object Storage proxy のようなユーザー向けのサービスは負荷分散するべきです。任意の標準的なHTTP負荷分散方法 (DNSラウンドロビン、ハードウェアロードバランサ、Pound や HAProxy のようなソフトウェア) を使ってください。ダッシュボードに関する注意事項の一つは、VNC proxy が使う WebSocket プロトコルです。これは、L7ロードバランサで苦労することになるかもしれません。以下のリンクも参照してください。 Horizon session storage (http://docs.openstack.org/developer/horizon/topics/deployment.html#session-storage).

nova-apiglance-api のようなサービスは、設定ファイルのフラグを変更することによって複数プロセスで処理させるように設定できます。これによって一台のサーバの複数のコアの間で処理を共有できるようになります。

MySQLの負荷分散にはいくつかのオプションがありますし、RabbitMQ はクラスタリング機能を持っています。これらや他の多くのサービスの設定方法に関する情報は運用の章で見つけることができます。

 クラウドの分離

クラウドを分離するためには、次に挙げる OpenStack の方法を使います。 セル, リージョン, ゾーン そしてホストアグリゲート です。これらは以下の表で述べるように、それぞれ異なる機能を提供します。

セル リージョン アベイラビリティゾーン ホストアグリゲート

用途

コンピュート資源に対する単一の API エンドポイント、もしくは2段階スケジューリングが必要な場合

リージョンごとに別々のAPIエンドポイントが必要で、リージョン間で協調する必要がない場合

物理的な隔離や冗長性のために、Nova デプロイメントの中で論理的な分離が必要な場合

共通の機能を持ったホストのグループに対してスケジューリングしたい場合

複数サイトで構成されるクラウドで、仮想マシンを「任意のサイト」または特定のサイトにスケジューリングしたい場合

複数サイトで構成されるクラウドで、仮想マシンを特定のサイトに対してスケジューリングでき、かつ共有インフラを利用したい場合

単一サイトのクラウドで、分離された電源供給ラインを持つ設備で構成される場合

トラステッドコンピューティング機能に対応したホスト群に対してスケジューリングしたい場合

オーバーヘッド

  • nova-cells という新しいサービスが必要

  • 各セルには nova-api 以外の全 nova サービスが必要

  • リージョン毎に別々のAPIエンドポイントが必要

  • 各リージョンにフルセットのNovaサービスが必要

  • nova.conf の設定変更が必要

  • nova.conf の設定変更が必要

共有サービス

Keystone

nova-api

Keystone

Keystone

すべての Nova サービス

Keystone

すべての Nova サービス

この選択肢の表は2つに分けると一番良く理解することができます。1つは、別々の Nova デプロイメントが動作します (セルとリージョン)。もう一つは、単一の Nova デプロイメントを分割するだけです。(アベイラビリティゾーンとホストアグリゲート).

 セルとリージョン

OpenStack Compute のセルは、より複雑な技術を持ち込むことなしに、また既存のNovaシステムに悪影響を与えることなしに、クラウドを分散された環境で運用することができるように設計されています。1つのクラウドの中のホストは、セルと呼ばれるグループに分割されます。セルは、木構造に構成されてます。最上位のセル (「API セル」) はnova-apiサービスを実行するホストを持ちますが、nova-compute サービスを実行するホストは持ちません。それぞれの子セルは、nova-apiサービス以外の、普通のNovaシステムに見られる他のすべての典型的な nova-* サービスを実行します。それぞれのセルは自分のメッセージキューとデータベースサービスを持ち、またAPIセルと子セルの間の通信を制御するnova-cellsサービスを実行します。

これによって、複数のクラウドシステムに対するアクセスを、1つのAPIサーバで制御することができます。通常のnova-schedulerによるホストの選択に加えて、第二段階のスケジューリング(セルの選択)を導入することにより、仮想マシンを実行する場所の制御の柔軟性が大きく向上します。

セルをリージョンと比較してみましょう。リージョンは、クラウドごとに別々のAPIエンドポイントを持ち、より関連性の低い分離を実現できます。サイトをまたがってインスタンスを実行したいユーザーは、明示的にリージョンを指定しなければなりません。しかし、新しいサービスを実行するという、さらなる複雑さは必要ありません。

現在のところ、OpenStack ダッシュボード (Horizon) は1つのリージョンだけを操作対象とします。したがって、リージョンごとにダッシュボードサービスを実行するべきです。リージョンは、高度な故障耐性を実現しつつ、複数の OpenStack Compute のシステム間でインフラのいくらかの部分を共有するための堅牢な方法です。

 アベイラビリティゾーンとホストアグリゲート

一つの nova デプロイメントを分割するのに、アベイラビリティゾーン、ホストアグリゲート、もしくはその両方を使うことができます。

アベイラビリティゾーンは、ホストアグリゲートを利用して実装されており、ホストアグリゲートと同様の方法で設定します。

しかし、アベイラビリティゾーンとホストアグリゲートは別の理由で使用します。

  • アベイラビリティゾーン: OpenStack Compute ホストを論理グループにまとめて、(独立した電源系統やネットワーク装置を使うことなどで)他のアベイラビリティゾーンとのある種の物理的な分離や冗長性を実現できます。

    サーバー毎に、指定したサーバーが所属するアベイラビリティゾーンを定義します。一般に、アベイラビリティゾーンは共通の性質を持つサーバーの集合を識別するために使われます。例えば、データセンターの一部のラック群がある一つの独立した電源系統につながっている場合には、これらのラック群に設定されたサーバーを専用のアベイラビリティゾーンに入れることができます。また、アベイラビリティゾーンは異なるクラスのハードウェアを分割するのにも使うことができます。

    ユーザーはリソースを作成する際に、インスタンスを作成するアベイラビリティゾーンを指定することができます。これによって、クラウドの利用者は、自分のアプリケーションのリソースが異なるマシンに分散して配置されることを保証でき、ハードウェア故障が発生した場合でも高可用性を達成することができます。

  • ホストアグリゲート: 負荷分散やインスタンスの分散配置のために、 OpenStack Compute のデプロイメントを論理グループに分割することができるようになります。ホストアグリゲートを使って一つのアベイラビリティゾーンをさらに分割することもできます。例えば、ホストアグリゲートを使うことで、一つのアベイラビリティゾーンを、ストレージやネットワークなどの共通のリソースを共有するホストのグループや、トラステッドコンピューティングハードウェアのような特別な性質を備えたホストのグループ、に分割することができるでしょう。

    ホストアグリゲートのよくある使い方は nova-scheduler で利用する情報を提供することです。例えば、ホストアグリゲートを使って、特定のフレーバーやイメージを共有するホストの集合を作成することができます。

[注記]注記

以前はすべてのサービスにアベイラビリティゾーンがありました。現在では nova-compute サービスだけが自分のアベイラビリティゾーンを持っています。 nova-scheduler, nova-network, nova-conductor といったサービスは常にすべてのアベイラビリティゾーンにまたがる形になります。

次の操作のいずれかを実行すると、これらのサービスは内部アベイラビリティゾーン (CONF.internal_service_availability_zone) 内に表示されます。

  • nova host-list (os-hosts)

  • euca-describe-availability-zones verbose

  • nova-manage service list

内部アベイラビリティゾーンは (非冗長モードの) euca-describe-availability_zones では表示されません。

CONF.node_availability_zone は CONF.default_availability_zone に名前が変更されました。このオプションは nova-api サービスと nova-scheduler サービスでのみ使用されます。

CONF.node_availability_zone は今も機能しますが、非推奨扱いです。

 スケーラブルハードウェア

OpenStack をインストールしてデプロイするのに有用な情報源が既にいくらか存在していますが、自分のデプロイメントで事前に計画を立てておくことは非常に重要です。このガイドでは、OpenStack用にラックを少なくとも1本用意しておくことを想定してしますが、いつ、何をスケールさせるのかについてのアドバイスも行っています。

 ハードウェア調達

「クラウド」とは、サーバーが作成されたり終了されたりするという揮発性の環境であると説明されてきました。これは正しいかもしれませんが、あなたのサーバーが揮発性でなければならないという意味ではありません。クラウドを構成するハードウェアを安定させ、正しく設定されていることを保障するということは、あなたのクラウド環境が稼働中であり動作していることを意味します。基本的に、ユーザーが必要な時に確保でき揮発性なものとして扱えるようなクラウドを運営できるよう、安定したハードウェア環境を作ることに注力してください。

OpenStack は、この本の参考アーキテクチャで使われている Ubuntu 12.04 のように、OpenStack と互換性のある Linux ディストリビューションでサポートされたハードウェアにデプロイできます。

ハードウェアはまったく同じでなければいけないことはありませんが、少なくともインスタンスマイグレーションが可能であるような同じタイプのCPUを装備しているべきです。

OpenStack に使うのに推奨される典型的なハードウェアは、ほとんどのハードウェアベンダが提供している、「金額に見合う価値をもった(value-for-money)」とても標準的なハードウェアです。調達を「コンピュート」や「オブジェクトストレージ」そして「クラウドコントローラー」のような構成要素に分割し、それぞれ必要な数だけ要求するのは分かりやすい方法でしょう。これ以上費用をかけることができない場合でも、代わりに、もし既存のサーバーがあって、これらが性能や仮想化技術の要件を満たしていれば、高い確率で OpenStack を動作させられます。

 キャパシティプランニング

OpenStackは、単純な方法でサイズを拡大できるように設計されています。 スケーラビリティ の章の、特にクラウドコントローラーのサイジングに関する検討を考慮に入れ、必要に応じて追加のコンピュートノードやオブジェクトストレージノードを調達できるようにすべきです。新しいノードは、既存ノードと同じスペックである必要はありませんし、同じベンダーである必要すらありません。

コンピュートノードについては、nova-scheduler がコア数やメモリ量のサイジングに関する違いを吸収しますが、CPUの速度が違うことによって、ユーザーの使用感が変わることを考慮するべきです。オブジェクトストレージノードを追加する際には、 そのノードのケーパビリティ を反映するウェイト を指定するべきです。

リソース利用状況の監視とユーザー増加の監視によって、(追加機材の)調達時期を知ることができます。監視の章でいくつかの有用な監視項目を詳しく解説します。

 エージング試験

サーバーは、そのライフタイムの最初と最後にハードウェア故障の確率が高くなります。結論として、初期故障を誘発する適切なエージングテストを行うことによって、運用中の故障に対応するための多くの労力を避けることができます。一般的な原則は、限界まで負荷をかけることです。エージング試験の例としては、数日間にわたってCPUやディスクベンチマークを走行させることが含まれます。



loading table of contents...