先日、今時ありえないが、某有名グループ企業のレンタルサーバ会社から・・・
「HDD逝ったからデータも逝きました。」
との驚きの報告を頂きました。
データが逝ったのは痛い。当然クライアントでバックアップはとっているのだが、リアルタイムで100%全てのデータのバックアップをとっているわけではないので、更新頻度の高いデータについてはバックアップがされていない部分が存在しました。
もう少しバックアップ頻度を上げておくべきでしたが、私的には「データが飛んだんで新しいサーバにデータをアップしなおしてくれ。」なんてことを言ってしまうレンタルサーバ会社のせいにしたいのと思うのは至極普通の感情だと思う。
その会社のエンジニアがRAIDという言葉を知らないとは思えないが、「目が点」とはまさにこのことである。
18時間近くサーバ自体止まった上に、データも飛んで、事後の対応も非常に遅く、言っていることも的を得ず、非常にバカな子供が発するいいわけのように感じ、「はいはい。」といった感じでサクッとDNSを書き換えて自前のサーバに引き込んで、その間に他のレンタルサーバを見繕ってしまいましたが・・・(笑)
自分史的には「大きな会社の前代未聞のお粗末」を体験し、非常に良い経験になりました。THX
で、自前のサーバだけでなく私は共用レンタルサーバも(最近安いし便利になってきましたし)活用しているのですが、自前サーバやVPSと違ってちょっと変わったことをしようとするとその制限に躓くことがあります。たとえばcronが使えないので・・・とかです。
レンタルサーバに置いてある更新頻度の高いデータはその更新頻度に応じてバックアップをとっておきたいですよね。しかし、標準でついているバックアップのオプションは意外と融通が利かないものが多いのではないでしょうか?
特に不特定多数のユーザが利用する掲示板や予約システムなどを動かしている場合はなるべくバックアップの頻度を増やして障害時のダメージを軽減したいですね。
レンタルサーバの標準のバックアップ機能は融通が利かない。cronが使えない。そんな時、こんな方法はいかがでしょうか?
まずは、こんな感じのCGIをサーバの適した場所に置く。
#!/usr/bin/perl
use Archive::Zip;
print "content-type: text/plain\n\n";
my $homedir = $ENV{'HOME'};
print $homedir;
unlink('./bak.zip');
# "保存パス", "圧縮ターゲットディレクトリ", "作成圧縮ファイル名"
my $zipfile = &ArchiveDir ("./", "./baktarget", "bak.zip");
sub ArchiveDir {
my $dir = $_[0];
my $dirname = $_[1];
my $zipfile = $_[2];
my $zip = Archive::Zip->new();
$zip->addTree($dir, $dirname);
$zip->writeToFileNamed("$dir/$zipfile");
}
レンタルサーバでありがちなパスが分からない?って場合はmy $homedir = $ENV{‘HOME’};といった感じでパスを見つけて使いましょう。このCGIでは$homedirをその後で使ってませんがね・・・
こんな感じでCGIを使って画像表示等をトリガーにしてバックアップさせるのもいいですね。
次にクライアントからこんな感じのシェルスクリプトをcronすれば自動バックアップできますね。
#!/bin/sh
cd /home/hogehoge/bak
wget http://fugafuga.com/bak.cgi
rm bak.cgi*
find ./ -name '*.zip' -mtime '7' -exec rm -f {} \;
wget http://fugafuga.com/bak.zip -O bak_`date +%Y%m%d_%H%M`.zip
この例ではwgetを使ってバックアップCGIを起動しています。
次にそいつの出力したファイルはいらないんで消して。7日前のファイルを消して、日付を付けてバックアップファイルを保存しています。
こうすればサーバでcronが使えなくてもクライアントのcronを使ってリモートで自動バックアップできますね。