multiple zfs send

ひさしぶりだけど、ただのメモ。

前に 同じ入力で複数処理をしたい ってのをメモったんだけど、これと rsh で zfs send では使わなかった mbuffer の合わせ技です。

お題

host A にある zfs snapshot を host B と host C にまとめて send したい。

素直にやるなら、 A -> B に送ったあとに B -> C とかやればいいんですけど、けっこう時間かかることが多いので待つ時間が無駄な気がしますよね。

MySQLMyISAM なデータベースが入ったディレクトリがそのまま zfs になってれば、複数 slave を作るのも楽ちんです。やっぱ MyISAM 最高だね!

回答

  • host A (送信側)
ichii386@hostA% time pfexec zfs send -v hoge@snap | mbuffer -R60M -O hostB:10001
  • host B (プロキシ的な)
ichii386@hostB% time mbuffer -I10001 | tee >/dev/null >(mbuffer -O hostB:10002) >(mbuffer -O hostC:10002)
  • host B (受信側)
ichii386@hostB% time mbuffer -I10002 | pfexec zfs recv -F hoge@snap
  • host C (受信側)
ichii386@hostC% time mbuffer -I10002 | pfexec zfs recv -F hoge@snap

GNU screen とかで 4 つターミナル開いて、下から順に実行していきましょう。最後に一番上の send を実行したら、下 3 つが一斉に動き出します。

こんなかんじで A -> B(proxy) -> B, C と並列に受信できました。

メモ

プロキシは B である必要はないです。データセンターを跨いで NAT とか踏み台が必要なら、そこを使うといいと思います。ちなみに mbuffer -R60M ってのは、帯域幅を 60MBytes/sec (気分的に 1GbE の半分くらい) に制約するってオプションです。

もちろん host A で dup する (プロキシを A にする) んでもいいけど、使っていい帯域幅との兼ね合いで調整してみましょう。