大量のデータをrsyncで転送できない問題とその解決策

問題

あるシステムで、大量のデータをrsync+ssh をデータを転送しようとするが、うまくできない問題が発生しました。 sshの接続性やrsyncの動作は問題ないことを確認済みで、データ量が多くなることに起因していると思われるので調査しました。

また、rsync の出力結果をみると sending incremental file list の1行だけが出力されていて、それ以降の出力がないためrsync処理中に中断しているような感じでした。

原因と解決策

原因は、単純で rsync のデータ転送の計算に時間がかかり過ぎたことにより、データ無転送の状態がしばらく続き ssh のコネクションが切れてしまったからでした。 そのため、サーバ側で ClientAliveInterval を指定するか クライアント側で ServerAliveInterval を指定することで解決ができます。 なお、サーバ側とクライアント側のどちらか片方の設定で十分です、両方にキープアライブ設定を入れても効果は変わりません。

サーバ側で指定する場合は、以下のように設定変更をします。

/etc/ssh/sshd_config
#ClientAliveInterval 0
ClientAliveInterval 60

クライアント側で指定する場合は、rsync の -e オプションで指定するのが簡単です。

$ rsync -e 'ssh -o ServerAliveInterval=60' ...

この手の問題は、普通に rsync する程度では発生せずデータが多くなることで発生するため、発生を予測してキープアライブ設定をする対応は難しいと思っています。 そのため、rsync に失敗しても気づけるような仕組みを導入したほうがいいでしょう。