mondMondo Rescueは、Linux用のオープンソースなシステムバックアップソフトウェアです。


Mondo Rescue
Mondo Rescue is a GPL disaster recovery solution. It supports Linux (i386, x86_64, ia64) and FreeBSD (i386). It's packaged for multiple distributions (RedHat, RHEL, SuSE, SLES, Mandriva, Debian, Gentoo).

It supports tapes, disks, network and CD/DVD as backup media, multiple filesystems, LVM, software and hardware Raid.

バックアップには用途に応じていろいろな種類がありますが、Mondo Rescueは「OS環境とファイルなどシステムに関する全てのバックアップ」を行い、まっさらの状態からコンピューターをバックアップ時の状態に復元することができるツールです。これらのシステムバックアップは、「ディザスターリカバリー」「イメージバックアップ」と呼ばれることもあります。

今回、少し前に構築したCentOS 5のサーバーにMondo Rescueを導入し、バックアップとリストアを行ってみました。




バックアップの基本

Mondo Rescueの前に、ひとまずバックアップの基本的なお話を。


バックアップの対象

多くの場合、データはコンピューターの中でファイルとして保存されており、これを別の場所に複製して退避することがバックアップです。

ただし、RDBMSなどがデータ保存先としてファイルシステムを介さずにパーティションやディスクを使用している場合は、それに応じたバックアップが必要になります。また、RDBMSがデータ保存用に作成する巨大なファイルは実質上は単にデータの入れ物となっていて、一般的な意味でデータと言える粒度のものはファイルの中に独自フォーマットで保存されているため、これについても独自の対応が必要です。

加えて、ディスクのパーティションに関する情報(パーティションテーブル)はディスクの先頭部分(MBRやGPT)に保存されていますので、OS環境のバックアップを行う場合はこれらのバックアップも必要になります。

バックアップの注意点

どんなに小さなファイルでも、バックアップ(ファイルのコピー)には一定の時間がかかります。そのため、頻繁な更新があるファイルをバックアップした場合、以下のような問題が発生します。
  1. バックアップ中にファイルの内容が更新され、一貫性が保たれない。
  2. バックアップ中に一部のファイルが更新され、バックアップを行ったファイル同士の一貫性が保たれない。

「一貫性が保たれない」とは、ある部分についてはバックアップ開始時刻の時点の内容となり、別のある部分についてはバックアップ終了時刻の時点の内容となるような状況を意味します。バックアップ対象に更新が無ければそれらは同じ内容となり問題は起きませんが、更新がある場合にはファイル内やファイル同士が矛盾した状態でバックアップされてしまうことになります。

クライアントPCなどのように、あまりファイルが更新されない場合には上記のような問題はありませんので、いつでも自由にバックアップを行うことができます。

サーバーのように頻繁に更新されるファイルがある場合は、以下のような方法でバックアップを行います。
  1. コンピューターを停止してバックアップを行う。
  2. OSをシングルユーザーモード等で実行し、最小限のサービス状態でバックアップを行う。
  3. スナップショット機能を使用してバックアップを行う(LVM、外部ストレージ、仮想環境)。
  4. 通常のバックアップとは別に、頻繁に更新されるファイル専用の方法でバックアップを行う(ログの転送や、データベースの複製からのバックアップなど)。

更新頻度からみたバックアップ対象

前項で記載したように、更新があるファイルのバックアップには気を遣う必要がありますが、更新頻度の面から一般的なサーバーにおけるバックアップ対象を分類すると、以下のようなものになります。

No種別更新頻度バックアップ対象
1プログラム更新されない各種プログラム
2データ更新されない画像データなど
3データ設定ファイルなど
4データ頻繁ログファイル、作成中のドキュメントファイルなど
5データ常時ログファイル、データベースファイルなど

バックアップの方法

用途に応じて様々なバックアップが行われていますが、以下のような方法が代表的です。

Noバックアップ方法説明
1ファイルやフォルダ単位のバックアップ
  • 基本的なバックアップです。
  • 「cp, tar, rsync」などのコマンドが使用されます。
2ファイルシステム(ドライブ)単位のバックアップ
  • ファイルシステムの管理IDであるiノードを維持したバックアップです。
  • 「dump/restore, dd」などのコマンドが使用されます。 
3OS環境とファイルなどシステムに関する全てのバックアップ
  • コンピューターの全ての情報をバックアップします。「ディザスターリカバリー」や「イメージバックアップ」とも呼ばれます。
  • 「Mondo Rescue」をはじめ、多様なOSS・商用製品があります。
4データベースなど特定のアプリケーションのバックアップ
  • データベースやログに特化したバックアップ方法です。
  • MySQLやOracleなど、それぞれRDBMSに特化した方法があります。

バックアップ先

バックアップを行ったデータをどこに保存すべきかも重要です。これについても、用途に応じて選ぶ必要があります。

Noバックアップ先安全度保護対象備考
1同一ハードディスク1データ誤削除
2別ハードディスク2(上記+)
ハードディスク障害

3別サーバー3(上記+)
サーバー障害
サーバークラック

4別サーバー
(別の場所)
4〜(上記+)
災害〜大規模災害
バックアップ先のサーバーは、バックアップ元のサーバーから物理的な距離を離すほど、大きな災害にでも影響を受けにくくなります(東京と大阪など)。



Mondo Rescueによるシステムバックアップ

Mond Rescueでできること

Mond Rescueではシステム全体のバックアップを行うことができますが、前節で記載したように、更新があるファイルのバックアップにいろいろと制約があること自体は変わりません。

そのため、Mond Rescueによるバックアップは、以下のようなものとなります。
  • 更新が無いファイルについて、システム全体のバックアップを行うことができる。
  • 更新があるファイルについては、別途、適切な方法でバックアップを行う必要がある。

インストール

Mondo Rescueの公式サイトから下記のバイナリをダウンロードしてインストールします。
  • afio
  • buffer
  • mindi-busybox
  • mindi
  • mondo

インストールの様子。
# 依存パッケージのインストール
yum install mkisofs cdrecord

# ダウンロード
wget ftp://ftp.mondorescue.org/rhel/5/i386/afio-2.5-1.rhel5.i386.rpm
wget ftp://ftp.mondorescue.org/rhel/5/i386/buffer-1.19-4.rhel5.i386.rpm
wget ftp://ftp.mondorescue.org/rhel/5/i386/mindi-busybox-1.7.3-1.rhel5.i386.rpm
wget ftp://ftp.mondorescue.org/rhel/5/i386/mindi-2.0.7.7-1.rhel5.i386.rpm
wget ftp://ftp.mondorescue.org/rhel/5/i386/mondo-2.2.9.6-1.rhel5.i386.rpm

# 確認
ls -1
afio-2.5-1.rhel5.i386.rpm
buffer-1.19-4.rhel5.i386.rpm
mindi-2.0.7.7-1.rhel5.i386.rpm
mindi-busybox-1.7.3-1.rhel5.i386.rpm
mondo-2.2.9.6-1.rhel5.i386.rpm

# インストール
rpm -ivh ./*.rpm

バックアップ

Mondo Rescueの「mondoarchive」コマンドでバックアップを行います。オプションはこちらのサイトを参照。さらに詳しくは「man mondoarchive」にて。

緊急時に備えてリカバリDVDを作る(3/3) − @IT
オプション 機能
-O バックアップを実行
-V バックアップを検証
-E [ディレクトリ] バックアップ対象から除外するディレクトリを指定
-I バックアップ対象にディレクトリを追加
(初期設定では/)
-i バックアップ生成物をISOファイルにする
-p [名前] ISOファイルの名前を指定
-d [ディレクトリ/デバイス] バックアップイメージの出力先を指定
-s ISOファイルのサイズを指定
-A [コマンド] バックアップ前にコマンドを実行
-B [コマンド] バックアップ後にコマンドを実行
-S スクラッチディレクトリの指定
-T tmpディレクトリの指定
表 mondoarchiveコマンドの主要なオプション

バックアップの様子。
# バックアップ先 /mnt/backup
mondoarchive -Oi -d /mnt/backup -E /mnt -s 4480m -S /tmp -T /tmp -p `hostname`_`date +%Y%m%d`

Initializing...
See /var/log/mondoarchive.log for details of backup run.
Checking sanity of your Linux distribution
Done.
BusyBox's sources are available from http://www.busybox.net
Making catalog of files to be backed up
---evalcall---1--- Making catalog of /
---evalcall---2--- TASK: [*...................] 3% done; 1:04 to go
---evalcall---E---

(snip)

---evalcall---1--- Making catalog of /
---evalcall---2--- TASK: [********************] 98% done; 0:03 to go
---evalcall---E---
Done.
Dividing filelist into sets
Dividing filelist into sets. Please wait.
---evalcall---1--- Dividing filelist into sets
---evalcall---2--- TASK: [*...................] 3% done; 0:32 to go
---evalcall---E---

(snip)

---evalcall---1--- Dividing filelist into sets
---evalcall---2--- TASK: [********************] 99% done; 0:00 to go
---evalcall---E---
Your backup will probably occupy a single ISO. Maybe two.
Done.
Copying Mondo's core files to the scratch directory
Done.
Calling MINDI to create boot+data disks
Your boot loader is GRUB and it boots from /dev/hda
Waiting for 'echo hi > /tmp/mondo.tmp.q8aVJB/mojo-jojo.bla.bla ; mindi --custo
Boot+data disks were created OK
Done.
Preparing to archive your data
Done.
Archiving regular files to media
Archiving regular files
---progress-form---1--- I am backing up your live filesystem now.
---progress-form---2--- Please wait. This may take a couple of hours.
---progress-form---3--- Working...
---progress-form---E---
---progress-form---4--- TASK: [*...................] 1% done; 0:00 to go
---progress-form---1--- I am backing up your live filesystem now.
---progress-form---2--- ISO 1: [*...................] 1% used
---progress-form---3--- Please wait. This may take a couple of hours.
---progress-form---E---

(snip)

---progress-form---1--- I am backing up your live filesystem now.
---progress-form---2--- ISO 1: [****................] 17% used
---progress-form---3--- Please wait. This may take a couple of hours.
---progress-form---E---
---progress-form---4--- TASK: [********************] 100% done; 0:00 to go
Your regular files have been archived successfully.
Done.
Archiving large files to media
Done.
Writing any remaining data to media
Please be patient. Do not be alarmed by on-screen inactivity.
---evalcall---1--- Running mkisofs to make ISO #1
---evalcall---2--- TASK: [**..................] 6% done; 2:05 to go
---evalcall---E---

(snip)

---evalcall---1--- Running mkisofs to make ISO #1
---evalcall---2--- TASK: [********************] 99% done; 0:01 to go
---evalcall---E---
Call to mkisofs to make ISO (ISO #1) ...OK
Done.
Done.
Backup and/or verify ran to completion. Everything appears to be fine.
/var/cache/mindi/mondorescue.iso, a boot/utility CD, is available if you want it
Data archived OK.
Mondoarchive ran OK.
See /var/log/mondoarchive.log for details of backup run.
Execution run ended; result=0
Type 'less /var/log/mondoarchive.log' to see the output log

リストア

上記の方法によるバックアップが正常に終了すると、-dオプションで指定したディレクトリにisoファイルが作成されます。本来であれば、バックアップを行ったサーバーでリストアが可能かどうかを検証すべきではありますが、予備のHDDが無いと難しいため、VMware Playerで作成した仮想マシンにリストアを行いました。

バックアップを行ったサーバーはPATA (IDE)のハードディスクと光学ドライブを使用しているため、仮想マシンも同じ構成にしていますが、ディスク容量は少し大きなサイズで作成しました。

mond0
isoファイル光学ドライブに指定して起動。

下記のメッセージが表示されるので、「nuke」を入力。
  • To format and restore all files automatically, tipe 'nuke' <enter>
  • To restore some/all files interactively, type 'interactive' <enter>
  • To compare the archives with your filesystem, type 'compare' <enter>
  • To boot to a command-line promptl (expert mode), type 'expert' <enter>

mond1
ハードディスクの内容が消去されるので、中止したい場合は10秒以内に「Ctrl+Alt+Del 」を押して下さいというメッセージ。

mond2
リストア中のメッセージ。

残り97%で3分半程度と表示されていますが、実際には5分程度かかりました(再起動の前まで)。リストアにかかる時間はデータ量やサーバーの性能によって大きく変わるものと思います。

リストアの時間を短くするには、データ量を少なくすることと、使用するハードディスクのパーティションサイズを、不必要に大きくしないことでしょうか(フォーマットに時間がかかるため)。

mond3
状況表示です。
  • Partitioning hard drives    Done.
  • Formatting partitions    Done.
  • Mounting devices    Done.
  • Restoring OS and data from CD/USB
  • Restoring from archives    Done.
  • Reassembling large files

mond4
リストア完了のメッセージです。「OK」をクリックするとコマンドプロンプトが表示されます。

mond5
コマンドプロンプトが表示されました。
「Type 'exit' to reboot the PC」と書かれています。

mond6
よく読まずに「shutdown -r now」と入力してしまいましたが、問題無く再起動しました。

mond7
OSの起動画面です。

mond8
無事にOSが起動しました。

まとめ

今回のケースでは特別な問題もなく、無事にリストアが完了しました。

またリストア時間も非常に短く、リストア自体も全自動であるため、とても簡単です。

もし実際に重要なサーバーで障害が発生してリストアが必要になった場合、ハードディスク障害では無くても、ハードディスクを交換した上でリストアを行うのが良いと思います。そうすれば後から障害の原因究明が可能であり、また仮にリストアに失敗したとしても、元のハードディスクからデータを取り出すなどの対応ができるからです。

Mondo Rescueを使用してLinux/FreeBSDサーバーのシステムバックアップをしてみてはいかがでしょうか。

参考サイト