rsync を使った異なるサーバー間のデータ同期、ファイル転送の方法について書きます。
コピーするだけなら、rcp や scp というコマンドがありますし、FTPという方法もあります。
しかし手数が少なく、ファイルのオーナー、パーミッションもそっくりそのままコピーし、さらに転送元になく転送先にあるファイルを削除して完全に同期させることができるのがこのコマンドの特徴です。
サーバー移転(お引越し)をするときには定番、必須。
これなくしてサーバーのお引越し作業はありえません。
■ rsyncインストール (yum配布版rpm)
# yum -y install rsync
■ rsyncの使い方
(1) コマンドシーケンス
# rsync [オプション] コピー元 [コピー元 ...] コピー先 簡単な例 # rsync -av /home/user1/* user1@host.com:~/.
※コピー元、コピー先の書式は username@hostname:path
( hostname はもちろん IPアドレスでもいいです。)
※コピー元は複数並べることが可能ですが、コピー先は1つです。
[オプション] -a 「-rlptgoD」と指定したのと同様の効果。 元のパーミッションやグループなどを保持したまま同期する -v 処理中の経過ファイル名を表示する -r 指定したディレクトリ下の各ディレクトリも再帰的にバックアップする -u 追加されたファイルだけをコピーする -z データを圧縮する --existing 更新されたファイルだけをコピーし、追加されたファイルは無視する --delete コピー元で削除されたファイルは、コピー先でも削除する。 -aオプションと同時に指定することでコピー元とコピー先を同期できることになる --exclude=PATTERN パターン一致するファイルを除外する(--exclude 'パターン'と書いてもよい) --exclude-from=FILE ファイルに記述されたパターンと一致するファイルを除外する --include=PATTERN パターン一致するファイルを除外しない --include-from=FILE ファイルに記述されたパターンと一致するファイルを除外しない --stats rsyncアルゴリズムの転送効率を表示する -n , --dry-run 転送をテスト -h(--help) ヘルプを表示する
(2) rsyncの使用例
★自分のサーバーの/home下のuser1,user2,user3をリモートサーバーの/home下へ丸ごとコピーする。
# rsync -av \ /home/user1 \ /home/user2 \ /home/user3 \ /home/vpopmail \ root@123.456.789.10:/home/.
★自分のサーバーの/home下の admin, lost+found 以外をリモートサーバーの/home下へ丸ごとコピーする。
その際に、転送先に無いものは削除して完全に同期。
# rsync -av --delete \ --exclude="/admin" \ --exclude="/lost+found" \ /home/* \ root@123.456.789.10:/home/.
★リモートサーバーの/home下の admin, lost+found 以外を自分のサーバーの/home下へ丸ごとコピーする。
その際に、転送先(自分)に無いものは削除して完全に同期。
# rsync -av --delete \ --exclude="/admin" \ --exclude="/lost+found" \ root@111.222.333.444:/home/* \ /home/.
★コマンドを実行せず、処理結果を確認
# rsync -av --delete \ --dry-run \ --exclude="/admin" \ --exclude="/lost+found" \ root@111.222.333.444:/home/* \ /home/.
■ 運用上の注意点
rsync コマンドは、接続プロトコルに ssh を使います。
ということは、転送先のサーバーでは転送元サーバーからの ssh 接続許可がされていなければエラーになります。
これ、忘れがちです。要注意。
(転送先サーバーにて) iptables で ssh 接続許可
# iptables -I INPUT 15 -p tcp -s 転送元IP --dport 22 -j ACCEPT ※環境によって -I RH-Firewall-1-INPUT など多少変わってきます
ssh 接続許可が面倒なら、firewall 止めてしまえば確実。
直前に firewall 止めてしまって # service iptables stop 転送が終わったらまた再開 # service iptables start