『FreeBSD』 ZFSでsnapshotを取ってzfs send/recvしてバックアップを作成する

ようやくファイルサーバーの移行が終わりました。

ZFSでsnapshotを取ることで履歴を残すことができるようになりました。
これで間違ってファイルを消しちゃった場合でも復活できる可能性があります。

とは言っても、Diskが2台壊れたらデータは吹っ飛びますので念のため他のディスクやマシンにバックアップを取っておく必要があります。
今まではrsyncを使ってバックアップを取っていましたが、ZFSではsnapshotを使ってバックアップを取ることができます。

vol1/hoge@backup0ってスナップショットがあった場合、バックアップ先をvol2/hogeとしたとき、zfs send/recvコマンドを使って次の手順でバックアップがとれます。

# zfs send vol1/hoge@backup0 | zfs recv vol2/hoge

vol2/hogeが既に存在している場合では、-Fオプションをつける必要があったような気がします(その様な場面があった)。

1回バックアップを取ってしまったら次からは差分を送るだけなので時間が短く済みます。
次のスナップショットをvol1/hoge@backup1とすると、

# zfs send -i vol1/hoge@backup1 vol1/hoge@backup0 | zfs recv vol2/hoge

で差分バックアップできます。
これだと、snapshotの履歴もバックアップ先に残るので色々と便利です。

注意点としては、バックアップ先に変更があればzfs send/recvでバックアップはとれません。
atimeを無効にしたのは、ファイルに変更が入ったら困るからです。

もし、ファイルに変更が入ってバックアップがとれなくなったときは、rollbackしてからコマンドを実行します。
#zfs recv -F とすればロールバックもしてくれるらしいのですが、未確認です。

2014/10/26追記
atimeを無効にしてもファイルに修正が入ったので、-Fオプションをつけてzfs recvを試したところ、ちゃんとrollbackしてバックアップをとれました。
スクリプトも修正しています
追記ここまで

以上を踏まえてバックアップの方針を次の通りにしました。
○1時間ごとにsnapshotを取ったらそのままバックアップする
これが一番楽&確実なのです。

前に作成したzfs_snapshot_hourlyをrubyスクリプトにしてバックアップの分も追加しました。
[ruby]
#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-

#snapshot作成
now = Time.now
now_str = now.strftime(“%Y%m%d-%H%M”)

require “open3”

stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs snapshot -r vol1/pub1@’+now_str)
stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs snapshot -r vol1/pub2@’+now_str)

#バックアップ作成
stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs list -o name -S creation -t snapshot’)
snapshot_list = stdin.split(“n”)
snapshot_list.delete_at(0)

def extract_target_snapshot_list(list, target_name)
l = Array.new
list.each do |s|
if s.include?(target_name) then
l.push(s)
end
end
return l
end

pub1_snapshot_list = Array.new
pub1_snapshot_list = extract_target_snapshot_list(snapshot_list,”vol1/pub1@”)

#ソートして結果の先頭が一番新しいsnapshot
pub1_snapshot_list.sort

stdin,stdout,stderr = Open3.capture2(‘/sbin/zfs send -i ‘+ pub1_snapshot_list[1] + ‘ ‘ + pub1_snapshot_list[0] + ‘ | /sbin/zfs recv -F vol2/pub1’)
[/ruby]

FreeBSDのperiodicの仕組みがよく解っていないので、snapshot関係のスクリプトはrootのcrontabに設定して実行させています。

サーバー移行を振り返ってみて、FreeBSDはあまり触りたくは無かったけれども何とかなったなと思いました。

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 78,390

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です