水曜日 3 25, 2009
水曜日 3 25, 2009
皆さんはzfsで作ったファイルシステムをどのようにバックアップしていますか? 最近ではテープというデバイス (単体のテープドライブ、テープ・オートローダ、テープ・ライブラリ)は古くさく、 過去のものという考えを持った人が多くなってきていると思いますが、 私はまだ価値があると思っています。 簡単にオフラインの場所に保管できるとか(例えば遠隔地や耐火金庫に入れるとか)、 保管できるデータの量とそれに要する場所の大きさとかいろいろ利点があります。 また、速度も各世代でディスクに対して結構高速です ( sustained data rate of 120MB./sec for LTO4 / T10000 )。 ソフトウエアは会社において私は(部門のサーバとして) Sun StorageTek Enterprise Backup Software を使っています。 特にバージョン7.3以降はzfsをサポートしており、なかなか快調です。 現在私の書いたちょっとしたスクリプトを使って、 直接使用中のファイルシステムではなくスナップショットからとるように運用しています (これは2年くらい前にやったことで、最新のSun StorageTek Enterprise Backup Software ではもっとスマートにできるようになっているかもしれません)。
このSun StorageTek Enterprise Backup Softwareは実際良くできていて、 使いやすく、かつパワフルです。 しかし、無料ではありませんし、小さな組織における小さなサーバでは大げさすぎるかもしれません。 あるいは、定期的にはとらないけど、なにか特別な理由で1回だけとりたい場合などにも適さないかもしれません。 そういった場合今まではufsdump/ufsrestoreがとても役に立ってくれました。 当然完璧ではありませんが(もっと早くなってほしいですね、特にディレクトリ関連は)、 十分であり、差分のバックアップも効率よくやってくれます。 そうはいってもufsdumpというくらいで、これはufsだけに有効なコマンドで、 zfsには少なくともこれに直接変わるコマンドはありません。 zfsのスナップショット機能はとても強力で、間違えて消してしまったファイルや、古いバージョンの ファイルを復活させるのには大変便利です。 しかし、すべて同じディスクのプール内だけで行われることです。 zfsのsend/recieveはかなり期待が持てそうですが、 ufsdump/ufsrestoreのように複数のテープに書き出す機能がありません (もともと媒体に書き出すために設計しているわけでないので)。 GNUのtar(gtar)には複数のテープを扱う機能があるようですが、どうも、 手動で切り替える場合だけで、オートローダに対応していないようです。
さて、ではどうすればよいのでしょうか? gtarを改造しますか? でもそれではtarの書式しかサポートできません。 うーん、Unixのプログラマーらしい発想をしてみたいと思います。 複数のテープをサポートする機能はもっと一般的な機能として実現するべきではないかと思います。 そうですね、古くからもともとテープを扱うために作られたコマンドがありますね、ddです。 ということで、ddをおもしろ半分の気持ちで試しに改造してみました。 ddはOpenSolarisのプロジェクトの一環としてオープンソース化されていますので、 ソースコード は簡単に手に入ります。 まあ、私がCのプログラムを書くなんていうのはかなりしばらくぶりなので、腕はさび付いていますが、 なんとか動く物ができました。
参考までに私のやった変更を ここに 載せておきました。 もし、興味がおありでしたら次のステップで試してみてください。
そしてコンパイルします。$ cd ${SRC} $ cd usr/src/cmd/dd $ patch dd.c < dd_mtv.patch
自動的にテープドライブかどうか判断したりする方法もあるかもしれませんが、 結果が正確でないかもしれませんし、 その結果とんでもないことが起こるかもしれないと思い、 私はオプションで指定するように作りました。 使い方の例です:
- ial[=n]
- Input being AutoLoader. 入力が(if)がオートローダであることを指定します。 オプションでオートローダがロードする時間nが指定できますが、 省略すると180秒になります。
- oal[=n]
- Output being AutoLoader. 出力が(of)がオートローダであることを指定します。 オプションでオートローダがロードする時間nが指定できますが、 省略すると180秒になります。
一応この改造版はSPARCの上で StorEdge L280 with DLT7000 drive (ただし、このオートローダはすでに外して使わなくなったので、最近テストしていません), と StorageTek L20 with LTO2 drive で試しています。# zfs send rpool/export/home@backup | dd oal of=/dev/rmt/0cbn obs=2048b
最後に将来の希望をリストすると (:-p):
* ミキサー。
* マルチスレッド。
はAmandaでも実現されています。
* 記録をとる。何時何を何処に書いたのか。
amanda のzfs sendは現状フルダンプなので、何時はとれます。zfs sendで何をダンプしたか分かると何を書いたかは分かるかもしれません。
どこに書いたかはちゃんと記録しています。
Posted by Michitoshi Sato on 3月月 25日, 2009年 at 08:08 午後 JST #
Amanda2.6.1からZFS sendに対応しました。
# ミキサー。
# マルチスレッド。
はHoldingdiskを使って実現しています。ただし、同一クライアントからは一度には一つのストリームしかバックアップをとらないようになっているので同一ホストを違う名前で複数登録するなどの細工が必要です。
# 記録をとる。
はZFS sendで何がバックアップされているか知る方法が有れば可能です。
ちなみに、ufsdump/gtarの場合はufsrestore/gtarでストリームからバックアップされた内容を抽出してカタログとして記録しています。
Posted by Michitoshi Sato on 3月月 25日, 2009年 at 08:27 午後 JST #
早速のコメントありがとうございます。
やっぱりAmandaはそのくらいのことは
やっているのですね。使ってみようかな?
Posted by Akira Ohsone on 3月月 25日, 2009年 at 08:28 午後 JST #