web-dev-qa-db-ja.com

初心者ZFSストレージプールのバックアップ

データの整合性とチェックサム、重複排除、スナップショットなどのZFS機能を利用するために、個人のホームデータをDebianPC上のZFSに移動することを検討しています。ボックスは単なるNAS以上のものでなければならないので、私はボックスをFreeNASのようなものに捧げることには興味がありません。

そうすることで、データを毎晩バックアップし、定期的にオフサイトに持ち出す方法についても考えています。私の現在の設定については、この投稿の後半で説明します。以下に説明するバックアップの3番目のアプローチに関する賛否両論をいただければ幸いです。

(1)私はZFSに慣れていないので、ライブデータをZFSプールに入れて安全にプレイすることを検討していますが、Dirvishを使用してそのデータを非ZFSバックアップドライブにバックアップし続けています。

(2)1時間ごとのスナップショットと同じくらい頻繁になる可能性のある定期的なスナップショットのcronジョブの設定についても学びました。そのため、1時間ごとまたは1日ごとのスナップショットを取得し、に送受信するライブデータドライブを設定することを考えました。 ZFS用にフォーマットされたバックアップドライブ。

(3)最後に、最近、ZFSでこれほど複雑なことをする必要がないかもしれないことに気づきました。 RAID1と同様のミラーリングされたvdev構成で2つのドライブをセットアップしてから、1時間ごとのスナップショットをセットアップするとどうなりますか?このように、私は瞬時にバックアップを取り、恐ろしいRAID-is-not-a-backupから保護されているようです。

/bin/rm -Rf /*

#3では、いずれかのドライブがダウンした場合でも、続行できるミラーを使用できます。以下で説明するように、私はRAIDの高可用性がなくても生活できますが、この場合は無料で入手できるようです。

私が抱く唯一の懸念は、以下に説明するオフラインのオフサイトドライブです。数週間または数か月前のスペアを使用して、ミラーリングされた1台のドライブを定期的にローテーションするのは問題ですか?

私の現在のセットアップに関しては、私は現在、おそらく通常のext3パーティションのUbuntuボックスにすべてを保持しています。私はもうRAIDを使用していません。高可用性に対する個人的なニーズはありません。問題が発生した場合は、バックアップから復元する時間があります。

私はdirvishを使用して、データ、ラップトップ、その他の価値のあるものを毎晩バックアップし、スナップショットは約2か月前にさかのぼります。

定期的にバックアップドライブをローテーションして、オフサイトおよびオフラインにできるようにしています。プライマリドライブとライブバックアップドライブを紛失した場合でも、少なくとも数週間経ってもオフサイトドライブを使用できます。

ドライブのアレイを維持することは考えていません。すべてのデータ用に1つのドライブを使用し、バックアップ全体用に別の1つのドライブを使用したいと思います。これにより、現在接続されているバックアップドライブを使用して、単一のオフサイトバックアップドライブを定期的にローテーションすることが簡単になります。

ありがとう。

編集:ここで説明するコマンドを使用してインストールされたLinux上でZFSを使用してDebianを実行するVM VM $ ===

http://www.bsdnow.tv/tutorials/zfs

3つのディスクをシミュレートするために、3つのファイルを作成することから始めました。

# cd /mnt/sda3
# truncate -s 2G primary
# truncate -s 2G rotating_mirror1
# truncate -s 2G rotating_mirror2

前述のように、ミラーファイルの1つだけを使用してミラープールを作成しました。

# zpool create mypool mirror /mnt/sda3/primary /mnt/sda3/rotating_mirror1
# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool   106K  1.95G    30K  /mypool
# zpool status -v mypool
  pool: mypool
 state: ONLINE
  scan: none requested
config:

    NAME                            STATE     READ WRITE CKSUM
    mypool                          ONLINE       0     0     0
      mirror-0                      ONLINE       0     0     0
        /mnt/sda3/primary           ONLINE       0     0     0
        /mnt/sda3/rotating_mirror1  ONLINE       0     0     0

errors: No known data errors

次に、ここで参照されているスクリプトを使用して自動スナップショットを設定してみました。

http://alblue.bandlem.com/2008/11/crontab-generated-zfs-snapshots.html

Root用のcrontabファイルを作成しました:

# crontab -e

上記のリンクから以下に貼り付けて変更しました。私はcronの専門家ではないので、これに競合状態があるのではないかと思います。

@reboot /sbin/zpool scrub mypool
@daily  /sbin/zpool scrub mypool
@hourly /sbin/zpool status mypool | /bin/egrep -q "scrub completed|none requested" && /sbin/zfs snapshot -r mypool@AutoH-`date +"\%FT\%H:\%M"`
@daily  /sbin/zfs snapshot -r mypool@AutoD-`date +"\%F"`
@weekly /sbin/zfs snapshot -r mypool@AutoW-`date +"\%Y-\%U"`
@monthly /sbin/zfs snapshot -r mypool@AutoM-`date +"\%Y-\%m"`
@yearly /sbin/zfs snapshot -r mypool@AutoY-`date +"\%Y"`
# do a spot of housecleaning - somewhat assumes the daily ones have run ..
@hourly /sbin/zpool status mypool | /bin/egrep -q "scrub completed|none requested" && /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoH- | /usr/bin/sort -r | /usr/bin/tail -n +26 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
@daily  /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoD- | /usr/bin/sort -r | /usr/bin/tail -n +9 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
@weekly /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoW- | /usr/bin/sort -r | /usr/bin/tail -n +7 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r
@monthly /sbin/zfs list -t snapshot -o name | /bin/grep mypool@AutoM- | /usr/bin/sort -r | /usr/bin/tail -n +14 | /usr/bin/xargs -n 1 /sbin/zfs destroy -r

これで2か月のバックアップが得られるとは思いませんが、それは始まりです。

この時点で、最初のリンクの例を試して、ファイルを作成し、スナップショットを作成してから、ファイルを変更しました。

Jlliagreの推奨を続けて、rotating_mirror1を交換し、rotating_mirror2に置き換えたいと思いました。 (実際のボックスでは、ボックスの電源を切り、SATA mirror1ドライブを取り外して、代わりにmirror2ドライブと交換することを期待しています。)

# zpool split mypool mypool_bak /mnt/sda3/rotating_mirror1
# zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

    NAME                 STATE     READ WRITE CKSUM
    mypool               ONLINE       0     0     0
      /mnt/sda3/primary  ONLINE       0     0     0

errors: No known data errors

この時点で、私はいくつかの問題に直面しました。 mypool_bakをインポートすることも、rotating_mirror1で他に何もすることもできませんでした。最終的にmypool_bakを作成しようとしましたが、そこに何も入っていないことがわかり、それを破棄してから、rotating_mirror1をプライマリにアタッチし直しました。

# zpool create -f mypool_bak /mnt/sda3/rotating_mirror1
# zpool destroy mypool_bak
# zpool attach mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror1 

この時点でrotating_mirror1がprimaryへの変更と同期していると純粋に想定しています。

私は再び分割しようとしました:

# zpool split mypool mypool2 /mnt/sda3/rotating_mirror1

再び同じ問題なので、私は再添付しました:

# zpool attach -f mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror1

-Rオプションを使用して再試行しました。これはうまくいったようです:

# zpool split -R /mypool2a mypool mypool2 /mnt/sda3/rotating_mirror1
# ls /mypool2a/mypool2/
file1.txt  file2.txt  file3.txt  somefile
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 566K in 0h0m with 0 errors on Wed Dec  3 00:18:28 2014
config:

    NAME                 STATE     READ WRITE CKSUM
    mypool               ONLINE       0     0     0
      /mnt/sda3/primary  ONLINE       0     0     0

errors: No known data errors

  pool: mypool2
 state: ONLINE
  scan: resilvered 566K in 0h0m with 0 errors on Wed Dec  3 00:18:28 2014
config:

    NAME                          STATE     READ WRITE CKSUM
    mypool2                       ONLINE       0     0     0
      /mnt/sda3/rotating_mirror1  ONLINE       0     0     0

errors: No known data errors

次:

# zpool export mypool2
# rmdir /mypool2a

これでrotating_mirror2を取り込むことができるようになりました。

# zpool attach mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror2
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 524K in 0h0m with 0 errors on Wed Dec  3 00:25:36 2014
config:

    NAME                            STATE     READ WRITE CKSUM
    mypool                          ONLINE       0     0     0
      mirror-0                      ONLINE       0     0     0
        /mnt/sda3/primary           ONLINE       0     0     0
        /mnt/sda3/rotating_mirror2  ONLINE       0     0     0

errors: No known data errors

この時点で、時間の経過とともに使用されているディスクをシミュレートするために、さらにいくつかのファイルとスナップショットを作成しました。

ここでrotating_mirror2を削除したかったのですが、rotating_mirror1を元に戻したくありませんでした。

# zpool split -R /mypool2a mypool mypool2 /mnt/sda3/rotating_mirror2
# zpool export mypool2
# rmdir /mypool2a

この時点でrotating_mirror1を元に戻そうとすると、その内容がすべて破棄され、現在のプライマリがrotating_mirror1にミラーリングされると思います。

代わりに、プライマリがダウンし、この時点でrotating_mirror1から復元する必要がある場合はどうなりますか?プライマリを再構築するためにrotating_mirror1を使用するにはどうすればよいですか?

# zpool destroy mypool
# zpool import -d /mnt/sda3/ -N mypool2 mypool
# zpool status
  pool: mypool
 state: ONLINE
  scan: resilvered 524K in 0h0m with 0 errors on Wed Dec  3 00:25:36 2014
config:

    NAME                          STATE     READ WRITE CKSUM
    mypool                        ONLINE       0     0     0
      /mnt/sda3/rotating_mirror1  ONLINE       0     0     0

errors: No known data errors
# zfs set mountpoint=/mypool mypool
# ls /mypool

おかしい。この時点で、最初のミラーにあるファイルが表示されると思っていましたが、代わりに何も表示されません。

編集:手順を最初からやり直し、もう少し知ったので、いくつかの小さな調整を行いました。以下のすべての手順を実行したわけではありませんが、完全を期すためにすべてここにあります。今回は手に入れたと思います。

# cd /mnt/sda3
# truncate -s 2G primary
# truncate -s 2G rotating_mirror1
# truncate -s 2G rotating_mirror2
# zpool create mypool mirror /mnt/sda3/primary /mnt/sda3/rotating_mirror1
# crontab -e
# echo (Paste crontab snippet from above.)

プールを使用します。

# echo QUESTION Should a snapshot be created here?
# zpool split -R /mypool2 mypool mypool2 /mnt/sda3/rotating_mirror1
# zpool export mypool2
# rmdir /mypool2
# zpool attach mypool /mnt/sda3/primary /mnt/sda3/rotating_mirror2

プールをもう少し使用します。

# echo QUESTION Should a snapshot be created here?
# zpool split -R /mypool2 mypool mypool2 /mnt/sda3/rotating_mirror2
# zpool export mypool2
# rmdir /mypool2

Mypoolに対して、再作成する必要があるほど悪いことをします。

# echo QUESTION Should a backup of rotating_mirror2 be made prior to restoration in case something bad happens, or is there any way to bring in its contents read-only?
# zpool export mypool
# zpool import -d /mnt/sda3/ mypool2 mypool
# zpool attach mypool /mnt/sda3/rotating_mirror2 /mnt/sda3/primary

Importコマンドが実行されると、primaryとrotating_mirror2の両方がプールに対して同じ名前を持つため、この例の後続のimportコマンドは上記のように機能しないことに注意してください。代わりに、プールは数値IDでインポートする必要があります。

# zpool import -d /mnt/sda3/
   pool: mypool
     id: 17080681945292377797
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

    mypool                        ONLINE
      /mnt/sda3/rotating_mirror2  ONLINE

   pool: mypool
     id: 4810117573923218177
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

    mypool               ONLINE
      /mnt/sda3/primary  ONLINE

# zpool import -d /mnt/sda3/ 4810117573923218177
# zpool export mypool
# zpool import -d /mnt/sda3/ 17080681945292377797

ただし、正直なところ、プール名が変更されたためにミラーをインポートするとミラーが変更され、プライマリの再構築中にミラーがライブで変更できるようになったため、これは少し汚い感じがします。

ミラーとしては問題ないことは理解できますが、これらのミラーが「プラグイン」されている場合は、これらのミラーをライブバックアップとして扱いたいことを思い出してください。

私はこれを試していませんが、異議がない場合は、rotating_mirror2をインポートせずに、次のようなことをしたいと思います。

# dd if=/mnt/sda3/rotating_mirror2 of=/mnt/sda3/primary bs=...

それが終わったら、プライマリを直接インポートできて、みんなが幸せになることを願っています。

最後の注意点:複数のミラーを使用できることを学びました。したがって、本当に必要な場合は、3つではなく4つのドライブをセットアップして、2つが常にライブの「プライマリ」ミラーであり、rotating_mirror1とrotating_mirror2を使用することができます。 2番目のドライブではなく3番目のドライブになります。

ありがとう。

3
jia103

1:ZFSの冗長性が必要ない場合は、次のことができます。

  • 最初のディスクをアクティブプールとして使用します。
  • スナップショットをスケジュールして、rm -rfのような人的エラーが発生した場合に迅速にロールバックできるようにします。
  • 2番目のディスクにバックアッププールを作成します
  • 最初のプールの増分スナップショットからこのバックアッププールを定期的に更新します:zfs send ... | zfs receive ...

マウントポイントの衝突を回避するために、バックアッププールは代替ルートで作成する必要があります。

バックアップディスクを別のディスクと交換して、別の場所に保存できます。ディスクを取り外す前にバックアッププールをエクスポートし、もう一方のディスクに代替バックアッププールを作成して、最初のプールの最初の完全バックアップを実行するだけです。

2:冗長性が必要な場合は、ミラーリングされたプールを使用し、ディスクを交換する場合は、zpool splitコマンドでプールを分割し、新しく作成されたプールディスクに削除し、代替を挿入します。ディスク、代替プールを破棄し、追加されたディスクでミラーリングを構成します。

#2はデータの冗長性があるのでより安全なので、私がお勧めするものです。

1
jlliagre

(3)最後に、最近、ZFSでこれほど複雑なことをする必要がないかもしれないことに気づきました。 RAID1と同様のミラーリングされたvdev構成で2つのドライブをセットアップしてから、1時間ごとのスナップショットをセットアップするとどうなりますか?このように、私は瞬時にバックアップを取り、恐ろしいRAID-is-not-a-backupから保護されているようです:/ bin/rm -Rf/*

これは、すべてのスナップショット、データセット、およびプールを誤って完全に削除するZFSレベルのコマンドに対してどのように役立ちますか?明らかに、RAID-still-is-not-a-backupとZFS送信/受信は、バックアップとしてのみRAIDに依存することを考えないための優れたツールを提供します。

0