第24回:EucalyptusのデータのバックアップとEucalyptus 3.1へのアップデート


 しばらく連載の更新が滞りましたが、2012/06/27にEucalyptus 3.1がリリースされましたので、今回から数回に渡って3.1のインストール方法および既存環境のアップデート方法や新機能の説明と使い方などを紹介していきます。

 なお、前回(第23回)の予告では「次回はマルチクラウド管理ソフトウェアのAeolusを取り上げる予定」と書きましたが、上記のとおり3.1がリリースされましたので、Aeolusについてはいずれ別の機会で触れようと思います。なお、Aeolusについて知りたい方はレッドハットの中井氏のブログで紹介されていますのでぜひ参考にしてください。

Eucalyptus 3.1 について

 Eucalyptus 3.1の新機能については、本連載の第18回でEucalyptus 3.0の新機能を紹介しているので参考にしてください。第18回で紹介したこと以外に主な変更点としては以下の特徴があります。

・Web管理画面の改良
 主な変更はIAM機能と利用者レポートへの対応が追加されましたが、見た目も以下のように大きく改良されています。

3.1のWeb管理画面

・仮想化基盤としてVMware(ESXi)に対応
 Enterprise Editionではバージョン2.0の頃からVMware対応になっていましたが、3.1からはOpenSource版でも利用できるようになりました。

・公式マシンイメージの一新
 Eucalyptus 3からは公式のマシンイメージが一新され、マシンイメージを提供するサイト(http://emis.eucalyptus.com)が公開されました。更にこのサイトで公開されているマシンイメージを簡単に利用できるようにするためにeustore-describe-images/eustore-install-imageという2つのコマンドが提供されました。

・CCでのマシンイメージキャッシュ機能
 Eucalyptus 3.1からは各CCでもマシンイメージがキャッシュできる機能が追加されました。デフォルトの設定では無効になっていますが、CCのeucalyptus.confにてCC_IMAGE_PROXY系のパラメータを設定することで有効にできます。この機能によってWalrusの負荷を軽減でき、マルチクラスタ時のパフォーマンス改善が可能になっています。

・euca2oolsの変更
 色々と変わっていますが大きな点としては、ユーザー/グループなどの情報を扱うためのeuare-系コマンド、Eucalyptus 3系での新規機能に対するeuca-系コマンドの対応およびコマンドの追加があります。また小さな変更点ですが影響度が比較的大きいのがeuca-registerコマンドのオプション"-a,--architecture"のデフォルト値がx86_64からi386になりましたので、マシンイメージの登録時は注意が必要です。


Eucalyptus 3.1 へのアップグレードの前に

 本連載では今まで、CentOS 5.x上にEucalyptusを構築した環境を前提に進めてきましたので、まず最初に今回の連載ではCentOS 5.8に構築したEucalyptus 2.0.3の環境をEucalyptus 3.1にアップデートする方法について説明します。

 一点、大きな注意点として2.0.3から3.1へはアーキテクチャ的な変更が大きいため、公式のドキュメントではインスタンスおよびEucalyptusのサービスを停止してからアップデートすることを推奨しております。つまり活性アップデートは推奨されていません。

 加えて、今回のアップデート作業にかかわらずどのバージョンでのアップデート作業についても共通で言えることですが、アップデート作業前は必ず環境の状況確認及びバックアップなどの取得を実施しておくことをお勧めします。筆者がアップデート作業の前に実施しておく主な作業は以下の通りです。

◆周知作業
アップグレードを実施する前に環境を利用しているユーザーに対してアップデート作業を実施する日時を周知しておきます。この周知作業はなるべく早めに行なっておいたほうがユーザーも事前に必要な作業を実施することができ、アップデート直前の駆け込み作業を少しでも軽減することができます(とは言え、実際にはどうしてもユーザーによる駆け込み作業が発生しますが…)。

◆確認作業
アップデート作業の前に、対象とする環境(Eucalyptusをインストールしたマシン)が現在どのような状況になっているかを確認しておきます。もちろんわざわざ確認せずとも日次作業によって確認済みかもしれない項目もあります。

・ディスクの空き容量(各物理マシンにて)

 アップデート作業によって大量のディスク容量が消費されるわけではありませんが、前述した周知作業を見たユーザーがEBSボリュームのスナップショット取得やインスタンスの保存(BundleImageとUploadBundle)を行なうことによって大量のディスク容量を消費する場合があるため、現在の空き容量を把握しておくべきです。

 もしディスクの空き容量が少ない場合はディスクの増設を行なうか、もしくはユーザーに対して左記の作業を禁止する必要があります。ディスクの空き容量を確認するには、例えば以下のようにdfコマンドを実行します。

[root@front ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3              69G   14G   52G  21% /
/dev/sda1              99M   12M   82M  13% /boot
tmpfs                 984M   24K  984M   1% /dev/shm

・ロードアベレージ(各物理マシンにて)

ロードアベレージが高くなっている物理マシンがある場合は、何のプロセスが原因でそのような状態になっているかを確認しておくべきです。もしロードアベレージが高くなりすぎていて物理マシンのレスポンスが悪い場合にEucalyptusのアップグレード作業に支障を来たす場合があります。ロードアベレージを確認するには、例えば以下のようにuptimeコマンドを実行します。

[root@front ~]# uptime
21:13:12 up 14 days, 21:57, 5 users, load average: 0.02, 0.03, 0.04

 上記が全てではありませんが、最低限これらの情報はアップデート前に確認しておくことをお勧めします。


◆バックアップ作業

 アップデート作業の前に、対象とする環境(Eucalyptusをインストールしたマシン)の各種情報の取得(保存/確保)を行なっておきます。もちろんわざわざバックアップしなくても日次処理によってバックアップ済みかもしれない項目もあります。

・iptablesの情報(各CCにて)

 CCのiptables情報は利用者がインスタンスへアクセスする上で欠かせない情報の一つです。仮にアップデート作業中にトラブルが発生し、Eucalyptusのサービスが正しく動かない場合に陥いっても、このiptablesの情報があれば利用者がインスタンスにアクセスできるように環境を復旧させることが可能になります。iptablesの情報は以下のように実行してファイルに出力しておきます。

[root@front ~]# iptables-save > /var/log/eucalyptus/iptables.`date +'%Y%m%d-%H%M%S'`.log

・ネットワークなどの情報(各CC/NCにて)

 前述のiptablesの情報に加え、各CC/NCのネットワーク情報を取得しておくことも重要です。仮にCCの物理マシンを再起動しなければならない状況に陥いったとしても、CCのネットワーク情報があれば手動でインスタンスへのアクセス経路を復活させることができます。一方でNCのネットワーク情報を元に手動で再構築しなければならない状況に陥いった場合はインスタンスを復旧できない確率も高いですが、それでも後述する方法によりインスタンスのデータだけは何とか確保しておいて手動で復旧させなければならないケースもあると思います。ネットワークの情報は以下のようにしてファイルに出力したり、コピーしておきます。

# CC/NC にて
[root@front ~]# ip addr show > /var/log/eucalyptus/ip-addr-show.`date +'%Y%m%d-%H%M%S'`.log
[root@front ~]# brctl show > /var/log/eucalyptus/brctl-show.`date +'%Y%m%d-%H%M%S'`.log

# CC にて
[root@front ~]# cp -a /var/run/eucalyptus/net/euca-dhcp.conf /var/log/eucalyptus/euca-dhcp.conf.`date +'%Y%m%d-%H%M%S'`.log

・インスタンスの一覧取得

アップデート作業によってインスタンスが停止していないことを確認するために、DescribeInstancesの一覧を取得しておきます(管理者権限のあるユーザーでeuca-describe-instancesを実行します)。なお、この情報から起動中(pending状態)のインスタンスがないかを確認しておきます。もし起動中のインスタンスがある場合は起動する(running状態になる)まで待ちます。

[root@front ~]# euca-describe-instances > /var/log/eucalyptus/euca-describe-instances.`date +'%Y%m%d-%H%M%S'`.log

・EBSボリュームとスナップショットの一覧取得

 アップデート作業を行なう前にEBSボリュームからのスナップショット作成が走っていないことを確認します。加えて、アップデート作業によってEBSボリュームやスナップショットが消えていないことを確認したり、インスタンスへ取り付けているEBSボリュームが外れていないことを確認します。

 これらの確認にはDescribeVolumesやDescribeSnapshotsの一覧を取得しておきます(管理者権限のあるユーザーでeuca-describe-volumesやeuca-describe-snapshotsを実行します)。もしボリュームやスナップショットが作成中(creating状態)である場合は作成が終るまで待ちます。

[root@front ~]# euca-describe-volumes > /var/log/eucalyptus/euca-describe-volumes.`date +'%Y%m%d-%H%M%S'`.log
[root@front ~]# euca-describe-snapshots > /var/log/eucalyptus/euca-describe-snapshots.`date +'%Y%m%d-%H%M%S'`.log

・SecurityGroupsの一覧取得

 アップデート作業によってSecurityGroupおよびSecurityGroupの設定が失なわれていないことを確認するために、DescribeGroupsの一覧を取得しておきます(管理者権限のあるユーザーでeuca-describe-groupsを実行します)。

[root@front ~]# euca-describe-groups > /var/log/eucalyptus/euca-describe-groups.`date +'%Y%m%d-%H%M%S'`.log

・マシンイメージの一覧取得

 アップデート作業によってマシンイメージが失なわれていないことを確認するために、DescribeImagesの一覧を取得しておきます(管理者権限のあるユーザーでeuca-describe-imagesを実行します)。

[root@front ~]# euca-describe-images > /var/log/eucalyptus/euca-describe-images.`date +'%Y%m%d-%H%M%S'`.log

 なお、上記の一覧取得の作業は、実際のアップデートを行なう直前に実施するのが望ましいです。

・インスタンスデータのバックアップ(各NCにて)

インスタンスのデータはNCの設定ファイル「/etc/eucalyptus/eucalyptus.conf」のINSTANCE_PATHで設定されています。よって以下のように実行することで値を環境変数に読み込んで利用することができます。

[root@node1 ~]# export `grep INSTANCE_PATH /etc/eucalyptus/eucalyptus.conf | tr -d '"'`
# CentOS版のEucalyptus 2.0.3の場合はデフォルトで/usr/local/eucalyptus/がインスタンスのデータを格納するディレクトリに設定されています。

 インスタンスデータは実ファイルをコピーしてもよいですが、サイズが大きいためディスク容量を必要としますしバックアップに時間もかかるため、ディスク容量や作業時間がない場合はリモートではなくローカルで以下のようにインスタンスデータを保全することができます。

[root@node1 ~]# mkdir -p ./eucalyptus.instances
[root@node1 ~]# for instance_data in `find ${INSTANCE_PATH} \
> -type f -name libvirt.xml -o -name instance-checkpoint \
> -o -name kernel -o -name ramdisk -o -name root \
> -o -name ephemeral -o -name swap | \
> grep -v 'eucalyptus/cache'`; do
> mkdir -p ./eucalyptus.instances`dirname ${instance_data}`;
> ln ${instance_data} ./eucalyptus.instances${instance_data};
> done

 上記コマンドはインスタンスデータのファイルをコピーせずにハードリンクを作成することで、もしアップデート作業中にインスタンスが停止したとしてもインスタンスのデータは「eucalyptus.instances」というディレクトリ配下に残ります。もちろん、事前にNCの設定ファイルでMANUAL_INSTANCES_CLEANUPに1を設定しているのであればこの作業は不要ですが、デバッグ時でもない限りこの値は設定していないと思います。

・ボリュームおよびスナップショットのバックアップ(各SCにて)

 ボリュームおよびスナップショットのデータは各SCの/var/lib/eucalyptus/volumes/配下にファイルとして格納されています。これらのデータもインスタンスデータ同様にサイズが大きくファイル数も多くなるデータですので、リモートにバックアップできないなどの場合には以下のようにローカルに保全することができます。

[root@front ~]# mkdir -p eucalyptus.volumes
[root@front ~]# for volume_data in `find /var/lib/eucalyptus/volumes/ -type f`; do
> mkdir -p ./eucalyptus.volumes`dirname ${volume_data}`;
> ln ${volume_data} ./eucalyptus.volumes${volume_data};
> done

・マシンイメージおよびバケット/オブジェクトのデータのバックアップ(Walrusにて)

 マシンイメージのデータやバケット/オブジェクトのデータはWalrusの/var/lib/eucalyptus/bukkits/配下に格納されています。ボリュームデータのバックアップ同様、以下の方法でローカルに保全することができます。

[root@front ~]# mkdir -p eucalyptus.bukkits
[root@front ~]# for object_data in `find /var/lib/eucalyptus/bukkits/ -type f`; do
> mkdir -p ./eucalyptus.bukkits`dirname ${object_data}`;
> ln ${object_data} ./eucalyptus.bukkits${object_data};
> done


CentOS 5.x 上の Eucalyptus 2.0.3 を 3.1 にアップグレードする

 アップデートする前に、Eucalyptus 2.0.3をyumでインストールできるようにレポジトリ情報を登録している環境の場合は、各マシンにて以下のように実行し、レポジトリに関する情報を消してください。

# 各マシンにて実行
[root@front ~]# rm -f /etc/yum.repos.d/euca*

・レポジトリ情報の登録

 各マシンにて以下のように実行し、新しいバージョンのレポジトリ情報を登録してください。

# CLC/NC にて実行
[root@front ~]# rpm -Uvh http://downloads.eucalyptus.com/software/euca2ools/2.1/centos/5/x86_64/euca2ools-release-2.1.noarch.rpm

# 各マシンにて実行
[root@front ~]# rpm -Uvh http://downloads.eucalyptus.com/software/eucalyptus/3.1/centos/5/x86_64/eucalyptus-release-3.1.noarch.rpm
[root@front ~]# rpm -Uvh http://downloads.eucalyptus.com/software/eucalyptus/3.1/centos/5/x86_64/epel-release-5.noarch.rpm
[root@front ~]# yum clean expire-cache


・各インスタンスの停止

 前述したように、残念ながらEucalyptus 2.0.3からEucalyptus 3.1へのアップデートでは活性アップデートは推奨されておりません。もちろん筆者も活性アップデートを試みてみましたが、アップデートによってインスタンス情報がCCのデータ上から消えてしまうため、アップデート後にEucalyptusが管理するDHCPサービスは既存のインスタンスへ払い出していたIPアドレスを保持せず、その結果インスタンスは期限が切れたIPアドレスを更新できず、更にCCのiptablesも既存インスタンスに関する情報を失なってしまうため、アップデート作業の数分後にインスタンスへのアクセスが不能になりました。

 CCのiptablesとdhcpを手動で設定すれば既存のインスタンスへのアクセスも可能ですが、Eucalyptusの情報からは既存のインスタンスに関する情報が消えているため、新たにインスタンスを起動しようとするとデータの不整合が発生します。よって、以下のように実行し各インスタンスを停止する必要があります。

[root@front ~]# euca-describe-instances | grep running | awk '{print $2}' | xargs euca-terminate-instances


・各サービスの停止

 全てのインスタンスを停止したら、以下のように実行し各サービスを停止します。ちなみに、各サービスを停止しなくともアップデート自体はできますが、前述のように2.0.3から3.1は活性アップデートが推奨されておりません。よって不測の事態を避けるためにもアップデート作業前に各サービスを停止します。

# CLC/Walrus/SCのサービス停止
[root@front ~]# /etc/init.d/eucalyptus-cloud stop

# CCのサービス停止
[root@front ~]# /etc/init.d/eucalyptus-cc stop

# NCのサービス停止
[root@node1 ~]# /etc/init.d/eucalyptus-nc stop


・パッケージのアップデート

 各マシンにて以下のように実行し、新しいバージョンのパッケージにアップデートしてください。なお、NCがEucalyptus環境外のネットワークに直接繋がっていない場合──つまりCCを経由して繋がっている場合はNCから先に以下のコマンドを実行してください。

[root@front ~]# yum update

・サービスの起動

 CLCのサービスを起動するとEucalyptusが保持している各種情報のアップデートが始まり、以下のような出力が表示されます。

[root@front ~]# /etc/init.d/eucalyptus-cloud start
Starting Eucalyptus services: Attempting database upgrade from 2.0.3 at /var/lib/eucalyptus/upgrade/eucalyptus.backup.1344361745...
#                           UPGRADE INFORMATION
#================================================================================
# Old Version:              2.0.3
# New Version:              3.1.0
# Upgrade keys:             false              using:
# Upgrade configuration:    false              using:
# Upgrade database:         true               using: upgrade_db
# Same version:             false              using:
# Start upgrading: db
Upgrading your database...
# Done upgrading:  db
done.
done.

 WalrusやSCをCLCとは別マシンで動かしている場合は、それらのサービスも上記同様に以下のコマンドで起動できます。

[root@front ~]# /etc/init.d/eucalyptus-cloud start

 次に以下のように実行し、CCのサービスを起動します。

[root@front ~]# /etc/init.d/eucalyptus-cc start
Starting Eucalyptus cluster controller: done.

 最後に以下のように実行し、NCのサービスを起動します。

[root@node1 ~]# /etc/init.d/eucalyptus-nc start
Starting Eucalyptus services: done.


次回はCentOS6とUbuntu12.04へのEucalyptus 3.1のインストールについて

 今回、アップデートする前のバックアップ取得について説明しましたが、このバックアップからデータを取り出す方法などについては解説しきれませんでしたので、次回はその方法について説明致します。
加えて、CentOS6やUbuntu12.04にEucalyptus 3.1を新規にインストールする方法についても紹介する予定です。

 


羽深 修
Eucalyptus歴はまだ1年ですが、周囲からはEucalyptus中毒と勘違いされているようです。Japan Eucalyptus User Groupの活動に参加し、オープンソースカンファレンスでネタなどを披露しています。度々Eucalyptusへのパッチも書いてます。ちなみに仕事ではCentOS + Xenという環境でEucalyptusを利用していますが、自宅のEucalyptus環境はGentoo Linux + KVMで動かしています。

志田 隆弘
主にEucalyptusやクラウドとはあまり関係のない分野でちょこちょこと活動していました。Eucalyptusはバージョン 1.3の頃からいじり始め、かれこれ2年近くEucalyptusに浸かった生活をしています。Eucalyptus 1.4が出たタイミングで、Tanacasinoという名前のGUIクライアントを作ったりしていました。最新のEucalyptusで動作するので、ぜひ使ってみてください。

田中 智文
志田さんとともに初期の頃からEucalyptusの調査・検証・使用してきました。志田さんの作成したTanacasinoのメンテナンスと機能拡張を行っています。新婚ほやほやなので家でのハック活動時間が少ないですが、Walrus Clientを作ってみたりbotoを使ってEucalyptusを操作して遊んでいます。

 

関連情報
(羽深 修/志田 隆弘/田中 智文)
2012/9/7 06:00