rsync介绍
rsync是一个网络间的实时同步目录或文件的工具,能够实现数据增量同步,可以起到热备和比全量备份数据节省时间及带宽的优点,通常的备份文件或目录都是以拷贝形式全量备份,如果文件过于庞大,则需要很多时间,假如是通过网络间来拷贝一个全量备份,那则又会消耗较大的网络资源,rsync可以起到增量备份,可以只同步备份新增加的部分文件或目录,可以极大的减少时间和网络资源的使用 Rsync的特性如下:
1)支持拷贝特殊文件如链接,设备等
2)可以有排除指定文件或目录同步的功能,相当于打包命令tar
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接
6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像
rsync 同步格式(来源目录:需要拷贝的原文件或目录,目标目录:指拷贝到的目标目录上) rsync [option选项] 来源目录 目的目录 rsync [option选项] 来源目录 用户@远程主机:目的目录 rsync [option选项] 用户@远程主机来源目录 目标目录 rsync [option选项] 来源目录 user@远程主机::目标目录 rsync [option选项] user@远程主机::来源目录 目标目录
使用yum安装rsync同步工具:yum install -y rsync
rsync常用选项 -a 包含选项 -rtokgoD -r 同步目录时需要添加的选项,类似cp时的-r选项 -v 同步时输出的信息,显示同步的过程 -l 保留软连接,不会同步软连接指向的源文件,这个-l选项同步会导致软连接失效 -L 保留软连接同时同步软连接的源文件 -p 同步时保持文件原权限属性,不改变文件的原权限 -o 同步文件或目录时保持原先的属主,不改变文件的原属主 -g 同步时保持文件或目录的属组,不改变文件的原属组 -D 保持设备文件信息 -t 同步时保持文件时间的属性,不改变文件的原时间属性 --delete 同步过程中对比目标是否有源没有的文件,如果目标拥有源没有的文件,则将目标内比源多的文件内容删除处理,如同步web程序目录时排除掉产生的log日志目录不进行同步 --exclude 过滤掉某些文件不做同步,如--exclude "1.log" 会把文件名包含1.log的文件或目录过滤掉不做同步 -P 显示同步过程,比如传输速率,比-v选项更加详细 -u 该选项表示为:如果目标中存在的文件比源中的文件新时,则不同步该文件,同步时以最新的文件为主,源不会去覆盖目标内的文件内容 -z 传输时压缩,以zip格式压缩,压缩时节省带宽,但是相对的比较消耗CPU
rsync常用选项示例 使用rsync同步一个目录
----------------------------------进行目录同步
[root@localhost src]# rsync -av /usr/local/src/tmp/ /tmp/tmp-1
sending incremental file list
created directory /tmp/tmp-1
./
ipt.sh
passwd
siyan.ipt
helloworld/
sent 2,487 bytes received 231 bytes 5,436.00 bytes/sec
total size is 1,821 speedup is 0.67
--------------------------------------查看同步结果
[root@localhost src]# ll -h /tmp/tmp-1/
总用量 36K
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt.sh
-rw-r--r-- 1 root root 487 7月 1 18:35 passwd
-rw-r--r-- 1 root root 472 7月 16 14:09 siyan.ipt
同步一个软连接和软连接源文件的目录到目标目录
[root@localhost tmp]# rsync -avL /usr/local/src/tmp/ /tmp/tmp-1/
sending incremental file list
symlink has no referent: "/usr/local/src/tmp/ipt"
./
ipta.sh
sent 677 bytes received 39 bytes 1,432.00 bytes/sec
total size is 1,821 speedup is 2.54
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1178) [sender=3.1.2]
这个错误是因为当前目录中包含失效的软连接文件,这时我们需要查找出失效的软连接文件进行修复或删除处理
[root@localhost tmp]# ls -l
总用量 36
lrwxrwxrwx 1 root root 6 7月 16 22:28 ipt -> ipt.sh ← 失效软连接会反复闪烁
-rw-r--r-- 1 root root 358 7月 13 01:31 ipta.sh
-rw-r--r-- 1 root root 487 7月 1 18:35 passwd
-rw-r--r-- 1 root root 472 7月 16 14:09 siyan.ipt
使用-L同步一个包含软连接的文件,创建一个软连接文件然后进行同步 命令 : rsync -avL /usr/local/src/tmp/ /tmp/tmp-1/ 同步后软连接会被同步成一个普通的文件
--------------------------------恢复软连接文件
[root@localhost tmp]# mv ipta.sh ipt.sh
[root@localhost tmp]# ls -l
总用量 36
lrwxrwxrwx 1 root root 6 7月 16 22:28 ipt -> ipt.sh
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt.sh
-rw-r--r-- 1 root root 487 7月 1 18:35 passwd
-rw-r--r-- 1 root root 472 7月 16 14:09 siyan.ipt
--------------------------------同步包含软连接的目录
[root@localhost tmp]# rsync -avL /usr/local/src/tmp/ /tmp/tmp-1/
sending incremental file list
./
ipt
sent 686 bytes received 39 bytes 1,450.00 bytes/sec
total size is 2,179 speedup is 3.01
------------------------------------查看同步后的情况
[root@localhost tmp]# ls -l /tmp/tmp-1/
ipt
ipt.sh
passwd
siyan.ipt
helloworlrd
------------------------------------软连接被变为普通文件同步过来了
[root@localhost tmp]# ls -l /tmp/tmp-1/
总用量 40
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt.sh
-rw-r--r-- 1 root root 487 7月 1 18:35 passwd
-rw-r--r-- 1 root root 472 7月 16 14:09 siyan.ipt
--delete 选项 同步覆盖掉源内不存在的文件,如目标中存在1234.log,源里不存在1234.log,那么同步时会删除掉目标内的1234.log文件
----------------------------------目标目录中存在新文件123.log
[root@localhost tmp]# ls -l /tmp/tmp-1/
总用量 40
-rw-r--r-- 1 root root 20 7月 5 10:43 1
-rw-r--r-- 1 root root 0 7月 16 23:11 123.log
-rw-r--r-- 1 root root 100 7月 5 10:19 1.txt
-rw-r--r-- 1 root root 25 7月 5 10:44 2
-rw-r--r-- 1 root root 93 7月 5 15:29 a
-rw-r--r-- 1 root root 242 7月 5 10:19 awkshell.sh
drwxr-xr-x 2 root root 6 7月 1 20:10 helloworld
-rw-r--r-- 1 root root 24 7月 5 10:20 id.txt
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt.sh
-rw-r--r-- 1 root root 487 7月 1 18:35 passwd
-rw-r--r-- 1 root root 472 7月 16 14:09 siyan.ipt
----------------------------------同步会删除目标内比源多的文件或内容
[root@localhost tmp]# rsync -avL --delete /usr/local/src/tmp/ /tmp/tmp-1/
sending incremental file list
deleting 123.log
./
sent 285 bytes received 31 bytes 632.00 bytes/sec
total size is 2,179 speedup is 6.90
------------------------------------查看同步后的结果,目标比源多的文件(123.log)被删除
[root@localhost tmp]# ls -l /tmp/tmp-1/
总用量 40
-rw-r--r-- 1 root root 20 7月 5 10:43 1
-rw-r--r-- 1 root root 100 7月 5 10:19 1.txt
-rw-r--r-- 1 root root 25 7月 5 10:44 2
-rw-r--r-- 1 root root 93 7月 5 15:29 a
-rw-r--r-- 1 root root 242 7月 5 10:19 awkshell.sh
drwxr-xr-x 2 root root 6 7月 1 20:10 helloworld
-rw-r--r-- 1 root root 24 7月 5 10:20 id.txt
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt
-rw-r--r-- 1 root root 358 7月 13 01:31 ipt.sh
-rw-r--r-- 1 root root 487 7月 1 18:35 passwd
-rw-r--r-- 1 root root 472 7月 16 14:09 siyan.ipt
rsync --exclude 排除某些文件或目录不进行同步,需求如不同步日志文件
[root@localhost tmp]# rsync -avL --exclude "awkshell.sh" --exclude "id.txt" /usr/local/src/tmp/ /tmp/tmp-1/
sending incremental file list
./
1
1.txt
2
a
ipt
ipt.sh
passwd
siyan.ipt
helloworld/
sent 2,498 bytes received 175 bytes 5,346.00 bytes/sec
total size is 1,913 speedup is 0.72
------------------------------------------对比同步后的文件
[root@localhost tmp]# tree /usr/local/src/tmp/ /tmp/tmp-1/
/usr/local/src/tmp/
├── 1
├── 1.txt
├── 2
├── a
├── awkshell.sh
├── helloworld
├── id.txt
├── ipt -> ipt.sh
├── ipt.sh
├── passwd
└── siyan.ipt
/tmp/tmp-1/
├── 1
├── 1.txt
├── 2
├── a
├── helloworld
├── ipt
├── ipt.sh
├── passwd
└── siyan.ipt
rsync -P 选项 显示传输时的详细信息,传输速率,传输时间等信息(这次同步了--exclude排除的文件)
[root@localhost tmp]# rsync -avLP /usr/local/src/tmp/ /tmp/tmp-1/
sending incremental file list
awkshell.sh
242 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=6/12)
id.txt
24 100% 23.44kB/s 0:00:00 (xfr#2, to-chk=5/12)
sent 634 bytes received 55 bytes 1,378.00 bytes/sec
total size is 2,179 speedup is 3.16
rsync -u 选项会比较同步时所有文件的时间属性信息,同样的两个文件,如果目标的时间属性更新,则不会在同步时把源文件覆盖目标文件,针对目标上的这个比拷贝源还新的文件不做操作
[root@localhost tmp]# echo "gfdhgfjsdfgdfhgfgsxdfg" > 6666.txt 源文件内容
[root@localhost tmp]# echo "1235545" > /tmp/tmp-1/6666.txt 目标文件内容
[root@localhost tmp]# rsync -avPu /usr/local/src/tmp/ /tmp/tmp-1/ -u指定新文件不同步的操作
sending incremental file list
sent 319 bytes received 13 bytes 664.00 bytes/sec
total size is 1,850 speedup is 5.57
[root@localhost tmp]# cat /usr/local/src/tmp/6666.txt 查看源文件内容
gfdhgfjsdfgdfhgfgsxdfg
[root@localhost tmp]# cat /tmp/tmp-1/6666.txt 查看目标文件内容跟同步之前没有改变
1235545
rsync主机间的同步方式
rsync推送同步,把文件或目录推送到其他主机上:rsync -avP 需要同步的目录 目标主机ip:/目标目录路径,如: rsync -avP /usr/local/src/ 192.168.1.223:/usr/local/src/tmp
[root@localhost src]# rsync -avP /usr/local/src/ 192.168.1.223:/usr/local/src/tmp
The authenticity of host '192.168.1.223 (192.168.1.223)' can't be established.
ECDSA key fingerprint is b5:e7:41:c5:d5:90:ab:36:27:41:40:06:72:1d:9c:f6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.223' (ECDSA) to the list of known hosts.
root@192.168.1.223's password:
sending incremental file list
./
Python-3.7.0.tgz
22,745,726 100% 63.90MB/s 0:00:00 (xfr#1, to-chk=0/2)
sent 22,751,393 bytes received 38 bytes 2,676,638.94 bytes/sec
total size is 22,745,726 speedup is 1.00
推送方式的同步结果
rsync拉取同步的方式,对远程主机的整个目录进行主动拷贝: rsync 远程IP:/拷贝的目录路径 /存放在本机的路径/,如下命令:rsync -avr 192.168.1.223:/usr/local/src/tmp /usr/local/src
[root@localhost src]# rsync -avr 192.168.1.223:/usr/local/src/tmp /usr/local/src
root@192.168.1.223's password:
receiving incremental file list
tmp/
tmp/1
tmp/1.txt
tmp/2
tmp/6666.txt
tmp/Python-3.7.0.tgz
tmp/a
tmp/awkshell.sh
tmp/id.txt
tmp/ipt -> ipt.sh
tmp/ipt.sh
tmp/passwd
tmp/siyan.ipt
tmp/helloworld/
sent 248 bytes received 22,753,964 bytes 4,137,129.45 bytes/sec
total size is 22,747,576 speedup is 1.00
-----------------------------将远程主机上的目录整个拷贝过来
[root@localhost src]# ls
tmp
[root@localhost src]# cd tmp/
[root@localhost tmp]# ls
1 2 a helloworld ipt passwd siyan.ipt
1.txt 6666.txt awkshell.sh id.txt ipt.sh Python-3.7.0.tgz
主动同步的执行结果,结合上条同步实践可以看到把远程主机的tmp整个目录拷贝过来了,两台机器上的目录下的文件数量和名称也是一致的
rsync通过非默认的ssh端口同步
通过非22端口同步,指定自定义ssh端口进行同步,rsync -avr -e "ssh -p 指定自定义端口" /本机存放的目录/ 远程主机IP:/远程目录/ ,命令如:rsync -avr -e "ssh -p 22" /tmp/ 192.168.1.223:/tmp/tmp-1
[root@localhost tmp]# rsync -avr -e "ssh -p 22" /usr/local/src/ 192.168.1.223:/tmp/tmp-1
root@192.168.1.223's password:
sending incremental file list
./
tmp/
tmp/1
tmp/1.txt
tmp/2
tmp/6666.txt
tmp/Python-3.7.0.tgz
tmp/a
tmp/awkshell.sh
tmp/id.txt
tmp/ipt -> ipt.sh
tmp/ipt.sh
tmp/passwd
tmp/siyan.ipt
tmp/helloworld/
sent 22,753,983 bytes received 243 bytes 5,056,494.67 bytes/sec
total size is 22,747,576 speedup is 1.00
[root@localhost tmp]# ls
1 2 a helloworld ipt passwd siyan.ipt
1.txt 6666.txt awkshell.sh id.txt ipt.sh Python-3.7.0.tgz
同步后将主动同步时的tmp目录进行了删除,从这一点也可以看到进行了同步
此外rsync可以通过系统服务的方式来定时同步主机之间的文件,关于如何配置rsync服务同步的方式请参阅其他资料