皆さんも業務上よく"サーバを冗長化する"ということはされていると思います。
今回は、災害を考慮してサーバ間でファイルを同期しておきたい、という時に使用した
rsyncコマンドについてまとめていきたいと思います。
はじめに
🔶rsyncコマンドとは?
リモート→ローカル、ローカル→リモート、ローカル→ローカルという各サーバ間で
高速かつ使用リソースを抑えつつファイル同期が可能なコマンドです。
🔶scpではなくrsyncを採用した理由
こちらは、以下の要件を満たすときにscpコマンドよりもrsyncコマンドが適していたからになります。
【要件】
①Linuxサーバ間で指定ディレクトリを毎日同じ状態にしておきたい
②他処理もあるため可能な限り短い時間で同期したい
上に記した要件①については、"scp"コマンドでディレクトリを指定して転送することで2つのサーバ間で同じ状態にすることは可能です。
ただ、要件②を考えた時に"scp"コマンドでは時間がかかりすぎてしまうため短くする必要がありました。
"rsync"コマンドでは、送信元・送信先で差分比較をおこないコマンド実行時点で変更された部分のみ転送するため、
全量を転送しようとする"scp"コマンドよりも高速かつ使用リソースも少なく同期することができます。
rsyncコマンドの使用例・オプション
🔶rsyncコマンドの使用例
"rsync"コマンドの基本的な構文は以下の通りです。
rsync [オプション] [送信元パス] [送信先パス]
※リモートサーバ指定の場合は以下のように指定してあげます。
user@remote:[フルパス]
🔶rsyncコマンドのオプション
オプションの全量は、"man rsync"コマンドで確認可能と思いますので
今回はよく使用されるであろうオプションを8つほど取り上げたいと思います。
-a (–archive)
コピー元のディレクトリを再帰的に同期
所有者・グループ・パーミッション・タイムスタンプがそのまま同期。
-v (–verbose)
対象のファイルのファイル名、サイズなどを詳細表示
-z (–compress)
転送中のデータを圧縮
-h (–human-readable)
人間が読みやすい単位で表示
-P (–partial –progress)
進行状況表示と部分的転送の再開
-n (–dry-run)
実際には転送せず、シミュレーションを実行
–delete
同期元にないファイルは同期先から削除
–log-file=[ログファイルフルパス]
指定したパスにログを吐き出すことが可能
実際にハンズオンしながら確認
検証環境の都合上ローカル同士でファイル同期の検証をしていきます。
※リモートサーバを使用する場合でもオプションの指定は同じです。
🔶ハンズオンで扱うディレクトリ構造
多重構造になっていても同期がされていることの確認のために以下のディレクトリを作成してハンズオンしてみました。
下記の「test1」ディレクトリを「test2」という名前のディレクトリに同期していきます。
.:
test1
./test1:
rsync1 rsync2
./test1/rsync1:
dummy1.txt dummy2.txt dummy3.txt
./test1/rsync2:
dummy4.txt dummy5.txt dummy6.txt
🔶オプションなしの場合と"-a"オプションありの比較
■オプション指定なし
[daisuke@localhost test]$ ll
total 0
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test1
[daisuke@localhost test]$ rsync /home/daisuke/test/test1/ /home/daisuke/test/test2/
skipping directory .
[daisuke@localhost test]$ ll
total 0
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test1
drwxrwxr-x. 2 daisuke daisuke 6 May 7 17:24 test2
[daisuke@localhost test]$ ll test2
total 0
■"-aオプション"あり
[daisuke@localhost test]$ rsync -a /home/daisuke/test/test1/ /home/daisuke/test/test2/
[daisuke@localhost test]$
[daisuke@localhost test]$ ll
total 0
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test1
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test2
[daisuke@localhost test]$ ll -R
.:
total 0
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test1
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test2
./test1:
total 0
drwxrwxr-x. 2 daisuke daisuke 60 May 7 01:32 rsync1
drwxrwxr-x. 2 daisuke daisuke 60 May 7 01:34 rsync2
./test1/rsync1:
total 3145728
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:32 dummy1.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:32 dummy2.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:32 dummy3.txt
./test1/rsync2:
total 3145728
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:34 dummy4.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:34 dummy5.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:34 dummy6.txt
./test2:
total 0
drwxrwxr-x. 2 daisuke daisuke 60 May 7 01:32 rsync1
drwxrwxr-x. 2 daisuke daisuke 60 May 7 01:34 rsync2
./test2/rsync1:
total 3145728
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:32 dummy1.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:32 dummy2.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:32 dummy3.txt
./test2/rsync2:
total 3145728
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:34 dummy4.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:34 dummy5.txt
-rw-rw-r--. 1 daisuke daisuke 1073741824 May 7 01:34 dummy6.txt
オプション指定なしだとディレクトリの配下までは同期してくれないようです。
🔶"-avで詳細を表示してみる"
[daisuke@localhost test]$ rsync -av /home/daisuke/test/test1/ /home/daisuke/test/test2/
sending incremental file list
created directory /home/daisuke/test/test2
./
rsync1/
rsync1/dummy1.txt
rsync1/dummy2.txt
rsync1/dummy3.txt
rsync2/
rsync2/dummy4.txt
rsync2/dummy5.txt
rsync2/dummy6.txt
sent 6,444,024,321 bytes received 196 bytes 167,377,260.18 bytes/sec
total size is 6,442,450,944 speedup is 1.00
"-v"オプションを指定することで同期対象の合計サイズや転送速度が表示されるようになりました。
実際の運用する際には所要時間が必要なケースがほとんどなため覚えておきたいオプションですね!
🔶"-avh"で表示がどう変わるのか確認
[daisuke@localhost test]$ rsync -avh /home/daisuke/test/test1/ /home/daisuke/test/test2/
sending incremental file list
created directory /home/daisuke/test/test2
./
rsync1/
rsync1/dummy1.txt
rsync1/dummy2.txt
rsync1/dummy3.txt
rsync2/
rsync2/dummy4.txt
rsync2/dummy5.txt
rsync2/dummy6.txt
sent 6.44G bytes received 196 bytes 176.55M bytes/sec
total size is 6.44G speedup is 1.00
"-h" オプションを追加することで表示されているサイズが見やすくなりました!
🔶"-avP"の場合
[daisuke@localhost test]$ rsync -avP /home/daisuke/test/test1/ /home/daisuke/test/test2/
sending incremental file list
created directory /home/daisuke/test/test2
./
rsync1/
rsync1/dummy1.txt
1,073,741,824 100% 176.85MB/s 0:00:05 (xfr#1, to-chk=5/9)
rsync1/dummy2.txt
1,073,741,824 100% 154.12MB/s 0:00:06 (xfr#2, to-chk=4/9)
rsync1/dummy3.txt
1,073,741,824 100% 156.65MB/s 0:00:06 (xfr#3, to-chk=3/9)
rsync2/
rsync2/dummy4.txt
1,073,741,824 100% 160.55MB/s 0:00:06 (xfr#4, to-chk=2/9)
rsync2/dummy5.txt
1,073,741,824 100% 165.00MB/s 0:00:06 (xfr#5, to-chk=1/9)
rsync2/dummy6.txt
1,073,741,824 100% 169.56MB/s 0:00:06 (xfr#6, to-chk=0/9)
sent 6,444,024,321 bytes received 196 bytes 181,521,817.38 bytes/sec
total size is 6,442,450,944 speedup is 1.00
"-P"オプションを追加することで1ファイルごとに同期状態が把握できるようになりました。
実際のコンソール上では「100%」や「0:00:06」の箇所が動いているのが見えます。
🔶ログ出力の確認
[daisuke@localhost test]$ rsync -avhP --log-file=/home/daisuke/test/rsynctest.log /home/daisuke/test/test1/ /home/daisuke/test/test2/
sending incremental file list
created directory /home/daisuke/test/test2
./
rsync1/
rsync1/dummy1.txt
1.07G 100% 168.72MB/s 0:00:06 (xfr#1, to-chk=5/9)
rsync1/dummy2.txt
1.07G 100% 173.18MB/s 0:00:05 (xfr#2, to-chk=4/9)
rsync1/dummy3.txt
1.07G 100% 151.14MB/s 0:00:06 (xfr#3, to-chk=3/9)
rsync2/
rsync2/dummy4.txt
1.07G 100% 152.56MB/s 0:00:06 (xfr#4, to-chk=2/9)
rsync2/dummy5.txt
1.07G 100% 147.59MB/s 0:00:06 (xfr#5, to-chk=1/9)
rsync2/dummy6.txt
1.07G 100% 146.81MB/s 0:00:06 (xfr#6, to-chk=0/9)
sent 6.44G bytes received 196 bytes 181.52M bytes/sec
total size is 6.44G speedup is 1.00
[daisuke@localhost test]$ ll
total 4
-rw-r--r--. 1 daisuke daisuke 741 May 7 17:42 rsynctest.log
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test1
drwxrwxr-x. 4 daisuke daisuke 34 May 7 01:29 test2
[daisuke@localhost test]$ cat rsynctest.log
2024/05/07 17:41:37 [4096] building file list
2024/05/07 17:41:37 [4096] created directory /home/daisuke/test/test2
2024/05/07 17:41:37 [4096] cd+++++++++ ./
2024/05/07 17:41:37 [4096] cd+++++++++ rsync1/
2024/05/07 17:41:43 [4096] >f+++++++++ rsync1/dummy1.txt
2024/05/07 17:41:48 [4096] >f+++++++++ rsync1/dummy2.txt
2024/05/07 17:41:54 [4096] >f+++++++++ rsync1/dummy3.txt
2024/05/07 17:41:54 [4096] cd+++++++++ rsync2/
2024/05/07 17:42:00 [4096] >f+++++++++ rsync2/dummy4.txt
2024/05/07 17:42:06 [4096] >f+++++++++ rsync2/dummy5.txt
2024/05/07 17:42:12 [4096] >f+++++++++ rsync2/dummy6.txt
2024/05/07 17:42:12 [4096] sent 6.44G bytes received 196 bytes 181.52M bytes/sec
2024/05/07 17:42:12 [4096] total size is 6.44G speedup is 1.00
指定したパスにログファイルが吐かれていました!
※ログの見方は長くなってしまうため本記事では割愛させていただきます。
🔶"–delete"の場合の実際の動き
[daisuke@localhost test]$ ls -R test1
test1:
rsync1 rsync2
test1/rsync1:
dummy1.txt dummy2.txt dummy3.txt
test1/rsync2:
dummy4.txt dummy5.txt dummy6.txt
[daisuke@localhost test]$ ls -R test2
test2:
rsync1 rsync2
test2/rsync1:
dummy1.txt dummy2.txt dummy3.txt
test2/rsync2:
dummy4.txt dummy5.txt dummy6.txt
上記のように既に同期された状態から、同期元のファイルを削除してからrsyncしてみる。
[daisuke@localhost test]$ ls -R test1
test1:
rsync1 rsync2
test1/rsync1:
dummy3.txt
test1/rsync2:
dummy6.txt
[daisuke@localhost test]$ ls -R test2
test2:
rsync1 rsync2
test2/rsync1:
dummy1.txt dummy2.txt dummy3.txt
test2/rsync2:
dummy4.txt dummy5.txt dummy6.txt
[daisuke@localhost test]$ rsync -avhP --delete --log-file=/home/daisuke/test/rsynctest.log /home/daisuke/test/test1/ /home/daisuke/test/test2/
sending incremental file list
deleting rsync1/dummy2.txt
deleting rsync1/dummy1.txt
deleting rsync2/dummy5.txt
deleting rsync2/dummy4.txt
rsync1/
rsync2/
sent 181 bytes received 104 bytes 190.00 bytes/sec
total size is 2.15G speedup is 7,535,030.34
同期元で削除したファイルが同期先からも削除されたことが確認できました!
完全に同期させるには追加されたファイルだけでなく削除されているファイルも状態を合わせる必要があるため
よく使用されるオプションになっています。
まとめ
これまで"cp","scp"を使っていたところももしかしたらrsyncのほうが有効的だったなという場面も少なくないので
業務上でも効率的に活用できるようになっていきたいです!