7年くらい昔に書いたのを人から質問されて発掘して紹介したのでいちおう転載しておこうかという備忘録です。
###rsyncでデータを同期する
####・なぜrsyncを使いたいか
実行にかかる時間が非常に短く、rcpやtar+sshより高速
一度同期しておいてメンテナンス時は差分のみで時間を短縮可能
一括転送かつ柔軟に対象を除外したりできる
上記の理由によって、コンテンツ移行・サーバ移設などの要件に利用することが多い。
冗長構成となっているコンテンツの同期をcronで定期的にrsyncを実行させて取っているというサービスもある。(このメモ書いた当時は2009年とかです。)
####・実行時の権限について
rootで実行しないと同期の対象に含まれるあらゆるユーザのファイル権限が保てない。
同期対象に含まれるファイルのオーナが1アカウントのみならそのユーザでrsyncを実行する。
####・主要なオプションについて
http://www.infoscience.co.jp/technical/rsync/rsync.html
####・負荷について
運用中環境ではCPUとI/Oを食うのを覚悟するか初回はtarアーカイブをばらまく方法に変えるか等工夫がいる。
以下リンク先にリモートサーバの負荷を抑える方法がかかれている。
https://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/200909231.html
▽良く使う、使ったことがあるオプション
-a, --archive アーカイブモード(-rlptgoD オプションと同義)
-r, --recursive ディレクトリで再帰的に実行する
-l, --links ソフトリンクを維持する
-p, --perms パーミッションを維持する
-t, --times タイムスタンプを維持する
-g, --group グループを維持する
-o, --owner オーナーを維持する (root のみ)
-D, --devices デバイスを維持する (root のみ)
-u, --update アップデートのみ許可 (上書き禁止)
-n, --dry-run 実行時の動作だけを表示
-e, --rsh=COMMAND rsh の代替を指定
-C, --cvs-exclude システム間で転送したくない広範囲のファイルを除外(CVSの方法と同じ)
--delete 送信側にないファイルを削除
--timeout=TIME IO タイムアウトを設定(秒)
-z, --compress 受信ファイルを圧縮compress file data
--exclude=PATTERN パターン一致するファイルを除外
--exclude-from=FILE ファイルに記述されたパターンと一致するファイルを除外
####・deleteオプションについて
付けると、同期元に存在しないファイルは同期先で消される。
(切戻しの際につけてしまうと新規に追加したファイルが消えてしまう)
付けないと、同期元で削除・整理したファイルが同期先で消えない。
(見えてはならないファイルが見えてしまうという障害が発生する)
良く状況を確認して場合によって使い分ける必要がある。
送信元ディレクトリ/*などとアスタリスクをつけると効かないので注意。
http://www.1x1.jp/blog/2008/04/rsync_delete_asterisk.html
####・ssh空鍵認証で使う
rootでコピーする必要がある場合、rootログイン(PermitRootLogin)を
sshd設定(/etc/ssh/sshd_config)で許可する必要がある。
その方法には2つの選択肢がある。
単純に、許可する
PermitRootLogin yes
公開鍵に許可するコマンドを書く
PermitRootLogin forced-commands-only
鍵認証を許可する(コマンド制限なし)
PermitRootLogin without-password
設定を変更した場合、sshdをリスタートして設定を読み込ませる必要がある。
その際に既に接続しているセッションは切れないが念のためtelnetで限定的にアクセス可能にする方法もある。
ssh鍵認証したい場合、アクセス元の公開鍵(~.pub)を、
アクセス先の公開鍵リング(~/.ssh/authorized_keys)に1行1鍵登録する必要がある。
(.sshディレクトリや鍵の権限は他人がアクセス不可能なようにしないと動作しない)
-e, --rsh=COMMAND rsh の代替を指定
例)
同期元にrsync用の鍵を作る
# ssh-keygen -t dsa -N "" -f /root/.ssh/rsync
まずテストディレクトリにverboseモード(-vv)で送信して実行されるコマンドを確かめる
# rsync -vv -az --exclude "backup*.tar.gz" -e "ssh -p 1220 -i /root/.ssh/rsync" /home/user/ root@hp01:/home/user/
opening connection using ssh -p 1220 -i /root/.ssh/rsync -l root hp01 rsync --server -vvlogDtprz . /home/user/
同期先のユーザ@サーバの公開鍵リングに、頭(1行1鍵なので同じ行)に以下のようにコマンドを付けた鍵を追加する。(PermitRootLogin forced-commands-onlyの場合)
/root/.ssh/authorized_keys
---------------------------------------------------------------------------
command="rsync --server -vvlogDtprz . /home/user/tmp/" ssh-dss AAAAB3..
---------------------------------------------------------------------------
※scpの場合は-tでターゲットディレクトリを指定する
---------------------------------------------------------------------------
command="/usr/bin/scp -t /data02/kudan-xoops01" ssh-dss AAAA..
---------------------------------------------------------------------------
####・NFSmountして使う
ssh鍵認証よりも簡単なので、NFSが起動しているならこちらの方が工数がかからなくて良い。
(NFSは頻度高い更新に不向きでCPU負荷アラート出るかも)
同期元をリードオンリーでマウントすると、もし方向を間違ったとしても上書きが不可能なので安全。
# mount -t nfs server:/public/dir /tmp -o ro,intr,soft,bg,async
# cd /tmp
# rsync -a -u --delete --exclude-from=/opt/exclude.txt ./ /dest-dir/
####・デーモンとして使う
一般的な使い方と言えなくもないが、rsyncのバージョンの差によってはrsync実行不可能な場合もある。
####・まず最小構成でテストを行う
cpと同じように使えるので、テスト用の場所とファイルを作成し、timeで時間なども計測する
####・ドライランで同期されるファイルのリストを取得する
-n, --dry-run 実行時の動作だけを表示
例)
# time rsync -n -a -u ./* /data1/data/messages/ >/home/sg_ope/rsync_mes.log
####・スクリプト化して自動実行する
ファイルにコマンドを書いて実行権を付ければスクリプトになる。
cronでの自動実行を停止し忘れないように十分注意しなければならない。
####・帯域制限する
--bwlimit=200をつける(200KB/秒で転送)
http://d.hatena.ne.jp/isher/20080817/1218996948
参考)
http://www2s.biglobe.ne.jp/~nuts/labo/inti/cron-rsync-ssh-nodaemon.html
http://d.hatena.ne.jp/isher/20080817/1218996948