
OpenZFSは素晴らしい-うっかり消した70Gを一瞬で復旧
いつもアクセスありがとうございます。匠技術研究所の谷山 亮治です。
今回は「OpenZFSは素晴らしい-うっかり消した70Gを一瞬で復旧」です。
匠技術研究所ではOpenZFSの実用実装に取り組んでいます。OpenZFSとは、OpenSolarisに実装されたZFSファイルシステムを源流とするオープンソースの新世代ファイルシステムです。もうだいぶん前ですが、OpenSolarisのZFSでWindows用のファイルサーバーを構築し、納品したことがありました。堅牢で利用終了まで4年ほどでしょうか、ノントラブルで動きました。今はOpenZFSをLinux上に実装した、zfsonlinux.orgの成果を活用しており、ファイルサーバーのバックエンドとして利用を開始しています。
ZFSにして何が良いかというと、大容量バックアップがスナップショット(snapshot)で簡単かつ極短時間にできることです。そして、スナップショットを撮った状態に「簡単かつ短時間に戻す」ことができます。これは、素晴らしいことです。
ファイルサーバーで、外部ディスクにバックアップを取っています。外部ディスクに元データをコピーする段階で、外部ディスク側のディレクトリ指定を間違い、一つ深い階層にコピーをしていました。
/zback/cbk/dir/...
を
/zback/cbk/dir/dir/...
の形です。
実は、ここに正しい階層関係で差分バックアップを試みたところ「どんどん書き込む」ので「間違った!」と思ってみたところ、
$ ls /zback/cbk/dir
shares
dir
のように、正しいsharesと間違ったdirが見えたのです。差分バックアップ時に「階層の指定を間違ったな」と思い、
$ rm -r dir
を実行。
すぐ終わるはずが終わりません。「USB2.0だし時間がかかっているな」と思い込み、しばらくしてからdfで容量を確認すると、すでに60Gほど少なくなっています。「あれれっ!そんなに消えるはずがない。間違った、こっちが本当のバックアップだった」と、210Gほどのバックアップ領域が140Gに減っていました。
どこまで消したか判らないので「全部消して作り直す」ことも考えました。昨日のコピーに要した時間を考えると「一晩かかる」ことになります。このときはZFSであることを忘れており、時間を短縮するには「rsyncによる上書き復旧」くらいしか思いつかなったのです。
ふと「バックアップコピー完了時にスナップショットを撮ったな」と「スナップショット」を思い出しました。「スナップショットの時点に戻れば、重ね書きの前の状態なのでむしろ好都合」です。「ロールバックしてみよう」。「ロールバック」とは、ファイルシステムをスナップショットを撮った時点に戻す機能です。
「消すのにあれだけ時間がかかったので、ロールバックも時間がかかるだろうなぁ」と思いつつ、コマンドを打つと「あっ!」。「じんわり実行した程度の時間」1~2数秒で復旧しました。びっくりです。
これまで、小さな試験環境で試していたロールバック機能ですが、今回のように210Gから70Gほど失い、おおよそ1/3ほどファイルを失っても「ほんの数秒」で回復することができました。これはLinux/ext4など従来型のファイルシステムでは想像もつかないことです。素晴らしい!
ZFSはスナップショット取得後の、自身の変更履歴を保持しています。そのため、今回のように「うっかり消しても」内部的に「こっそり持っている」のです。ロールバックはこっそり持っている部分を見えるようにする機能なので、復旧も一瞬だったのです。まさにZFSのスナップショットの良さが判る経験でした。