rsyncで再開可能なファイル転送

結論: rsnc --partial --appendで再開可能なファイル転送ができる

転送中に障害が発生


takao$ rsync -av --progress --partial --append bigfile 192.168.1.181:/var/tmp/
bigfile
562823168 52% 43.22MB/s 0:00:11 ^C
rsync error: unexplained error (code 130) at rsync.c(541) [sender=3.0.7]

約六割が転送済み


takao$ ls -l bigfile /var/tmp/bigfile
-r-xrwsr-x 1 www-data www-data 1073709056 2011-11-24 23:48 bigfile
-rw------- 1 tengu tengu 605552640 2011-12-02 17:25 /var/tmp/bigfile

転送再開


takao$ rsync -av --progress --partial --append bigfile 192.168.1.181:/var/tmp/
sending incremental file list
bigfile
1073709056 100% 31.61MB/s 0:00:14 (xfer#1, to-check=0/1)

sent 468213655 bytes received 31 bytes 24010958.26 bytes/sec
total size is 1073709056 speedup is 2.29

転送再開後のファイル。


takao$ ls -l bigfile /var/tmp/bigfile
-r-xrwsr-x 1 www-data www-data 1073709056 2011-11-24 23:48 bigfile
-r-xrwsr-x 1 tengu www-data 1073709056 2011-11-24 23:48 /var/tmp/bigfile

takao$ md5sum bigfile /var/tmp/bigfile
aeb322de486a4d1a7dc6302be48468bf bigfile
aeb322de486a4d1a7dc6302be48468bf /var/tmp/bigfile # 転送されたファイル

ちゃんと同じものがついている。

--partialは途中まで送ったファイルを残してくれる

これが無いと転送中断されたファイルは片付けられてしまう


takao$ rsync -av --progress bigfile 192.168.1.181:/var/tmp/
sending incremental file list
bigfile
481230848 44% 56.08MB/s 0:00:10 ^C
rsync error: unexplained error (code 130) at rsync.c(541) [sender=3.0.7]
takao$ ls -l /var/tmp/bigfile
ls: cannot access /var/tmp/bigfile: No such file or directory # 残らない

--appendは転送の再開を可能にしてくれる

これが無いとまた全部転送されるよう。表示される数値は最終的な転送量なのでわからないが所要時間で見ると--appendの付いている方が速いのがわかる。

--append無しだと


takao$ time rsync -av --progress --partial bigfile 192.168.1.181:/var/tmp/
sending incremental file list
bigfile
1073709056 100% 27.05MB/s 0:00:37 (xfer#1, to-check=0/1)

sent 180767435 bytes received 209261 bytes 3203127.36 bytes/sec
total size is 1073709056 speedup is 5.93

real 0m56.307s
user 0m20.520s
sys 0m1.470s

--appendありだと


takao$ time rsync -av --progress --partial --append bigfile 192.168.1.181:/var/tmp/
sending incremental file list
bigfile
1073709056 100% 50.15MB/s 0:00:03 (xfer#1, to-check=0/1)

sent 180639355 bytes received 31 bytes 21251692.47 bytes/sec
total size is 1073709056 speedup is 5.94

real 0m8.069s
user 0m2.930s
sys 0m0.970s

まとめ: rsync --partial --append で中断されても再開可能なファイル転送ができる

  • こういうときは大抵--progressも欲しい
  • -vaを併せて使うのが一般的かも

備考

HTTPで再開可能なアップロード方を探していたが満足なものがなかった。nginxのupload_moduleにはupload_resumableというオプションがあるけど、nginx独自のプロトコルのようでブラウザサポートはあまり無いよう。
youtubeには一般ブラウザによる再開可能なアップロード機能があるようだが、OSSウェブサーバでどう実装すればいいのかわからない。というわけで、rsyncに頼ることにした。

todo: これでrsyncをマスターする http://d.hatena.ne.jp/takuya_1st/20100511/1273588133