先日お客様のサーバー移転を行い、巨大なファイル転送時に便利なRsyncのオプションを試してみましたので、情報共有したいと思います。
事の発端はお客様のサーバー移転でした
利用されていた某ホスティングサービスではデータ転送帯域制限があり、ダウンロードの制限が3Mb/sec程度でした。それではダウンロードにとても時間がかかり、万が一データ転送が止まったときにはやり直しになってしまいます。なので、結局サーバー上でファイルを圧縮して巨大なファイルをダウンロード、移転先の(転送制限の緩い)サーバーからダウンロードしてもらうことになりました。
巨大ファイル転送の問題
ところが問題は、バックアップファイルの大きさでした。何と、Webの領域だけで圧縮しても200GB近くもあったのです。ファイルのダウンロード自体は夜通し行い、ラッキーな事に止まらなかったですが、問題はアップロードでした。今更ながら、この大きさであれば、外付けHDDにコピーして送るとかの方法のほうが良かったのだと思います。ですが、データをダウンロードしてもらう事にしました。
データ転送に予想以外の時間がかかる
200GBのデータ転送はローカルネットワークであればさほど時間がかからないですが、インターネット越しだとかなり時間がかかります。7Mb/sec程度の転送速度でアプロードしましたが、パソコンがスリープになったのか転送が途中で止まっていました。焦ってグーグル先生に聞くと、RsyncにPartialというオプションがあるでは無いですか!助かります。後から調べると、FTPにもResumeというオプションが利用できるそうです。ただ、この大きさでも問題なく動くかは未検証です。
今回はRsync+SSHで鍵認証を使ってデータを転送しました。
途中28GB程度までアップロードが完了していて、残り170GB程度でした。
Rsync to rescue!
Scpでも良かったのですが、敢えてRsyncを使いました。Rsyncには途中で転送に失敗した時に再開出来る–partialというオプションがあったからです。初めて試すオプションですが、本当にちゃんと動作するのかドキドキしながら試してみました。
実際に実行したコマンドはこれです。
rsync -av --partial --inplace --append --progress -e ssh backup.tar.gz 転送先サーバー
- –progress
このオプションは過去に使った事があったのでわかっていました。このオプションを使うと進み具合を%で表示してくれます。大きなファイルを転送する際にはよく使うオプションです。 - –partial
このオプションは途中まで転送されたファイルを上書きしない指定です。このオプションを付けないと、Rsyncはアップロードされているファイルを削除して新たにファイルを作成します。 - –append
このオプションは途中まで転送したファイルの最後にデータを追加するオプションです。後からRsyncのマニュアルを確認したところ、–append-verifyというオプションもあり、アップロードが完了した後に転送元ファイルとハッシュ値が一致するか確認してくれるそうです。Rsyncとても素晴らしいです! - –inplace
このオプションは通常–partialと一緒に使用される。(多分なしでも問題なし)
アップロードしたファイルのハッシュ値を確認
最終的には見事無事にサーバーにアップロードが完了しました。アップロード後には念の為、md5deepというコマンドで転送元と転送先ファイルのハッシュ値を比べました。このコマンドはファイルが大きいとCPUに負担がかかるので注意が必要です。
ubuntu@www:~$ md5deep -e backup.tar.gz
926425b856f194aca4bd1745d63a3b4b /home/ubuntu/backup.tar.gz
–progressオプションを指定したので、転送速度や進み具合が見れるのはとても便利です。これで大きなファイルをアップロードする場合でも怖くないです!