lftpによるftp mirror(FTPミラー・ファイル同期) - rsyncを使わない理由
2006.11.25
lftpコマンドを使って,FTPプロトコルによるミラーリングを行う.
2台のサーバの特定のディレクトリにあるファイルを同期したい.このような要求に応えるのには rsync が使われることが多いでしょう.
rsyncは独自のアルゴリズム(rsyncアルゴリズム)を使って,ファイル同期を最適化します.rsyncアルゴリズムでは同期先のファイルを固定長ブロックに分割し各ブロックのチェックサムを計算し,どのブロックを転送するかを決定します.こうすることで,転送量を最小化してファイル同期を高速に実行しています.
ところが,対象のファイルが単一の巨大なバイナリファイルの場合,この分割・チェックサム計算等が逆に時間がかかり,なおかつサーバに負荷をかけるようです.私の場合は700万程度の文書で構築したhyperestraierのインデックスのアーカイブ(約9GB)を同期しようとした時に経験しました.
そこで,単純にファイルの更新時刻を使って,転送の要/不要を判断するような方法としてFTPを使ったミラーリングを使いました.
FTPミラー(ftp mirror)にはlftpコマンドのスクリプトを用いました.本来,lftpは対話的に利用するftpクライアントです.対話的に利用する場合にコマンドプロンプトに入力するコマンド列をファイルに保存し,-f オプションで渡すとftpのバッチ処理を実行できます.
さらに,lftpは内部コマンドとしてミラーリングを実現する mirror と言うコマンドがあります.そこで以下のようなlftpスクリプトを書きました.
open -u daresore,passwd ftp.example.com mirror --delete --only-newer /some/where/ /copy_of_/some/where close quitopen で同期基のftpサーバ(ftp.example.com)に接続します.daresoreはユーザ名,passwdはftpサーバに接続するためのパスワードです.mirrorコマンドのオプション --delete はローカルに在ってftpサーバ上にないファイルを削除すし,--only-newerは更新時刻がローかより新しいものだけFTPで転送します. 2007/5/2追記: lftpによるftp mirror - PUT編 (FTPミラー・ファイル同期)を書きました.
カテゴリー:技術情報メモ