web-dev-qa-db-ja.com

zfsプールの増分/継続バックアップを実行するにはどうすればよいですか?

Zfsプールをオフサイトで継続的/増分的にバックアップするにはどうすればよいですか?

send/receive over sshは1つの方法ですが、スナップショットを手動で管理する必要があります。

私が見つけたいくつかのツールがありますが、ほとんどはサポートされなくなりました。

有望に見えるツールの1つは https://github.com/jimsalterjrs/sanoid ですが、広く知られていないツールがデータを破損/削除する可能性があるという点で、害を及ぼす可能性が高いと心配しています。

連続/増分zfsバックアップはどのように実行されますか?

26
Greg

[〜#〜] zfs [〜#〜] は信じられないほどのファイルシステムであり、ローカルおよび共有データストレージのニーズの多くを解決します。

一方、私はclustered ZFSのアイデアが好きな場合はいつでも、実用的でない場合や、地理的に離れている必要がある場合があります。ストレージノード。

私の使用事例の1つは、Linuxアプリケーションサーバー上の高性能複製ストレージの場合です。たとえば、データに低遅延のNVMe SSDドライブを活用できるレガシーソフトウェア製品をサポートしています。アプリケーションには、セカンダリサーバーに複製できるアプリケーションレベルのミラーリングオプションがありますが、多くの場合不正確であり、10分です [〜#〜] rpo [〜#〜]

この問題は、ローカル、リモート、またはその両方のセカンダリサーバー(同様のまたは異なるハードウェアでZFSも実行している)を使用することで解決しました。以下で説明する3つのユーティリティを組み合わせることで、継続的なレプリケーション、詳細なスナップショットの保持、柔軟なフェイルオーバーオプションを提供するレプリケーションソリューションを作成しました。

zfs-auto-snapshot- https://github.com/zfsonlinux/zfs-auto-snapshot

定期的なZFSファイルシステムレベルのスナップショットを有効にする便利なツールです。私は通常、本番ボリュームで次のスケジュールで実行します。

# /etc/cron.d/zfs-auto-snapshot

PATH="/usr/bin:/bin:/usr/sbin:/sbin"

*/5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 //
00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //
59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 //
59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //
00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //

Syncoid(Sanoid)- https://github.com/jimsalterjrs/sanoid

このプログラムは、ZFSファイルシステムのアドホックスナップ/レプリケーションをセカンダリターゲットに実行できます。私は製品の syncoid 部分のみを使用しています。

server1およびserver2と仮定すると、server2topulldata fromserver1

#!/bin/bash

/usr/local/bin/syncoid root@server1:vol1/data vol2/data

exit $?

Monit- https://mmonit.com/monit/

Monitは非常に柔軟なジョブスケジューラおよび実行マネージャーです。デフォルトでは30秒間隔で動作しますが、15秒の基本タイムサイクルを使用するように構成を変更します。

15秒(1サイクル)ごとに上記のレプリケーションスクリプトを実行する設定例

check program storagesync with path /usr/local/bin/run_storagesync.sh
        every 1 cycles
        if status != 0 then alert

これは、構成管理を介して自動化および追加するのが簡単です。スナップショット/レプリケーションの実行をMonitでラップすることにより、一元化されたステータス、ジョブ制御、およびアラート(電子メール、SNMP、カスタムスクリプト)を取得できます。


その結果、毎月のスナップショットが 数か月 で、ロールバックと保持のポイントが多く含まれるサーバーがあります。 https://Pastebin.com/zuNzgi0G -さらに、連続ローリング15秒アトミックレプリカ:

# monit status

Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:37:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:37:59
.
.
.
Program 'storagesync'
  status                            Status ok
  monitoring status                 Monitored
  last started                      Wed, 05 Apr 2017 05:38:59
  last exit value                   0
  data collected                    Wed, 05 Apr 2017 05:38:59
36
ewwhite

それには、次の2つの方法があります。

  1. rsyncBaculaなどのツールを使用した、過去10年間使用されてきた、ファイルシステムに依存しない従来の方法。そこでテストし、(うまくいけば)安定した大規模なソフトウェアをテストしました。これらのソフトウェアは、大規模な展開用にカスタマイズでき、ZFSから切り替えても使用できます。
  2. ZFSを活用するツールの1つsend/recv。これは、独自のソリューション、Github et al。のさまざまなツールからのスクリプトまたは拡張スクリプト、またはSanoidや ZnapZend (mbufferのサポートと保持計画を使用した送信/受信)などの機能豊富なツールのいずれかです。 )。この場合、大きな「エンタープライズ」(否定的な意味での)ソリューションはほとんど見つかりませんが、単一のタスクのみを実行し、他のツールと組み合わせて特定のセットアップに対応できるツールを見つけることができます。

一般に、私はソースコードが利用可能なツールのみを信頼し、できるだけシンプルに保ちます。 send/recvを使用している場合、多くを管理する必要はありません。転送時にローカル側でスナップショットn-1を削除するだけですそして、リモート側でのスナップショットnの確立は成功しました。

ローカルの現在/新しいスナップショットとローカルの以前のスナップショットの間の差分のみを送信できるという鉄則を守るだけであれば、トランスポートを好きなように分割できます。非同期にすることもできます(スナップショットをすぐに受信する必要はありません)。 、およびローカルの以前のスナップショットがリモート側の最新のスナップショットであること(バックアップが終了してすべてがリセットされるまで)。

今考えてみると、おそらくそれを状態マシンでエンコードして、予期しないケースが抜け落ちないようにすることができます。

7
user121391