TrueNASで80TBのNASを自作した話 ④zfs send / recv で旧NASから新NASにデータを移行する

当サイトのリンクにはアフィリエイト広告を含む場合があります。

スポンサーリンク

普段使わないコマンドは難しい。

zfs send / recvとは

ZFSプールに存在するデータを一括で送信することが可能なコマンド。
スナップショットを作成した時点でのデータを一括で送るということで、送信中にデータを追加・変更・削除しても問題ないのが良いところ。

今回の手順は以下の通り。

  1. とにかく現時点でのスナップショットを作成(Snapshot1)
  2. Snapshot1をzfs sendで送信する(この間にデータの変更をしてもよい)
  3. データ移動が完了したらさらにスナップショットを作成(Snapshot2)
  4. Snapshot2をzfs send -iで送信する(Snapshot1とSnapshot2の差分だけが送られるので早い)
  5. 新NASを運用し始め旧NASに別れを告げる

データ移行

XigmaNASを旧NAS、TrueNASを新NASという表現で統一する。
実際に旧NASで実行したコマンドを青い背景、新NASで実行したコマンドを赤い背景で記載していく。プライベートIPは適当に変えた。

旧NASでZFSのスナップショットを作成

旧NAS側で送りたいデータセットのスナップショットを取る。
これはコマンドでもGUIでもOK。

コマンドを使う場合は以下の通り。

zfs snapshot [プール名]/[データセット名]@[スナップショット名]

実際に使用したのは以下のコマンド。

zfs snapshot RAID-Z2/NAS@20210419

新NASでプールを作成する

ひとつ前の記事でプールは作成済みなので今回は作業しないが、データセットを作成してしまっているので削除しておく。

zfs recvで受け取る際にデータセット名を決めて受け取るのだが、事前にデータセットを作成して同一のデータセット名を指定するとエラーで受け取れない。
強制的に受け取ることも可能だが、例に倣ってプールのみにしておいた。

旧NASからzfs sendを実行する

旧NASと新NASの両方でzfs sendとzfs recvを実行してもいいのだが、片方だけの画面を見てれば済むのでsshを通して実行することにした。

旧NAS側で以下のコマンドを実行し、送信先NASのrootパスワードを入力する。

zfs send -v [プール名]/[データセット名]@[スナップショット名] | ssh root@[送信先のIPアドレス] zfs recv -s [送信先のプール名]/[新しく作成するデータセット名]
(-vをつけているせいで画面が次々と送られるが、気にせずに送信先NASのrootパスワードを入力)

実際に使用したのは以下のコマンド。

zfs send -v RAID-Z2/NAS@20210419 | ssh root@192.168.9.251 zfs recv -s tank/NAS

進捗を表示したいので -v をつけているが、パスワードを入力する前から毎秒何MB送りました~って画面が出てしまう。
もちろんパスワードを入力するまで送信されないので画面に惑わされずに入力する。(こういうのに慣れてないから最初戸惑ってしまった)

実際の速度は200MB/s程度とそんなに速くはなかった。送信側が遅いのか受信側が遅いのかネットワークが悪いのか。

調べるとmbufferを使うと速いと書いてある記事もあったが、XigmaNASにインストールするのに一手間かかったりと面倒だったので今回はパス。
出かける前に実行すればOKなので問題なし。

レジューム機能

zfs sendの実行中にネットワークの調子が悪かったりして中断してしまった場合でも、zfs recvに -s をつけておけば途中から再開してくれる。
つけ忘れるとレジューム機能は使えないので、大きいデータセットを送信する時にはつけておくといいだろう。

上で紹介したコマンドを実行中に中断してしまった場合、zfs recvを実行している新NAS側で以下のコマンドを実行。

zfs get -H -o value receive_resume_token [送信先のプール名]/[新しく作成したデータセット名]

実際に使ったのは以下のコマンド。

zfs get -H -o value receive_resume_token tank/NAS

めちゃくちゃ長いトークンが取得できた。
それを使用して旧NAS側でzfs send -t の後ろにトークンを貼り付けて実行する。実際に使ったのは以下のコマンド。

zfs send -v -t '[ここにトークン]' | ssh root@192.168.9.251 zfs recv -s tank/NAS

「20TBくらい移動してたのに止まってしまった……あと10TBだったのに」
ということが回避できたので非常に助かった。

zfs send -iで差分を送信

送信し始めてから受信し終わるまでに旧NASにデータを追加・変更・削除した場合、新NASには反映されていない。
送信し始めた4月19日時点と送信が終わった4月22日時点ではデータが増えていたり減っていたりしているということだ。

19日から22日の差分を埋めるために、もう一度スナップショットを取得して差分を送信する必要がある。
ただし差分を送信するには旧NASから送信したスナップショットの状態から変更がないことが条件。
つまり受信した新NAS側にデータを入れたり削除したりしてはいけないということ。

まずは旧NAS側で新しくスナップショットを作成する。

zfs snapshot RAID-Z2/NAS@20210422

そして取得したスナップショットをzfs send -i で送信する。

zfs send -v -i [送信済みのスナップショット名] [プール名]/[データセット名]@[新スナップショット名] | ssh root@[送信先のIPアドレス] zfs recv [送信先のプール名]/[送信先のデータセット名]

実際に使ったのは以下のコマンド。

zfs send -v -i 20210419 RAID-Z2/NAS@20210422 | ssh root@192.168.9.251 zfs recv tank/NAS

これで差分も送信できたので旧NASと新NASのデータは同一のものになった。
あとは1つ前の記事で解説した通りに新NAS側でSMBやNFSでの共有設定をしてやれば使えるようになる。

参考サイト

https://docs.oracle.com/cd/E19253-01/819-6260/gbchx/index.html
ZFS - スナップショットいつやるか?今でしょ! - Qiita
こういうニュースを見るたびに、こう嘆かざるを得ません。GitLab.comが操作ミスで本番データベース喪失「ああ、ZFS使ってれば」、と。…
send/recvでデータ移行 [メモとかメモのようなものとか(By ルーキーの中のひと)]
Migrating Data With ZFS Send and Receive - Stephen Foskett, Pack Rat
I like ZFS Send and Receive, but I'm not totally sold on it. I've used rsync for decades, so I'm not giving it up anytim...

コメント

タイトルとURLをコピーしました