第12章 メンテナンス、故障およびデバッグ

停止時間(計画的なものと予定外のものの両方)はクラウドを運用するときに確実に発生します。本章は、プロアクティブまたはリアクティブに、これらの出来事に対処するために有用な情報を提供することを目的としています。

 クラウドコントローラーとストレージプロキシの故障とメンテナンス

想定内の場合も想定外の場合も停止時間が発生した場合の挙動が、クラウドコントローラーとストレージプロキシは互いに似ています。クラウドコントローラーとストレージプロキシはそれぞれクラウドで一つ実行されるので、動作していない場合、非常に目立ちます。

クラウドコントローラーの場合、良いニュースとしては、クラウドが 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>
[注記]注記

予期せずシャットダウンしたときは、ブートに問題があるかもしれません。たとえば、インスタンスがルートパーティションにおいて fsck を実行する必要があるかもしれません。もしこうなっても、これを修復するためにダッシュボード VNC コンソールを使用できます。

インスタンスがブートしなければ、つまりブートしようとしても 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) にアクセスするには、以下の手順に従う必要があります。

  1. virsh コマンドを使用してインスタンスをサスペンドします。

  2. qemu-nbd デバイスをディスクに接続します。

  3. qemu-nbd デバイスをマウントします。

  4. デバイスを調査後、アンマウントします。

  5. qemu-nbd デバイスを切断します。

  6. インスタンスを再開します。

手順 4-6 を省略すると、OpenStack Compute がインスタンスを管理できなくなります。OpenStack Compute により発行されるすべてのコマンドに対する応答が失敗し、シャットダウンしているように見えます。

ディスクファイルをマウントすると、それにアクセスでき、ファイルとディレクトリ構造を持つ通常のディレクトリのように取り扱えます。しかしながら、どのファイルの編集も操作もしないことをお薦めします。なぜなら、それにより ACL が変更されたり、起動できるインスタンスが起動できなくなってします場合があるからです。

  1. 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
  2. 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             
  3. 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
  4. 調査を完了すると、マウントポイントをアンマウントし、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
  5. 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>

最後に、ボリュームの節で説明されているのと同じ方法を用いて、ボリュームを再接続します。

 /var/lib/nova/instances

コンピュートノードの故障の話題に関連して、このディレクトリについては説明しておく価値があるでしょう。このディレクトリには、コンピュートノードにホストされているインスタンス用の 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 クラスターにノードを追加するための構文は、元々クラスターを作成したときに使用した元々のオプションに強く依存します。作成時に使用したコマンドをもう一度見てください。

 Swift ディスクの交換

Object Storage ノードのハードディスクが故障した場合、その交換は比較的簡単です。Object Storage 環境が正しく設定され、故障したディスクに保存されているデータが Object Storage 環境内の他のディスクにも複製されていることを前提にしています。

この例では、/dev/sdb が故障したと仮定します。

まず、ディスクをアンマウントします。

# umount /dev/sdb

次に、ディスクを物理的にサーバーから取り外し、正常なディスクと入れ替えます。

オペレーティングシステムが新しいディスクを認識していることを確認します。

# dmesg | tail

/dev/sdb に関するメッセージを確認したほうがいいです。

Swift ディスクではパーティションを使用しないことが推奨されるので、単にディスク全体をフォーマットします。

# mkfs.xfs /dev/sdb

最後に、ディスクをマウントします。

# mount -a

Swift は新しいディスクを認識します。また、データが存在しないことを認識します。そうすると、他の既存の複製からディスクにデータを複製しはじめます。

 完全な故障の対処

データセンターの電力消失のような、完全なシステム故障から復旧する一般的な方法は、各サービスに優先度を付け、順番に復旧することです。

表12.1 サービス復旧優先度一覧の例

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 は同様のものにしてください。

 オブジェクトストレージノードの追加

新しいオブジェクトストレージノードの追加は、コンピュートノードやブロックストレージノードの追加とは異なります。サーバーの設定は、これまで通り自動配備システムと構成管理システムを使って行えます。完了した後、オブジェクトストレージノードのローカルディスクをオブジェクトストレージリングに追加する必要があります。これを実行するコマンドは、最初にディスクをリングに追加するのに使用したコマンドと全く同じです。オブジェクトストレージプロキシサーバーにおいて、このコマンドを、新しいオブジェクトストレージノードにあるすべてのディスクに対して、再実行するだけです。これが終わったら、リングの再バランスを行い、更新されたリングファイルを他のストレージノードにコピーします。

[注記]注記

新しいオブジェクトストレージノードのディスク数が元々のノードのディスク数と異なる場合には、新しいノードを追加するコマンドが元々のコマンドと異なります。これらのパラメーターは環境により異なります。

 コンポーネントの交換

クラウドインフラなどの大規模環境では、ハードウェアの故障はよくあることです。作業内容を考慮し、可用性と時間の節約のバランスを取ります。たとえば、オブジェクトストレージクラスターは、十分な容量がある場合には、ある程度の期間は死んだディスクがあっても問題なく動作します。また、(クラウド内の) コンピュートノードに空きがある場合には、問題に対処する時間が取れるまで、ライブマイグレーションで RAM が故障したホストから他のホストへインスタンスを移動させることも考慮するとよいでしょう。

 データベース

ほとんどすべての 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) というセクションがあり、一つのセクション全部をあててこの話題を扱っています。

 HDWMY

これらは、毎時間、日、週、月および年に実行する To Do 項目の簡単な一覧です。これらのタスクは必要なものでも、絶対的なものでもありませんが、役に立つものばかりです。

 毎時

  • 監視システムのアラートを確認し、それらに対処します。

  • チケットキューの新しいチケットを確認します。

 日次

  • 故障または異常になっているインスタンスを確認し、理由を調査します。

  • セキュリティパッチを確認し、必要に応じて適用します。

 週次

  • クラウドの使用量を確認します:

    • ユーザークォータ

    • ディスク領域

    • イメージ使用量

    • 大きなインスタンス

    • ネットワーク使用量 (帯域および IP 使用量)

  • アラート機能が動作していることを確認します。

 月次

  • この 1 か月における使用量および傾向を確認します。

  • 削除すべきユーザーアカウントを確認します。

  • 削除すべきオペレーターアカウントを確認します。

 四半期ごと

  • この四半期における使用量および傾向を確認します。

  • 使用量と統計に関する四半期レポートを準備します。

  • クラウドの追加の必要性を検討し、計画を立てます。

  • OpenStack のメジャーアップグレードの内容を確認し、その計画を立てます。

 半年ごと

  • OpenStack をアップグレードします。

  • 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 を用いてデーモンを実行するとき、-H フラグが必要です。いくつかのデーモンは、ユーザーのホームディレクトリーからの相対パスのファイルに書き込みを行うため、-H がないと、この書き込みが失敗してしまいます。

 複雑な例

ある朝、あるノードでインスタンスの実行がすべて失敗するようになりました。ログファイルがすこしあいまいでした。特定のインスタンスが起動できなかったことを示していました。これは最終的に偽の手掛かりであることがわかりました。単にそのインスタンスがアルファベット順で最初のインスタンスだったので、nova-compute が最初に操作したのがそのインスタンスだったというだけでした。

さらなるトラブルシューティングにより、libvirt がまったく動作していないことがわかりました。これは大きな手がかりです。libvirt が動作していないと、KVM によるインスタンスの仮想化ができません。libvirt を開始させようとしても、libvirt は何も表示せずすぐに停止しました。libvirt のログでは理由がわかりませんでした。

次に、libvirtd デーモンをコマンドラインにおいて実行しました。最終的に次のような役に立つエラーメッセージが得られました。d-bus に接続できませんでした。このため、滑稽に聞こえるかもしれませんが、libvirt 、その結果として nova-compute も D-Bus に依存していて、どういう訳か D-Bus がクラッシュしました。単に D-Bus を開始するだけで、一連のプログラムがうまく動くようになり、すぐに全部が元に戻り動作状態になりました。

 アップグレード

Object Storage 以外では、OpenStack をあるバージョンから別のバージョンへアップグレードするには、非常に労力を伴います。

一般的に、アップグレード作業は以下の手順で行います。

  1. リリースノートとドキュメントを読みます。

  2. 異なるバージョン間の非互換性を確認します。

  3. アップグレードスケジュールの計画を立て、テストクラスターで手順どおりにアップグレードができることを確認します。

  4. アップグレードを実行します。

ユーザーのインスタンスが実行中のまま、アップグレードを実行することができます。しかしながら、この方法は危険です。ユーザーに対する適切な通知を忘れないようにしてください。そして、バックアップも忘れないでください。

最も成功すると考えられる一般的な順番は次のとおりです。

  1. OpenStack Identity サービス (keystone) をアップグレードします。

  2. OpenStack Image サービス (glance) をアップグレードします。

  3. すべての OpenStack Compute (nova) サービスをアップグレードします。

  4. すべての OpenStack Block Storage (cinder) サービスをアップグレードします。

これらのステップそれぞれに対して、以下のサブステップを完了します。

  1. サービスを停止します。

  2. 設定ファイルとデータベースのバックアップを作成します。

  3. ディストリビューションのパッケージマネージャーを用いてパッケージをアップグレードします。

  4. リリースノートに従って設定ファイルを更新します。

  5. データベースのアップグレードを適用します。

  6. サービスを再起動します。

  7. すべてが正しく動作することを確認します。

おそらく、すべて中で最も大切なステップは事前のアップグレードテストです。とくに新しいバージョンのリリース後すぐにアップグレードする場合、未発見のバグによってアップグレードがうまくいかないこともあるでしょう。管理者によっては、最初のアップデート版が出るまで待つことを選ぶ場合もあります。しかしながら、重要な環境の場合には、リリース版の開発やテストに参加することで、あなたのユースケースでのバグを確実に修正することもできるでしょう。

インスタンスを実行したまま、OpenStack Compute のアップグレードを行うには、ハイパーバイザーの機能のライブマイグレーションを使って、アップグレードを実行している間はインスタンスを他のマシンに移動し、終わったら元のマシンに戻す方法を取ることができます。しかしながら、データベースの更新を確実に行うことが非常に重要です。さもないと、クラスターが一貫性のない状態になってしまいます。

 アンインストール

我々は常に、自動配備システムを使って、まっさらの状態からシステムを再インストールすることを進めていますが、時として OpenStack を地道にシステムから削除しなければならない場合もあるでしょう。その場合には以下の手順となります。

  • すべてのパッケージを削除する

  • 残っているファイルを削除する

  • データベースを削除する

これらの手順はお使いのディストリビューションにより異なりますが、一般には aptitude purge ~c $package のようなパッケージマネージャーの「purge(完全削除)」コマンドを探すとよいでしょう。その後で、このガイドの中に出てきたディレクトリにある不要なファイルを探します。データベースを適切にアンインストールする方法については、使用しているソフトウェアの適切なマニュアルを参照して下さい。



loading table of contents...