rsync工具同步方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsync工具同步方法相关的知识,希望对你有一定的参考价值。

rsync介绍

rsync是一个网络间的实时同步目录或文件的工具,能够实现数据增量同步,可以起到热备和比全量备份数据节省时间及带宽的优点,通常的备份文件或目录都是以拷贝形式全量备份,如果文件过于庞大,则需要很多时间,假如是通过网络间来拷贝一个全量备份,那则又会消耗较大的网络资源,rsync可以起到增量备份,可以只同步备份新增加的部分文件或目录,可以极大的减少时间和网络资源的使用
Rsync的特性如下:

1)支持拷贝特殊文件如链接,设备等

2)可以有排除指定文件或目录同步的功能,相当于打包命令tar

3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。

4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高

5)可以使用rcp,rsh,ssh等方式来配合传输文件,也可以通过直接的socker链接

6)支持匿名的或认证的进程模式传输,方便进行数据备份及镜像

rsync 同步格式(来源目录:需要拷贝的原文件或目录,目标目录:指拷贝到的目标目录上)
rsync [option选项] 来源目录 目的目录
rsync [option选项] 来源目录 用户@远程主机:目的目录
rsync [option选项] 用户@远程主机来源目录 目标目录
rsync [option选项] 来源目录 [email protected]远程主机::目标目录
rsync [option选项] [email protected]远程主机::来源目录 目标目录

使用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同步一个目录

----------------------------------进行目录同步
[[email protected] 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

--------------------------------------查看同步结果
[[email protected] 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

同步一个软连接和软连接源文件的目录到目标目录

[[email protected] 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]

这个错误是因为当前目录中包含失效的软连接文件,这时我们需要查找出失效的软连接文件进行修复或删除处理

[[email protected] 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/ 同步后软连接会被同步成一个普通的文件

--------------------------------恢复软连接文件
[[email protected] tmp]# mv ipta.sh ipt.sh          
[[email protected] 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

--------------------------------同步包含软连接的目录
[[email protected] 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

------------------------------------查看同步后的情况
[[email protected] tmp]# ls -l /tmp/tmp-1/
ipt
ipt.sh
passwd
siyan.ipt
helloworlrd

------------------------------------软连接被变为普通文件同步过来了
[[email protected] 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
[[email protected] 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

----------------------------------同步会删除目标内比源多的文件或内容
[[email protected] 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)被删除
[[email protected] 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 排除某些文件或目录不进行同步,需求如不同步日志文件

[[email protected] 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

------------------------------------------对比同步后的文件
[[email protected] 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排除的文件)

[[email protected] 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 选项会比较同步时所有文件的时间属性信息,同样的两个文件,如果目标的时间属性更新,则不会在同步时把源文件覆盖目标文件,针对目标上的这个比拷贝源还新的文件不做操作

[[email protected] tmp]# echo "gfdhgfjsdfgdfhgfgsxdfg" > 6666.txt     源文件内容
[[email protected] tmp]# echo "1235545" > /tmp/tmp-1/6666.txt          目标文件内容
[[email protected] 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
[[email protected] tmp]# cat /usr/local/src/tmp/6666.txt            查看源文件内容
gfdhgfjsdfgdfhgfgsxdfg 
[[email protected] 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

[[email protected] 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.
[email protected]‘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

[[email protected] src]# rsync -avr 192.168.1.223:/usr/local/src/tmp /usr/local/src
[email protected]‘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
-----------------------------将远程主机上的目录整个拷贝过来
[[email protected] src]# ls
tmp
[[email protected] src]# cd tmp/
[[email protected] 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


[[email protected] tmp]# rsync -avr -e "ssh -p 22" /usr/local/src/ 192.168.1.223:/tmp/tmp-1
[email protected]‘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
[[email protected] 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服务同步的方式请参阅其他资料

以上是关于rsync工具同步方法的主要内容,如果未能解决你的问题,请参考以下文章

远程同步工具rsync!

rsync+inotify实现代码实时同步

Rsync同步工具安装文档

rsync服务同步日志文件screen工具

10.28rsync工具介绍10.2910.30rsync常用选项10.31rsync通过ssh同步

详解rsync,一款卓越的增量同步工具(一)