MD5でファイルの同期チェック
Webアプリケーションを使ってサービスを展開していると、負荷や障害に備えて、
Web サーバの冗長化(クラスタ化)を検討するようになると思います。
冗長化することによって、Web サーバへのアクセスが分散されて、
1 台当たりの負荷が軽減しますし、複数台あるサーバの内、
1 台が壊れてもサービスを継続することができます。
っと、冗長化するメリットは非常に多いのですが、デメリットもあります。
パっと思いつく範囲で、例えば下記のようなことがあります。
[1] すべてのサーバに目的のファイルが配備されているか
[2] サーバ上のデータが改竄されていないか
[3] ロードバランサ(既製品やLVSなど)の導入や運用
そこで、今回は [1] と [2] の部分について簡単なチェックをしてみることにしました。
対象とするのは、Web サーバで動的に生成され、全部のサーバに
配備されるようなファイルとします。
複数台のサーバで同じデータを取り扱う場合は、NFS などの仕組みを
利用するのがベターですが、NFS へのアクセス集中やフェイルオーバーなど
こちらも検討する事項は多いです。これについては、別の機会でお話できればと思います。
では、本題に入ります。
サーバ間のファイルの同期をする場合、rsync などのリモートコピーができるコマンドを
使用する機会が多いと思います。ファイルサイズの違いや変更されたファイルなど、
差分の確認が取れ便利です。
しかし、サーバの台数が増えるとファイルの同期はともかく、定期的に
簡易なファイルチェックをするには負荷コストが気になります。
(ssh の接続コストも含めて)
上記を考慮すると、まずは単体のサーバでファイルをリストアップし、
それのハッシュ値を取って、サーバ間で比較するのがやさしそうです。
ハッシュ値と言えば、md5 や sha1 が一般的です。
md5 のハッシュ値は 128bit、SHA1 は 160bit なので、sha1 の方が強固ですが、
今回は強度を考慮する必要がない場面なので md5 を利用することにします。
現在のディレクトリ配下のファイルの md5 を取得してみます。
$ find . -type f -print | xargs md5MD5 (./hoge1_data.dat) = 53e27bbfe455385f1a4be648987a2473
MD5 (./hoge2_data.dat) = 52c4c8cb45262e3943bc9f1bec63117f
MD5 (./hoge3_data.dat) = dcca48101505dd86b703689a604fe3c4
MD5 (./hoge4_data.dat) = 0cda462ecafcfe65a6121c5446278cea
MD5 (./hoge5_data.dat) = 652fdb47405c0a6b5ed851ed94a178c9
・
・
・
MD5 (./hoge100_data.dat) = dcca48101505dd86b703689a604fe3c4
これで、各ファイルのハッシュ値が取得できます。
さらに、これらのリストのハッシュ値を取ってしまえば、
比較する文字列が 1 つで済むようになります。
$ find . -type f -print | xargs md5 | md5f70ab1ae5a8311ef1cf11796d50d6229
あとは、サービスを提供している環境を考慮して
全サーバの同期を確認できる仕組みを作るだけです。
各サーバ間の接続コストが気になる場合は、ハッシュ値を
特定のアドレスにメールで送り、メールサーバ側のプログラムで
一元管理するのもいいと思います。
メール送信時にハッシュ値が改竄されると意味ないので、
メールの送信経路を SSL 化するなどの配慮も必要になってきますが・・・。
今回は、md5 による簡単なチェックを紹介しましたが、
もっと手軽で効率がいいようなチェック方法があれば、
ぜひご教授願えればと思います。

