情報畑でつかまえてロゴ
本サイトは NTTテクノクロスが旬の IT をキーワードに
IT 部門が今知っておきたい最新テクノロジーに関する情報をお届けするサイトです

OpenStackのマルチcell環境を構築してボトルネックを解消しよう

OpenStackでマルチcell環境を構築する方法を紹介します。

はじめに

OpenStackにはより大規模な環境を構築するための機能として、Ocataリリースからcellという機能が追加されました。cellはpikeリリースでcell v2となり、Novaの機能として取り込まれました。

今回は、OpenStack環境上に複数のcellが存在する環境(以下マルチcell環境)の構築方法を紹介し、マルチcell環境でインスタンスがどのように起動されるか確認します。

マルチcell環境を構築することにより、従来のOpenStackでボトルネックとなっていたmessageQueue、DB、Nodeへのヘルスチェックなどをcell毎に分割することができます。
これにより、より大規模なOpenStack環境を構築することが可能となります。

マルチcellとは

マルチcell環境では、下図のようにNovaと周辺のコンポーネントをcellごとに分割し、上位レイヤーにAPIリクエストを受け付けるAPI cellを設けるツリー構造となっています。また、cellはユーザーが定義するcell(下図のcell Foo、cell Bar)の他にcell0というscheduler、conductorなどが存在しない特別なcell0があります。

nova-schedulerの役割

インスタンスを起動する際は、nova-schedulerがhostに残っているリソースを考慮し、インスタンスを起動するhostを決めるので、ユーザーはインスタンスを起動するhostを意識する必要はありません。マルチcell環境でインスタンスを起動する際も、同様にユーザーはインスタンスを起動するcell、hostを意識する必要はありません。(環境構築時や、hostを追加する際にhostをどのcellに紐づけるかを運用者が決める必要がありますが、ユーザーはcellの存在を意識する必要はありません。)

インスタンスがどのcellで起動いているかの情報は各cellのnova DBに格納されており、nova-schedulerの障害などによりスケジュールできずに、起動に失敗したインスタンスの情報はcell0のnova DBに格納されます(なお、cell0のnova DBに格納された起動失敗したインスタンスの情報の使い道、削除タイミングについては、現時点では、把握できていません)。

環境

環境構成

今回は以下の構成でマルチcell環境の構築を行います。
 ・controller兼compute node×1 (以下、CT1) 
 ・compute node×2 (以下、CP1、CP2)

 OSはいずれもubuntu16.04.1 64bit、OpenStack versionはPikeを利用し、インストーラーはdevstackを使います。

cellを2つ用意し、各nodeとcellを以下のように対応付けます。
 ・cell1 : CT1、CP1
 ・cell2 : CP2

各cellの設定

devstackのlocal.confに以下の設定を追記し、OpenStackのインストールを行います。

【controller兼compute node(CT1)】
・local.conf
 [[local|localrc]]
  NOVA_NUM_CELLS=2
  NOVA_CPU_CELL=1

【compute node(CP1)】
・local.conf
 [[local|localrc]]
  NOVA_CPU_CELL=1

【compute node(CP2)】
・local.conf
 [[local|localrc]]
  NOVA_CPU_CELL=2

各設定値はそれぞれ以下のとおりです。
*NOVA_NUM_CELLS:cell0を除いたcellの数を指定します。
*NOVA_CPU_CELL:controller nodeが所属するcellを指定します。

環境構築

local.confの準備ができたら、CT1、CP1、CP2の順で./stack.shを実行し、OpenStack環境を構築します。

環境確認

./stack.shの正常終了後、DBの各テーブルを確認します。

mysql> USE nova_api

mysql> select id, uuid, name, transport_url, database_connection from cell_mappings; +----+--------------------------------------+-------+------------------------------------------------------------+-----------------------------------------------------------------+ | id | uuid | name | transport_url | database_connection | +----+--------------------------------------+-------+------------------------------------------------------------+-----------------------------------------------------------------+ | 1 | 00000000-0000-0000-0000-000000000000 | cell0 | none:/// | mysql+pymysql://root:password@127.0.0.1/nova_cell0?charset=utf8 | | 2 | 7537f239-4b2d-453f-abbf-19e02286049a | cell1 | rabbit://stackrabbit:password@192.168.0.30:5672/nova_cell1 | mysql+pymysql://root:password@127.0.0.1/nova_cell1?charset=utf8 | | 3 | 76ca5a24-5d9a-49d5-9d0b-5fe816d345b9 | cell2 | rabbit://stackrabbit:password@192.168.0.30:5672/nova_cell2 | mysql+pymysql://root:password@127.0.0.1/nova_cell2?charset=utf8 |
+----+--------------------------------------+-------+------------------------------------------------------------+-----------------------------------------------------------------+

先に述べたとおり、cell1、cell2以外にcell0も作成されることが確認できます。

次にhost_mappingsテーブルを確認します。このテーブルでは、hostとcellの対応付けを確認することができます。

mysql> USE nova_api

mysql> select id , cell_id, host from host_mappings;
+----+---------+------+
| id | cell_id | host |
+----+---------+------+
| 1 | 2 | ct1 |
+----+---------+------+

今回の環境では、cell1(cell_id = 2)にct1が紐づいていることを確認することができます。
この段階では、CP1、CP2はcellに紐づいていません。

CP1、CP2はnova_cell1、nova_cell2のcompute_nodesテーブルにNOVA_CPU_CELLで設定した通りに紐づいていることが確認できます。

mysql> USE nova_cell1

mysql> select host,hypervisor_hostname, mapped, uuid from compute_nodes; +------+---------------------+--------+--------------------------------------+ | host | hypervisor_hostname | mapped | uuid | +------+---------------------+--------+--------------------------------------+ | ct1 | ct1 | 1 | fcdd7052-2164-4730-80c6-498dca42c0d8 | | cp1 | cp1 | 0 | da5868df-002f-4431-bcf5-06b9efe67264 | +------+---------------------+--------+--------------------------------------+

mysql> USE nova_cell2
mysql> select host,hypervisor_hostname, mapped, uuid from compute_nodes; +------+---------------------+--------+--------------------------------------+ | host | hypervisor_hostname | mapped | uuid | +------+---------------------+--------+--------------------------------------+ | cp2 | cp2 | 0 | 6026656b-3e91-440b-8bf1-dcf00eac1f09 | +------+---------------------+--------+--------------------------------------+

ここで、CT1のmappedカラムの値は1ですが、CP1、CP2は0となっています。

これは、cellとhostがマッピングされていないことを示しています。スケジューラーはマッピングされていないhostにインスタンスを起動しないので、hostを追加する際はcellとhostのマッピングする必要があります。

cellとhostのマッピング

CT1で以下のコマンドを実行し、cellとhostをマッピングします。

ubuntu@ct1:~$ nova-manage cell_v2 discover_hosts

cellとhostのマッピングを確認します。

mysql> USE nova_api

mysql> select id , cell_id, host from host_mappings; +----+---------+------+ | id | cell_id | host | +----+---------+------+ | 1 | 2 | ct1 | | 2 | 2 | cp1 | | 3 | 3 | cp2 | +----+---------+------+
mysql> USE nova_cell1
mysql> select host,hypervisor_hostname, mapped, uuid from compute_nodes; +------+---------------------+--------+--------------------------------------+ | host | hypervisor_hostname | mapped | uuid | +------+---------------------+--------+--------------------------------------+ | ct1 | ct1 | 1 | fcdd7052-2164-4730-80c6-498dca42c0d8 | | cp1 | cp1 | 1 | da5868df-002f-4431-bcf5-06b9efe67264 | +------+---------------------+--------+--------------------------------------+
mysql> USE nova_cell2
mysql> slect host,hypervisor_hostname, mapped, uuid from compute_nodes; +------+---------------------+--------+--------------------------------------+ | host | hypervisor_hostname | mapped | uuid | +------+---------------------+--------+--------------------------------------+ | cp2 | cp2 | 1 | 6026656b-3e91-440b-8bf1-dcf00eac1f09 | +------+---------------------+--------+--------------------------------------+

cellとhostがlocal.confで指定した通りにマッピングされました。これで、マルチcell環境の構築は完了です。

マルチcell環境でのインスタンス起動確認

マルチcell環境を構築できたので、nova- schedulerがcell、hostを跨いでインスタンスが起動することを確認します。
openstack server createコマンドを実行し、インスタンスを10台起動します。

以下の通り(openstack server listコマンドを実行結果)、インスタンスが10台起動しています。

+--------------------------------------+--------+--------+----------------------------------+--------------------------+---------+
| ID                                   | Name   | Status | Networks                         | Image                    | Flavor  |
+--------------------------------------+--------+--------+----------------------------------+--------------------------+---------+
| d1db93c2-0c7d-49ff-abae-399f245f4977 | test10 | ACTIVE | public=172.24.4.4, 2001:db8::13  | cirros-0.3.5-x86_64-disk | m1.tiny |
| 4a6d7e77-85f6-466d-ae71-ff0dbaa43a72 | test07 | ACTIVE | public=172.24.4.16, 2001:db8::c  | cirros-0.3.5-x86_64-disk | m1.tiny |
| d653699b-803a-44e8-9023-53a528f166d9 | test06 | ACTIVE | public=172.24.4.7, 2001:db8::b   | cirros-0.3.5-x86_64-disk | m1.tiny |
| 7f0fba9a-0262-4971-9032-bf1fc2b073dd | test04 | ACTIVE | public=172.24.4.3, 2001:db8::9   | cirros-0.3.5-x86_64-disk | m1.tiny |
| 23f61b0d-4ce5-489e-8474-3746b42b6eaf | test03 | ACTIVE | public=172.24.4.14, 2001:db8::d  | cirros-0.3.5-x86_64-disk | m1.tiny |
| ccb898bb-1903-454e-b449-eacffe9b8099 | test01 | ACTIVE | public=172.24.4.9, 2001:db8::7   | cirros-0.3.5-x86_64-disk | m1.tiny |
| e3f70502-78e7-4052-b38a-d462a5a94b6f | test09 | ACTIVE | public=172.24.4.20, 2001:db8::11 | cirros-0.3.5-x86_64-disk | m1.tiny |
| 6db6a7de-7991-494e-9ba2-a492c2ae3f6a | test08 | ACTIVE | public=172.24.4.15, 2001:db8::12 | cirros-0.3.5-x86_64-disk | m1.tiny |
| 0316c0ec-66a2-49a6-903d-c377208fd480 | test05 | ACTIVE | public=172.24.4.10, 2001:db8::5  | cirros-0.3.5-x86_64-disk | m1.tiny |
| f1e0b364-006e-48cb-b76b-ec108eeab578 | test02 | ACTIVE | public=172.24.4.8, 2001:db8::4   | cirros-0.3.5-x86_64-disk | m1.tiny |
+--------------------------------------+--------+--------+----------------------------------+--------------------------+---------+

DBを確認してインスタンスがどのようにcellに割り当てられているか見てみます。

mysql> USE nova_cell1

mysql> select id, hostname, host, uuid, node from instances;
+----+----------+------+--------------------------------------+------+
| id | hostname | host | uuid | node |
+----+----------+------+--------------------------------------+------+
| 1 | test01 | cp1 | ccb898bb-1903-454e-b449-eacffe9b8099 | cp1 |
| 2 | test03 | ct1 | 23f61b0d-4ce5-489e-8474-3746b42b6eaf | ct1 |
| 3 | test04 | cp1 | 7f0fba9a-0262-4971-9032-bf1fc2b073dd | cp1 |
| 4 | test06 | cp1 | d653699b-803a-44e8-9023-53a528f166d9 | cp1 |
| 5 | test07 | ct1 | 4a6d7e77-85f6-466d-ae71-ff0dbaa43a72 | ct1 |
| 6 | test10 | cp1 | d1db93c2-0c7d-49ff-abae-399f245f4977 | cp1 |
+----+----------+------+--------------------------------------+------+

mysql> USE nova_cell2

mysql> select id, hostname, host, uuid, node from instances;
+----+----------+------+--------------------------------------+------+
| id | hostname | host | uuid | node |
+----+----------+------+--------------------------------------+------+
| 1 | test02 | cp2 | f1e0b364-006e-48cb-b76b-ec108eeab578 | cp2 |
| 2 | test05 | cp2 | 0316c0ec-66a2-49a6-903d-c377208fd480 | cp2 |
| 3 | test08 | cp2 | 6db6a7de-7991-494e-9ba2-a492c2ae3f6a | cp2 |
| 4 | test09 | cp2 | e3f70502-78e7-4052-b38a-d462a5a94b6f | cp2 |
+----+----------+------+--------------------------------------+------+

図にすると以下のようにcell、hostを跨いでインスタンスが起動しています。
このようにnova-schedulerがスケジューリングしてくれるので、openstack server create コマンド実行時にユーザーはマルチcell環境であることを意識することなく、インスタンスを起動することができます。
次に、nova-scheduler (devstack環境ではdevstack@n-schとなる)を停止して、インスタンスを起動します。

openstack server createコマンドは正常に終了しますが、しばらく待ってopenstack server listコマンドを実行すると、StatusがERRORとなり、インスタンスの起動に失敗していることが確認できます。

+--------------------------------------+--------+--------+----------+--------------------------+---------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+--------+--------+----------+--------------------------+---------+
| e3ca729c-c960-4b39-be5d-25a652303845 | test11 | ERROR | | cirros-0.3.5-x86_64-disk | m1.tiny |
+--------------------------------------+--------+--------+----------+--------------------------+---------+

起動に失敗したインスタンスの情報がcell 0のDBに格納されているか確認します。

mysql> USE nova_cell0

mysql> select id, hostname, host, uuid, node from instances;
+----+----------+------+--------------------------------------+------+
| id | hostname | host | uuid | node |
+----+----------+------+--------------------------------------+------+
| 1 | test11 | NULL | e3ca729c-c960-4b39-be5d-25a652303845 | NULL |
+----+----------+------+--------------------------------------+------+

前述したとおり、nova-schedulerが停止している場合はcell0にインスタンスの情報が格納されていることが確認できました。ただし、インスタンスの起動失敗を確認した後にnova-schedulerを起動し、しばらく待ってみましたが、起動に失敗したインスタンスを起動しませんでした(前述どおり、起動失敗したインスタンスの情報の使い道、削除タイミングについては、まだ理解できていません)。

まとめ

controller兼compute node×1台・compute node×2台という少ないマシン構成ですが、マルチcell環境でを構築し、cell、compute nodeを跨いでインスタンスを起動した際の動作をすることが確認することができました。

合計3台という構成ではマルチcell環境のメリットを活かすことはできませんが、今回紹介した手順を繰り返すことにより大規模なマルチcell環境をの構築をすることができます。

おわりに

NTTテクノクロスでは、マルチcell以外にもOpenStack関連の様々なノウハウを持っています。
今回の記事に関してご質問のある方や、OpenStackの導入や運用にご興味のある方は、ぜひ弊社にお問い合わせください。

OpenStack のワードマークは、米国とその他の国における OpenStack Foundation の登録商標/サービスマークまたは商標/サービスマークのいずれかであり、 OpenStack Foundation の許諾の下に使用されています。
NTTテクノクロスは、OpenStack Foundation や OpenStack コミュニティの関連会社ではなく、公認や出資も受けていません。
その他会社名、製品名などの固有名詞は、一般に該当する会社もしくは組織の商標または登録商標です。


連載シリーズ
テクノロジーコラム
著者プロフィール
中西 朋生
中西 朋生