効率の良いデータバックアップ方法の検討と試作 電気電子ネットワーク

効率の良いデータバックアップ方法の検討と試作
電気電子ネットワーク
池田茂 [email protected]
0.概要
確実に巨大化していくファイルサーバを「効率良く」
「簡単に」
「安全に」データをバックアッ
プする方法について検討し,データバックアップを自動で行うためのプログラムを試作した.
1.はじめに
データのバックアップは必要不可欠であることは言うまでもない.複数のハードディスで構築
した RAID であってもハードディスククラッシュ等の障害に強いというだけであって壊れない
保証はない.また,バックアップがあっても,データの復旧に使いにくかったり,バックアッ
プが失敗していたことに気付きにくい,あるいは気づかないのでは意味が無い.ここではフリ
ーソフトウェアとして配布されている pdumpfs を使い「効率良く」
「簡単に」
「安全に」バッ
クアップを行う方法を検討し,自動で行うためのスクリプトを試作する.
2.データのバックアップ
データのバックアップは一般的に「データを保存しているハードディスクのクラッシュ時の復
旧作業」のために行うが,ここでのデータバックアップにはクラッシュ時の復旧作業での使用
以外に「利用者の誤った作業によるデータの削除/上書きによるデータの消失が起きた場合の
復旧」行えるようなバックアップを行う.
3.過去のバックアップ方法と問題点
今までは,データバックアップに一般的によく使われている DDS(Digital Data Storage)に
UNIX の dump コマンドを使い,スクリプトを利用してパーティションごとに順番に実行して
いく方法をとっていた.長いサイクルで定期的にフルバックアップ(フルダンプ/Level0)を
実行,短いサイクルでフルバックアップからの差分データの差分バックアップ(差分ダンプ)
を実行し,1回のバックアップデータを減らし,なおかつハードディスクに障害が起った場合
にデータ復旧に使えるようにしていた.
この方法では
(a)DDS ドライブとテープメディアが消耗品であること
(b)テープ書き出し/読み出し時間が遅い
というデメリットがあり,(a)はドライブは保証期間内であれば交換可能だが,交換されるまで
は代替機でのバックアップ,保証期間が過ぎれば買い替え,もうしくは有償修理が必要になり,
メディアはバックアップサイズに応じたテープの本数(+交換用),定期的なドライブのヘッ
ドクリーニングが必要となる.(b)はデータサイズが大きければ大きいほどバックアップまたは
復旧に時間がかかることになる.
- 39 -
このように DDS などのテープを用いたバックアップでは,
・テープへの書き出しに時間がかかる
・ドライブ買い替え/消耗したテープの交換/テープメディアの補充
・テープ=消耗品(消耗しすぎるとバックアップデータが読めなくなる危険性)
・定期的なドライブのヘッドクリーニング(DDS の場合は)
がテープの特徴であると考えられ,
「効率良く」
「簡単に」「安全に」行うためには,
・高速なデータ書き出し/読み出し
・何度も書き込め,目に見えて消耗しない
・バックアップエラーの確認が簡単
・定期的なクリーニング不要
これらの改善が必要であると考えた.
4.バックアップ方法の改善
バックアップの高速化によく使われる方法として「テープへの書き出し」を「ハードディスク
への書き出し」に変更する方法があるが,それを行うための1つの方法として pdumpfs を使
う方法がありバックアップ方法の改善に最適であるため,pdumpfs を用いたバックアップを行
う方法を検討した.
5.pdumpfs について
pdumpfs は実行した時点でのスナップショットを他のディレクトリ(他のハードディスク)に
保存するプログラムである.スナップショットの保存ディレクトリは「年/月/日」となって
いるため,定期的に実行することにより,必要なときに日をさかのぼって,日付を指定して過
去のデータを取り出すことができる.
定期的なコピーをスナップショットとして保存していくと,簡単に巨大なサイズになってしま
うが,pdumpfs では UNIX のハードリンクを使いバックアップサイズの巨大化を抑えている.
ハードリンクであるため,pdumpfs でバックアップした過去の不要となったバックアップデー
タを削除しても,削除したバックアップデータをリンクして作成したバックアップデータは消
えることなくアクセスが可能となっている.バックアップのバージョン管理が容易に可能であ
る.(シンボリックリンクでは元が消えるとアクセスできなくなる)
6.バックアップスクリプトの改善点
pdumpfs を使うことにより
・ハードディスク to ハードディスクであるため高速なバックアップ
・スナップショットが保存できるため,日付指定での取り出しが可能
・バックアップ先としてディレクトリを指定するため他のハードディスクを指定
が行えるためバックアップ自体を「効率よく」「簡単に」行うことができる.
- 40 -
それだけでも十分であるが,
・バックアップエラーの通知
・1日に複数回のバックアップ(1日のバージョン管理)
・複数のディレクトリのバックアップ
これらを行うことができないため,追加機能としてスクリプト内に組み込むことにした.
(a)バックアップエラーの通知
定期的に自動で実行した場合にエラーが起った場合でもチェックを怠るとエラーが起
こったことにも気づかず,バックアップしているつもりでもバックアップされていない,
ということになってしまう.そのようなことを防ぐためにバックアップの後,エラーロ
グの確認も組み込む必要がある.
エラーログはエラーログファイルに書き出すように pdumpfs で指定でき,pdumpfs を
実行するとファイルサイズを0(ゼロ)で作成し,エラーがある場合のみエラーの内容
をメッセージにして出力される.つまり,エラーログファイルが0(ゼロ)であるか,
そうでないかでエラーが起きたか判断でき,プログラムで判定することも可能である.
これによりバックアップしていた「つもり」でバックアップできなかったということを
防ぎ「安全」なバックアップをすることが可能である.今回はプログラムでに判定した
エラーを電子メールで管理者に通知する機能も組み込み,管理者が「簡単に」バックア
ップエラーを確認することができるようにする.また,過去のバックアップログとエラ
ーログを参照できるよう,バックアップログもバックアップデータと同じように「年/
月/日」と階層的に保存するようにし,さらにバックアップごとにログを保存できるよ
うにバックアップ時間をディレクトリ名にして作成してログを保存するようにした.
(b)1 日に複数回のバックアップ
pdumpfs はバックアップ先ディレクトリとして「年/月/日」を作成するため同じ日に
2回以上実行しても同じディレクトリにバックアップデータを作るため,その日のバッ
クアップデータは,その日の一番最後に実行した時点でのデータとなってしまう.ここ
では1日に2回以上のバックアップを行えるようにするため,pdumpfs 実行前に「日」
のリネームをして古いバックアップを残すようにした.しかし,この方法では前日の最
後にバックアップしたデータとの差分バックアップを複数回実行することになり余分
にバックアップしてしまう.これを回避するためには pdumpfs を直接修正することが
必要となるため今回は省略し,今後の課題とした.
(c)複数のディレクトリのバックアップ
バックアップ対象を複数,バックアップ先を複数指定し,一度にバックアップを行う方
法を取ることに行うことで実現した.バックアップログ・エラーログのファイル名はプ
ログラム中でバックアップエントリごとに指定した.
- 41 -
7.試作結果
pdumpfs 本体 ver 0.6 http://namazu.org/~satoru/pdumpfs/
使用言語 perl 5.6.1 (ver 4 以下でも動作可能だと思われる)
試作プログラムでは次の点について手を加えた.
・1 日に複数回実行できる機能を追加
・pdumpfs の実行ログ/エラーログを実行毎ごとに保存する機能を追加
・エラーログのサイズからエラーを判定する機能を追加.
・エラーと判定された場合のみ管理者に電子メールで通知する機能を追加
以下が作成したプログラムである.
電子メール送信(&sendmail),日付/時間取得(&time)は別途用意し,サブルーチンにし
て読み込んでいる.
#!/usr/local/bin/perl
##########################################################
# pdumpfs-stu
# (c) 2002-2005 Shigeru Ikeda ([email protected])
##########################################################
# pdumpfs を使ったストレージバックアップのためのスクリプト
##########################################################
########################################################################
$PDUMPFS="/usr/local/sbin/pdumpfs"; # pdumpfs の絶対パス
$LOG[0]="/usr/local/share/etc/pdumpfs/logs"; # ログのトップディレクトリ
&time;
# $RAID[] : pdumpfs するディレクトリ
$RAID[1]="/home/disk0";
$RAID[1]="/home/disk1";
# $FALG[] : pdumpfs する(1)/しない(0)
# 最後の配列に 99 を入れる.
$FLAG[1]="1";
$FLAG[2]="1";
$FLAG[9]="99";
# $DUMP[] : pdumpfs する先
$DUMP[1]="/home/dump0";
$DUMP[2]="/home/dump1";
########################################################################
# デバッグ用フラグ
$DEBUG=0;
$DEBUG=$ARGV[0];
########################################################################
###############################
# ログ保存ディレクトリの作成
###############################
# 2004 年 7 月 28 日午前 3 時 15 分の場合のディレクトリ
# logdir/2004/07/28/0315/
$DATEDIR="$LOG[0]/20$year_bak/$month_bak/$day_bak/$hour_bak$minute_bak";
- 42 -
# 毎回時間が異なるのでディレクトリの有無の確認は必要無し
if($DEBUG==1) { printf("/bin/mkdir -p $DATEDIR¥n"); }
if($DEBUG==0) { system("/bin/mkdir -p $DATEDIR"); }
#######################
# ログ保存ファイル名
#######################
# $LOG[] : pdumpfs のログ
$LOG[1]="$DATEDIR/disk0-pdumpfs.log";
$LOG[2]="$DATEDIR/disk1-pdumpfs.log";
# $ELOG[] : pdumpfs のエラーログ
$ELOG[1]="$DATEDIR/disk0-pdumpfs.error-log";
$ELOG[2]="$DATEDIR/disk1-pdumpfs.error-log";
########################################################################
# 同じ日に 2 回以上バックアップするときは、前回のバックアップ先の
# ディレクトリをリネームする。
for($d=1;$FLAG[$d]!=99;$d++){
if($FLAG[$d]=="1"){
for($h=6;$h>=0;$h--){
$TMPDIR="$DUMP[$d]/20$year_bak/$month_bak";
$NUM=$h+1;
if($h==0){
if($DEBUG==1) {printf("cd $TMPDIR >/dev/null 2>/dev/null ;
mv $day_bak $day_bak-1 >/dev/null 2>/dev/null¥n¥n");}
if($DEBUG==0) {system("cd $TMPDIR >/dev/null 2>/dev/null ;
mv $day_bak $day_bak-1 >/dev/null 2>/dev/null");}
}
else {
if($DEBUG==1) {printf("cd $TMPDIR >/dev/null 2>/dev/null ;
mv $day_bak-$h $day_bak-$NUM >/dev/null 2>/dev/null¥n¥n");}
if($DEBUG==0) {system("cd $TMPDIR >/dev/null 2>/dev/null ;
mv $day_bak-$h $day_bak-$NUM >/dev/null 2>/dev/null");}
}
}
}
}
for($d=1;$FLAG[$d]!=99;$d++){
if($FLAG[$d]=="1"){
if($DEBUG==1) {printf("$PDUMPFS $RAID[$d] $DUMP[$d] >$LOG[$d] 2>$ELOG[$d]¥n");}
if($DEBUG==0) {system("$PDUMPFS $RAID[$d] $DUMP[$d] >$LOG[$d] 2>$ELOG[$d]");}
}
}
#########################
# 実行エラー有無の確認
#########################
####################################################
# エラーの有無 $ERROR= 0 or 1
# エラーログのサイズが 0(ゼロ)
: エラー無し
# エラーログのサイズが 0(ゼロ)ではない : エラー有り
####################################################
for($d=1;$FLAG[$d]!=99;$d++){
if($FLAG[$d]=="1"){
$ERROR[$d]=0; # エラーフラグ エラー有:1 エラー無:0
if($FLAG[$d]=="1"){
#サイズ確認
if( -s $ELOG[$d]){
$ERROR[$d]=1;
if($DEBUG==1){ printf("Error!!! %d $ELOG[$d]¥n"); }
}
}
- 43 -
}
}
$SUB="*** BACKUP ERROR!!! by pdumpfs-stu ***";
$SEND="ikeda¥@forest.eis.ynu.ac.jp";
# エラーはメールで送信
for($d=1;$FLAG[$d]!=99;$d++){
if($FLAG[$d]=="1"){
if($ERROR[$d]==1){
$TXT="$TXT¥n$DUMP[$d] : [ERROR]";
}
else {
$TXT="$TXT¥n$DUMP[$d] : [OK]";
}
}
}
# メール送信
if($DEBUG==0){ &sendmail; }
#
# END...
#
8.まとめ
pdumpfs で使うことにより
「ハードディスクのクラッシュ時の復旧作業」
「利用者の誤った作業によるデータの削除/上書きによるデータの消失が起きた場合の復旧」
が行えるバックアップを行うことができ,今回追加した機能により「7.試作結果」にあるよ
うな機能を追加することにより「効率良く」
「簡単に」
「安全に」なバックアップを行えるよう
になった.
9.課題
試作プログラムで実際に長期間,バックアップを行ってきたところいくつか問題点があった.
・4GB以上のデータファイルがある場合,エラーとなりバックアップ中断
・pdumpfs の性質上,ファイルサイズが大きなデータを扱う場合は,他のバックアップ対
象外のディレクトリに保存する必要がある.(他の手段でのバックアップが必要)
この点について調べたところ,pdumpfs の最新バージョン,pdumpfs で使っているスクリプ
ト言語の最新バージョンではこれらの問題を解決できそうである.
この他にバックアップ先ハードディスクが消耗品であることによるバックアップ先ハードデ
ィスクのクラッシュによりバックアップデータの消失の可能性があるという問題点もある.バ
ックアップ先を RAID 化することにより安全性を高めることができるがMO/DVDなどのよ
うな外部メディアのような安全性が無い.そのためバックアップ先の安全性も高める必要があ
るのではないかと考えられる.それらを含めて今後の課題として検討していきたい.
- 44 -