停止時間(計画的なものと予定外のものの両方)はクラウドを運用するときに確実に発生します。本章は、プロアクティブまたはリアクティブに、これらの出来事に対処するために有用な情報を提供することを目的としています。
想定内の場合も想定外の場合も停止時間が発生した場合の挙動が、クラウドコントローラーとストレージプロキシは互いに似ています。クラウドコントローラーとストレージプロキシはそれぞれクラウドで一つ実行されるので、動作していない場合、非常に目立ちます。
クラウドコントローラーの場合、良いニュースとしては、クラウドが FlatDHCP マルチホスト HA ネットワークモードを使用していれば、既存のインスタンスとボリュームはクラウドコントローラーがオフラインの間も動作を継続するという点があります。しかしながら、ストレージプロキシの場合には、サーバーが元に戻され動作状態になるまで、ストレージとの通信ができません。
クラウドコントローラーやストレージプロキシのメンテナンスを計画する一つの方法は、単に午前 1 時や 2 時のような利用の少ない時間帯に実行することです。この戦略はあまり多くのユーザーに影響を与えません。クラウドコントローラーやストレージプロキシが、いかなる時間帯においても、サービスが利用できないことによる影響が大きければ、高可用性オプションについて検討する必要があります。
多くの場合、「reboot」コマンドを発行するだけです。オペレーティングシステムが正常にサービスをシャットダウンし、自動的に再起動します。万全を期したい場合、再起動する前にバックアップジョブを実行してください。
クラウドコントローラーを再起動した後、すべての必要なサービスが正常に起動したことを確認します。
# ps aux | grep nova- # grep AMQP /var/log/nova/nova-*.log # ps aux | grep glance- # ps aux | grep keystone # ps aux | grep cinder
また、すべてのサービスが正しく機能していることを確認します。
# source openrc # glance index # nova list # keystone tenant-list
ストレージプロキシの場合、Object Storage サービスが再開していることを確認します。
# ps aux | grep swift
また、正しく機能していることを確認します。
# swift stat
残念ながら、これはひどい状況です。クラウドコントローラーはクラウドの不可欠な部分です。コントローラーが一つだけならば、多くのサービスが失われます。
この状況を避けるために、高可用なクラウドコントローラークラスターを作成します。このことは、このドキュメントの範囲外ですが、ドラフト版の OpenStack High Availability Guide が http://docs.openstack.org/trunk/openstack-ha/content/ch-intro.html にあります。
次に最も優れている方法は、クラウドコントローラーを自動的に構築するために Puppet のような構成管理ツールを使用することです。利用可能な予備サーバーがあれば、15 分もかかりません。コントローラーを再構築後、取得したすべてのバックアップを復元します (バックアップとリカバリー の章を参照してください)。
実際には、コンピュートノードの nova-compute サービスがときどき、コントローラー上で動作している rabbitmq に正しく再接続されない場合があります。時間のかかるリブートから戻ってきた場合や、コンピュートノードのnova サービスを再起動する必要がある場合です。
コンピュートノードは、予期せずクラッシュしたり、メンテナンスのために再起動が必要になったりすることがときどきあります。
(ソフトウェアやハードウェアのアップグレードのように) 計画されたメンテナンスのために、コンピュートノードを再起動する必要があれば、まずホストしている全インスタンスがノード外に移動していることを確認します。クラウドが共有ストレージを利用していれば、nova live-migration
コマンドを使用します。初めに、移動させる必要があるインスタンスの一覧を取得します。
# nova list --host c01.example.com --all-tenants
次に、それらを一つずつマイグレーションします。
# nova live-migration <uuid> c02.example.com
共有ストレージを使用していない場合、--block-migrate
オプションを使用できます。
# nova live-migration --block-migrate <uuid> c02.example.com
すべてのインスタンスをマイグレーションした後、nova-compute
サービスが停止していることを確認します。
# stop nova-compute
Puppet などの構成管理システムを使って、nova-compute
サービスが確実に実行されているようにしている場合、init ファイルを一時的に移動します。
# mkdir /root/tmp # mv /etc/init/nova-compute.conf /root/tmp # mv /etc/init.d/nova-compute /root/tmp
続けて、コンピュートノードを停止し、メンテナンスを実行し、ノードを元に戻します。先のコマンドを逆に実行することにより、nova-compute
サービスを再び有効化できます。
# mv /root/tmp/nova-compute.conf /etc/init # mv /root/tmp/nova-compute /etc/init.d/
そして nova-compute
サービスを起動します。
# start nova-compute
インスタンスを元のコンピュートノードにマイグレーションすることもできます。
コンピュートノードを再起動した場合、まず正常に起動したことを確認します。これには nova-compute
サービスが実行していることを確認することが含まれます。
# ps aux | grep nova-compute # status nova-compute
AMQP サーバーに正常に接続できることも確認します。
# grep AMQP /var/log/nova/nova-compute 2013-02-26 09:51:31 12427 INFO nova.openstack.common.rpc.common [-] Connected to AMQP server on 199.116.232.36:5672
コンピュートノードが正常に実行された後、そのコンピュートノードでホストされているインスタンスはどれも動作していないので、そのコンピュートノードにおいてホストされているインスタンスを処理する必要があります。ユーザーや顧客に対する SLA によっては、各インスタンスを開始し、正常に起動していることを確認する必要がある場合もあるでしょう。
以下のコマンドを実行することにより、コンピュートノードにおいてホストされているインスタンスの一覧を作成できます。
# nova list --host c01.example.com --all-tenants
一覧を取得した後、各インスタンスを起動するために nova コマンドを使用できます。
# nova reboot <uuid>
注記 | |
---|---|
予期せずシャットダウンしたときは、ブートに問題があるかもしれません。たとえば、インスタンスがルートパーティションにおいて |
インスタンスがブートしなければ、つまりブートしようとしても virsh list
がインスタンスを表示しなければ、コンピュートノードにおいて以下のとおり実行します。
# tail -f /var/log/nova/nova-compute.log
再び nova reboot
コマンドを実行してみてください。インスタンスがなぜブートできないかについて、エラーメッセージを確認すべきです。
多くの場合、libvirt の XML ファイル (/etc/libvirt/qemu/instance-xxxxxxxx.xml
) の何かがすでに存在しないことで、エラーが発生する。次のとおり実行することにより、インスタンスを再起動するのと同時に、強制的に XML ファイルを再作成できます。
# nova reboot --hard <uuid>
いくつかのシナリオでは、インスタンスが実行中であるにも関わらず、SSH 経由でアクセスできず、あらゆるコマンドに反応がありません。VNC コンソールがブート失敗やカーネルパニックのエラーメッセージを表示している可能性があります。これは仮想マシン自身においてファイルシステム破損の意味する可能性があります。ファイルを復旧したりインスタンスの中身を調査したりする必要があれば、qemu-nbd を使ってディスクをマウントできます。
注記 | |
---|---|
ユーザーのコンテンツやデータにアクセスしたり表示したりする場合は、まず承認をもらってください! |
インスタンスのディスク (/var/lib/nova/instances/instance-xxxxxx/disk) にアクセスするには、以下の手順に従う必要があります。
virsh コマンドを使用してインスタンスをサスペンドします。
qemu-nbd デバイスをディスクに接続します。
qemu-nbd デバイスをマウントします。
デバイスを調査後、アンマウントします。
qemu-nbd デバイスを切断します。
インスタンスを再開します。
手順 4-6 を省略すると、OpenStack Compute がインスタンスを管理できなくなります。OpenStack Compute により発行されるすべてのコマンドに対する応答が失敗し、シャットダウンしているように見えます。
ディスクファイルをマウントすると、それにアクセスでき、ファイルとディレクトリ構造を持つ通常のディレクトリのように取り扱えます。しかしながら、どのファイルの編集も操作もしないことをお薦めします。なぜなら、それにより ACL が変更されたり、起動できるインスタンスが起動できなくなってします場合があるからです。
virsh コマンドを使用してインスタンスを一時停止します - 内部 ID を記録します。
root@compute-node:~# virsh list Id Name State ---------------------------------- 1 instance-00000981 running 2 instance-000009f5 running 30 instance-0000274a running root@compute-node:~# virsh suspend 30 Domain 30 suspended
qemu-nbd デバイスをディスクに接続します。
root@compute-node:/var/lib/nova/instances/instance-0000274a# ls -lh total 33M -rw-rw---- 1 libvirt-qemu kvm 6.3K Oct 15 11:31 console.log -rw-r--r-- 1 libvirt-qemu kvm 33M Oct 15 22:06 disk -rw-r--r-- 1 libvirt-qemu kvm 384K Oct 15 22:06 disk.local -rw-rw-r-- 1 nova nova 1.7K Oct 15 11:30 libvirt.xml root@compute-node:/var/lib/nova/instances/instance-0000274a# qemu-nbd -c /dev/nbd0 `pwd`/disk
qemu-nbd デバイスをマウントします。
qemu-nbd デバイスはインスタンスのディスクの個々のパーティションを別々のデバイスとしてエクスポートしようとします。たとえば、ディスクが vda で、ルートパーティションが vda1 の場合、qemu-nbd はそれぞれ /dev/nbd0 と /dev/nbd0p1 としてデバイスをエクスポートします。
#mount the root partition of the device root@compute-node:/var/lib/nova/instances/instance-0000274a# mount /dev/nbd0p1 /mnt/ # List the directories of mnt, and the vm's folder is display # You can inspect the folders and access the /var/log/ files
セカンダリディスクや一時ディスクを調査する際に、プライマリディスクとセカンダリディスクを同時にマウントしたければ、別のマウントポイントを使用してください。
# umount /mnt # qemu-nbd -c /dev/nbd1 `pwd`/disk.local # mount /dev/nbd1 /mnt/
root@compute-node:/var/lib/nova/instances/instance-0000274a# ls -lh /mnt/ total 76K lrwxrwxrwx. 1 root root 7 Oct 15 00:44 bin -> usr/bin dr-xr-xr-x. 4 root root 4.0K Oct 15 01:07 boot drwxr-xr-x. 2 root root 4.0K Oct 15 00:42 dev drwxr-xr-x. 70 root root 4.0K Oct 15 11:31 etc drwxr-xr-x. 3 root root 4.0K Oct 15 01:07 home lrwxrwxrwx. 1 root root 7 Oct 15 00:44 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Oct 15 00:44 lib64 -> usr/lib64 drwx------. 2 root root 16K Oct 15 00:42 lost+found drwxr-xr-x. 2 root root 4.0K Feb 3 2012 media drwxr-xr-x. 2 root root 4.0K Feb 3 2012 mnt drwxr-xr-x. 2 root root 4.0K Feb 3 2012 opt drwxr-xr-x. 2 root root 4.0K Oct 15 00:42 proc dr-xr-x---. 3 root root 4.0K Oct 15 21:56 root drwxr-xr-x. 14 root root 4.0K Oct 15 01:07 run lrwxrwxrwx. 1 root root 8 Oct 15 00:44 sbin -> usr/sbin drwxr-xr-x. 2 root root 4.0K Feb 3 2012 srv drwxr-xr-x. 2 root root 4.0K Oct 15 00:42 sys drwxrwxrwt. 9 root root 4.0K Oct 15 16:29 tmp drwxr-xr-x. 13 root root 4.0K Oct 15 00:44 usr drwxr-xr-x. 17 root root 4.0K Oct 15 00:44 var
調査を完了すると、マウントポイントをアンマウントし、qemu-nbd デバイスを解放します。
root@compute-node:/var/lib/nova/instances/instance-0000274a# umount /mnt root@compute-node:/var/lib/nova/instances/instance-0000274a# qemu-nbd -d /dev/nbd0 /dev/nbd0 disconnected
virsh を使用してインスタンスを再開します。
root@compute-node:/var/lib/nova/instances/instance-0000274a# virsh list Id Name State ---------------------------------- 1 instance-00000981 running 2 instance-000009f5 running 30 instance-0000274a paused root@compute-node:/var/lib/nova/instances/instance-0000274a# virsh resume 30 Domain 30 resumed
影響のあったインスタンスがボリュームを接続していれば、まずインスタンスとボリュームの UUID 一覧を生成します。
mysql> select nova.instances.uuid as instance_uuid, cinder.volumes.id as volume_uuid, cinder.volumes.status, cinder.volumes.attach_status, cinder.volumes.mountpoint, cinder.volumes.display_name from cinder.volumes inner join nova.instances on cinder.volumes.instance_uuid=nova.instances.uuid where nova.instances.host = 'c01.example.com';
以下のような結果を確認できます。
+---------------+-------------+--------+---------------+------------+--------------+ | instance_uuid | volume_uuid | status | attach_status | mountpoint | display_name | +---------------+-------------+--------+---------------+------------+--------------+ | 9b969a05 | 1f0fbf36 | in-use | attached | /dev/vdc | test | +---------------+-------------+--------+---------------+------------+--------------+ 1 row in set (0.00 sec)
次に、ボリュームを手動で切断し、再接続します。
# nova volume-detach <instance_uuid> <volume_uuid> # nova volume-attach <instance_uuid> <volume_uuid> /dev/vdX
ここで、X には適切なマウントポイントを指定します。上記を実行する前に、インスタンスが正常に起動し、ログイン画面になっていることを確認します。
コンピュートノードが故障し、2〜3時間もしくはそれ以上たっても復旧できないと見込まれる場合、/var/lib/nova/instances
に共有ストレージを使用していれば、故障したノードで動作していたインスタンスをすべて再スタートすることができます。
これを実行するために、nova データベースにおいて以下のクエリーを実行することにより、故障したノードにおいてホストされているインスタンスの UUID の一覧を生成します。
mysql> select uuid from instances where host = 'c01.example.com' and deleted = 0;
次に、c01.example.com においてホストされていたすべてのインスタンスが、今度は c02.example.com でホストされることを Nova に教えます。
mysql> update instances set host = 'c02.example.com' where host = 'c01.example.com' and deleted = 0;
その後、nova コマンドを使って、c01.example.com にあったすべてのインスタンスを再起動します。起動する際にインスタンスの XML ファイルを再生成します。
# nova reboot --hard <uuid>
最後に、ボリュームの節で説明されているのと同じ方法を用いて、ボリュームを再接続します。
コンピュートノードの故障の話題に関連して、このディレクトリについては説明しておく価値があるでしょう。このディレクトリには、コンピュートノードにホストされているインスタンス用の libvirt KVM のファイル形式のディスクイメージが置かれます。共有ストレージ環境でクラウドを実行していなければ、このディレクトリはコンピュートノード全体で一つしかありません。
/var/lib/nova/instances
には 2 種類のディレクトリがあります。
一つ目は _base
ディレクトリです。ここには、そのコンピュートノードで起動されたそれぞれのイメージに関して、glance から取得したすべてのベースイメージのキャッシュが置かれます。_20
(または他の番号) で終わるファイルは一時ディスクのベースイメージです。
もう一つのディレクトリは instance-xxxxxxxx
という名前です。これらのディレクトリはコンピュートノードにおいて実行中のインスタンスと対応します。中にあるファイルは _base
ディレクトリにあるファイルのどれかと関連があります。これらは基本的に、元々の _base
ディレクトリからの変更点のみ含む、差分ベースのファイルです。
/var/lib/nova/instances
にあるすべてのファイルとディレクトリは一意に名前が付けられています。_base にあるファイルは元となった glance イメージに対応する一意に名前が付けられています。また、instance-xxxxxxxx
という名前が付けられたディレクトリは特定のインスタンスに対して一意にタイトルが付けられています。たとえば、あるコンピュートノードにある /var/lib/nova/instances
のすべてのデータを他のノードにコピーしたとしても、ファイルを上書きすることはありませんし、また同じ一意な名前を持つイメージにダメージを与えることもありません。同じ一意な名前を持つものは本質的に同じファイルだからです。
この方法はドキュメントに書かれておらず、サポートされていない方法ですが、コンピュートノードが完全にオフラインになってしまったが、インスタンスがローカルに保存されているときに、この方法を使用できます。
オブジェクトストレージの高い冗長性のため、オブジェクトストレージのノードに関する問題を処理することは、コンピュートノードに関する問題を処理するよりも簡単です。
ストレージノードを少し長い間 (1 日以上) シャットダウンする必要があれば、ノードをストレージリングから削除することを検討します。例:
# swift-ring-builder account.builder remove <ip address of storage node> # swift-ring-builder container.builder remove <ip address of storage node> # swift-ring-builder object.builder remove <ip address of storage node> # swift-ring-builder account.builder rebalance # swift-ring-builder container.builder rebalance # swift-ring-builder object.builder rebalance
次に、ring ファイルを他のノードに再配布します。
# for i in s01.example.com s02.example.com s03.example.com > do > scp *.ring.gz $i:/etc/swift > done
これらの操作はストレージノードをストレージクラスターから効率的に外せます。
ノードがクラスターに参加できるようになったら、ただリングに再度追加するだけです。swift-ring-builder
を使用して Swift クラスターにノードを追加するための構文は、元々クラスターを作成したときに使用した元々のオプションに強く依存します。作成時に使用したコマンドをもう一度見てください。
Object Storage ノードのハードディスクが故障した場合、その交換は比較的簡単です。Object Storage 環境が正しく設定され、故障したディスクに保存されているデータが Object Storage 環境内の他のディスクにも複製されていることを前提にしています。
この例では、/dev/sdb
が故障したと仮定します。
まず、ディスクをアンマウントします。
# umount /dev/sdb
次に、ディスクを物理的にサーバーから取り外し、正常なディスクと入れ替えます。
オペレーティングシステムが新しいディスクを認識していることを確認します。
# dmesg | tail
/dev/sdb に関するメッセージを確認したほうがいいです。
Swift ディスクではパーティションを使用しないことが推奨されるので、単にディスク全体をフォーマットします。
# mkfs.xfs /dev/sdb
最後に、ディスクをマウントします。
# mount -a
Swift は新しいディスクを認識します。また、データが存在しないことを認識します。そうすると、他の既存の複製からディスクにデータを複製しはじめます。
データセンターの電力消失のような、完全なシステム故障から復旧する一般的な方法は、各サービスに優先度を付け、順番に復旧することです。
1 |
内部ネットワーク接続性 |
2 |
バックエンドのストレージサービス |
3 |
ユーザーの仮想マシンに対するパブリックネットワーク接続性 |
4 |
nova-compute, nova-network, cinder ホスト |
5 |
ユーザーの仮想マシン |
10 |
メッセージキューとデータベースのサービス |
15 |
Keystone サービス |
20 |
cinder-scheduler |
21 |
イメージカタログとイメージ配信のサービス |
22 |
nova-scheduler サービス |
98 |
cinder-api |
99 |
nova-api サービス |
100 |
ダッシュボードサービス |
この例にある優先度一覧を使用すると、きちんと安定した状態になる前であっても、できる限り早くユーザーに影響するサービスを復旧させることができます。もちろん、1 行の項目として一覧化されていますが、各ステップは多大な作業が必要です。たとえば、データベースを開始した後、その完全性を確認すべきです。また、Nova サービスを開始した後、ハイパーバイザーがデータベースに一致しているかを確認し、不一致があれば修正すべきです。
OpenStack クラウドをメンテナンスするには、複数の物理サーバーを管理することが必要です。そして、この数は日々増えていきます。ノードを手動で管理することはエラーを起こしやすいので、構成管理ツールを使用することを強く推奨します。これらのツールはすべてのノードが適切に設定されていることを保証するプロセスを自動化します。また、これらを使うことで、(パッケージや設定オプションといった) 構成情報のバージョン管理されたリポジトリでの管理が行いやすくなります。
いくつかの構成管理ツールがあります。このガイドでは特定のものを推奨しません。OpenStack コミュニティで人気があるものは Puppet (https://puppetlabs.com/) と Chef (http://opscode.com/chef) の 2 つで、OpenStack 用の設定集がそれぞれ OpenStack Puppet modules (http://github.com/puppetlabs/puppetlabs-openstack) と OpenStack Chef recipes (https://github.com/opscode/openstack-chef-repo) にあります。比較的新しい他のツールとしては、Juju (https://juju.ubuntu.com/)、Ansible (http://ansible.cc) や Salt (http://saltstack.com) があります。もう少し成熟したツールとしては CFEngine (http://cfengine.com) や Bcfg2 (http://bcfg2.org) があります。
初期導入時と同じように、本番環境に追加する前に、すべてのハードウェアについて適切な通電テストを行うべきでしょう。ハードウェアを限界まで使用するソフトウェアを実行します。RAM、CPU、ディスク、ネットワークを限界まで使用します。多くのオプションが利用可能であり、通常はベンチマークソフトウェアとの役割も果たします。そのため、システムのパフォーマンスに関する良いアイディアを得ることもできます。
コンピューティングリソースのキャパシティ限界に達した、または達しそうとわかれば、さらなるコンピュートノードの追加を計画すべきです。さらなるノードを追加することは簡単です。ノードを追加する手順は、最初にコンピュートノードをクラウドに導入したときと同じです。自動配備システムを使ってベアメタルサーバーにオペレーティングシステムのインストールと起動を行い、次に構成管理システムによりOpenStack Compute サービスのインストールと設定を行います。他のコンピュートノードと同じ方法で Compute サービスのインストールと設定が終わると、自動的にクラウドに接続されます。クラウドコントローラーが新しいノードを検知し、そこにインスタンスを起動するようスケジュールし始めます。
OpenStack ブロックストレージノードがコンピュートノードから分離いる場合、同じキュー管理とポーリングのシステムが両方のサービスで使用されるので、同じ手順が適用できます。
新しいコンピュートノードとブロックストレージノードには、同じハードウェアを使用することを推奨します。最低限、ライブマイグレーションが失敗しないように、コンピュートノードでは CPU は同様のものにしてください。
新しいオブジェクトストレージノードの追加は、コンピュートノードやブロックストレージノードの追加とは異なります。サーバーの設定は、これまで通り自動配備システムと構成管理システムを使って行えます。完了した後、オブジェクトストレージノードのローカルディスクをオブジェクトストレージリングに追加する必要があります。これを実行するコマンドは、最初にディスクをリングに追加するのに使用したコマンドと全く同じです。オブジェクトストレージプロキシサーバーにおいて、このコマンドを、新しいオブジェクトストレージノードにあるすべてのディスクに対して、再実行するだけです。これが終わったら、リングの再バランスを行い、更新されたリングファイルを他のストレージノードにコピーします。
注記 | |
---|---|
新しいオブジェクトストレージノードのディスク数が元々のノードのディスク数と異なる場合には、新しいノードを追加するコマンドが元々のコマンドと異なります。これらのパラメーターは環境により異なります。 |
ほとんどすべての OpenStack コンポーネントは、永続的な情報を保存するために内部でデータベースを使用しています。このデータベースは通常 MySQL です。通常の MySQL の管理方法がこれらのデータベースに適用できます。OpenStack は特別な方法でデータベースを設定しているわけではありません。基本的な管理として、パフォーマンス調整、高可用性、バックアップ、リカバリーおよび修理などがあります。さらなる情報は標準の MySQL 管理ガイドを参照してください。
より迅速に情報を取得したり、データ不整合のエラーを修正したりするために、データベースでいくつかの小技を実行できます。たとえば、インスタンスが終了していたが、データベースの状態が更新されていなかった、という状況です。こうした小技がこのドキュメント全体を通して議論されています。
コンポーネントの設定ファイルを確認して、それぞれの OpenStack コンポーネントが対応するデータベースにどのようにアクセスするかを把握ください。sql_connection
またはただの connection
を探します。
# grep -hE "connection ?=" /etc/nova/nova.conf /etc/glance/glance-*.conf /etc/cinder/cinder.conf /etc/keystone/keystone.conf sql_connection = mysql://nova:nova@cloud.alberta.sandbox.cybera.ca/nova sql_connection = mysql://glance:password@cloud.example.com/glance sql_connection = mysql://glance:password@cloud.example.com/glance sql_connection=mysql://cinder:password@cloud.example.com/cinder connection = mysql://keystone_admin:password@cloud.example.com/keystone
connection 文字列は以下の形式をとります。
mysql:// <username> : <password> @ <hostname> / <database name>
クラウドが大きくなるにつれて、MySQL がさらに使用されてきます。MySQL がボトルネックになってきたことが疑われる場合、MySQL 最適化の調査から始めるとよいでしょう。MySQL のマニュアルでは、Optimization Overview (http://dev.mysql.com/doc/refman/5.5/en/optimize-overview.html) というセクションがあり、一つのセクション全部をあててこの話題を扱っています。
これらは、毎時間、日、週、月および年に実行する To Do 項目の簡単な一覧です。これらのタスクは必要なものでも、絶対的なものでもありませんが、役に立つものばかりです。
この四半期における使用量および傾向を確認します。
使用量と統計に関する四半期レポートを準備します。
クラウドの追加の必要性を検討し、計画を立てます。
OpenStack のメジャーアップグレードの内容を確認し、その計画を立てます。
OpenStack は、異なるコンポーネント同士が互いに強く連携して動作しています。たとえば、イメージのアップロードでは、nova-api
, glance-api
, glance-registry
, Keystone が連携する必要があります。 swift-proxy
も関係する場合があります。その結果、時として問題が発生している箇所を正確に特定することが難しくなります。これを支援することがこのセクションの目的です。
最初に確認する場所は、実行しようとしているコマンドに関連するログファイルです。たとえば、nova list
が失敗していれば、Nova ログファイルを tail 表示しながら、次のコマンドを再実行してください。
端末 1:
# tail -f /var/log/nova/nova-api.log
端末 2:
# nova list
何らかのエラーまたはトレースをログファイルで探します。詳細は ロギングとモニタリング の章を参照してください。
エラーから問題が他のコンポーネントにあることが分かる場合には、そのコンポーネントのログファイルに表示を切り替えます。nova が glance にアクセスできなければ、glance-api ログを確認します。
端末 1:
# tail -f /var/log/glance/api.log
端末 2:
# nova list
問題の根本となる原因を見つけるまで、洗い出し、精査し、繰り返します。
残念ながら、ときどきエラーがログファイルに表れない場合があります。このような場合、作戦を変更し、違うコマンドを使用します。おそらくコマンドラインにおいて直接サービスを実行することです。たとえば、glance-api
サービスが起動しなかったり、実行状態にとどまらない場合は、コマンドラインからデーモンを起動してみます。
# sudo -u glance -H glance-api
これにより、エラーと問題の原因が表示されるかもしれません。
注記 | |
---|---|
sudo を用いてデーモンを実行するとき、 |
ある朝、あるノードでインスタンスの実行がすべて失敗するようになりました。ログファイルがすこしあいまいでした。特定のインスタンスが起動できなかったことを示していました。これは最終的に偽の手掛かりであることがわかりました。単にそのインスタンスがアルファベット順で最初のインスタンスだったので、nova-compute が最初に操作したのがそのインスタンスだったというだけでした。
さらなるトラブルシューティングにより、libvirt がまったく動作していないことがわかりました。これは大きな手がかりです。libvirt が動作していないと、KVM によるインスタンスの仮想化ができません。libvirt を開始させようとしても、libvirt は何も表示せずすぐに停止しました。libvirt のログでは理由がわかりませんでした。
次に、libvirtd
デーモンをコマンドラインにおいて実行しました。最終的に次のような役に立つエラーメッセージが得られました。d-bus に接続できませんでした。このため、滑稽に聞こえるかもしれませんが、libvirt 、その結果として nova-compute
も D-Bus に依存していて、どういう訳か D-Bus がクラッシュしました。単に D-Bus を開始するだけで、一連のプログラムがうまく動くようになり、すぐに全部が元に戻り動作状態になりました。
Object Storage 以外では、OpenStack をあるバージョンから別のバージョンへアップグレードするには、非常に労力を伴います。
一般的に、アップグレード作業は以下の手順で行います。
リリースノートとドキュメントを読みます。
異なるバージョン間の非互換性を確認します。
アップグレードスケジュールの計画を立て、テストクラスターで手順どおりにアップグレードができることを確認します。
アップグレードを実行します。
ユーザーのインスタンスが実行中のまま、アップグレードを実行することができます。しかしながら、この方法は危険です。ユーザーに対する適切な通知を忘れないようにしてください。そして、バックアップも忘れないでください。
最も成功すると考えられる一般的な順番は次のとおりです。
OpenStack Identity サービス (keystone) をアップグレードします。
OpenStack Image サービス (glance) をアップグレードします。
すべての OpenStack Compute (nova) サービスをアップグレードします。
すべての OpenStack Block Storage (cinder) サービスをアップグレードします。
これらのステップそれぞれに対して、以下のサブステップを完了します。
サービスを停止します。
設定ファイルとデータベースのバックアップを作成します。
ディストリビューションのパッケージマネージャーを用いてパッケージをアップグレードします。
リリースノートに従って設定ファイルを更新します。
データベースのアップグレードを適用します。
サービスを再起動します。
すべてが正しく動作することを確認します。
おそらく、すべて中で最も大切なステップは事前のアップグレードテストです。とくに新しいバージョンのリリース後すぐにアップグレードする場合、未発見のバグによってアップグレードがうまくいかないこともあるでしょう。管理者によっては、最初のアップデート版が出るまで待つことを選ぶ場合もあります。しかしながら、重要な環境の場合には、リリース版の開発やテストに参加することで、あなたのユースケースでのバグを確実に修正することもできるでしょう。
インスタンスを実行したまま、OpenStack Compute のアップグレードを行うには、ハイパーバイザーの機能のライブマイグレーションを使って、アップグレードを実行している間はインスタンスを他のマシンに移動し、終わったら元のマシンに戻す方法を取ることができます。しかしながら、データベースの更新を確実に行うことが非常に重要です。さもないと、クラスターが一貫性のない状態になってしまいます。
我々は常に、自動配備システムを使って、まっさらの状態からシステムを再インストールすることを進めていますが、時として OpenStack を地道にシステムから削除しなければならない場合もあるでしょう。その場合には以下の手順となります。
すべてのパッケージを削除する
残っているファイルを削除する
データベースを削除する
これらの手順はお使いのディストリビューションにより異なりますが、一般には aptitude purge ~c $package
のようなパッケージマネージャーの「purge(完全削除)」コマンドを探すとよいでしょう。その後で、このガイドの中に出てきたディレクトリにある不要なファイルを探します。データベースを適切にアンインストールする方法については、使用しているソフトウェアの適切なマニュアルを参照して下さい。