2019.04.04
旧サーバより大量のファイルを新サーバに移行しようと RSYNCコマンドを利用しました。
RSYNCは2つのサーバ間でファイルやディレクトリの同期をとるコマンドです。
もちろん、サーバ間ではなくローカル環境内でのファイルの同期にも利用できます。
変更があった分だけ同期する事ができるのでとても便利です。
コマンドの書式は以下の通りです。
1 | $ rsync [オプション] 同期元 同期先 |
気を付けたい点としては、同期元のディレクトリの最後の 「 / 」を省略した場合はディレクトリそのものを表し、「 / 」を付けた場合は、そのディレクトリの中身を同期します。
例えば、【 rsync -av /data/ /var/data 】と書いた場合は
/dataディレクトリの中身にあるファイルやディレクトリを 同期先の /var/dataディレクトリ内にコピーされます。
【 rsync -av /data /var/data 】と書いた場合は
同期先の /var/dataディレクトリ内に、dataディレクトリがコピーされます。
ちなみに、同期先の最後の「 / 」の有無は影響しません。
最低限必要になるのは以下です。
-a :(-rlptgoDとオプションを付けたのと同じ)
・ディレクトリを再帰的にコピーする
・シンボリックリンクを、そのままシンボリックリンクとしてコピーする
・パーミッションをそのままコピーする
・タイムスタンプをそのままコピーする
・グループをそのままコピーする
・所有者をそのままコピーする
・デバイスファイルや特殊ファイルをそのままコピーする
-v :コピーしたファイル名や、コピーしたバイト数などの転送情報を表示
オプションに -e を付け、そのあとに ssh と書けば、SSHで通信を行います。
書式は以下となります。
1 | $ rsync -ave ssh ユーザ@サーバIP:同期元PATH 同期先PATH |
具体的には以下のように利用します。
1 | $ rsync -ave ssh usr@192.168.128.25:/data/ /var/data |
これは、同期元のサーバ(192.168.128.25)の /dataディレクトリ内のファイルやディレクトリを、コマンドを実行したサーバの /var/dataディレクトリとSSHを用いてユーザ usrでログインして同期をとります。
大量のファイルを転送するとサーバに負荷がかかり過ぎて他の処理がとてつもなく重くなってしまいます。
その場合に以下のように
–rsync-pathオプションを付けて以下のように記述します。
1 | --rsync-path="ionice -c2 -n7 nice -n19 rsync" |
・ioniceはディスクIOの使用状況に応じたそのプロセスの割り当て優先度を決めるオプション
※0~3までの値があり、1が最優先。2にすればベストエフォートを示します。
また、1、2の場合は、さらに -nオプションで優先順位を指定できます。
こちらは指定できる範囲は 0~7で、0が最優先となります。
・niceはCPUの状況に応じたそのプロセスの割り当て優先度を決めるオプション
※-20~19の値があって、-20が最優先。19なら最低優先度の設定
–bwlimitオプションを指定すれば、帯域制限をかける事ができます。単位は kb/sec。
以下のように記述します。
1 | --bwlimit=2048 |
結局、以下のようなコマンドを実行すれば、サーバの負荷も抑えて同期処理ができるようになります。
1 | $ rsync --bwlimit=2048 --rsync-path="ionice -c2 -n7 nice -n19 rsync" -ave ssh usr@192.168.128.25:/data/ /var/data |