rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
它的特性如下:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜像。 [1]
rsync同步工具的常用选项:
centos: yum -y install rsync xinetd
ubuntu: apt install rsync xinetd
#rsync服务通常基于超级守护进程xinetd管理的方式来实现,因此需要事先安装rysnc和xinetd
1)同步整个目录
rsync -a /boot /opt
[root@svr7 opt]# rsync -a /boot /opt
[root@svr7 opt]# ls /opt
boot
2)将目录下的文件同步到被同步目录
实际上就是加'/'与不加'/'的区别
rsync -a /boot/ /opt/
[root@svr7 opt]# rsync -a /boot/ /opt/
[root@svr7 boot]# ls
config-3.10.0-862.el7.x86_64
efi
grub
grub2
1) 验证-a选项
当同步对象是文件夹时,若缺少-a或-r选项则文件夹会被忽略,即同步失败
[root@svr7 opt]# mkdir /test
[root@svr7 opt]# touch /test/a.txt
[root@svr7 opt]# rsync /test/ /opt
skipping directory boot[root@svr7 opt]# ls //无文件
[root@svr7 opt]# rsync /test/a.txt /opt //不加选项只能以文件为同步单位,不能以目录
[root@svr7 opt]# ls
a.txt
[root@svr7 opt]# rm -rf /opt/* //清空文件夹
[root@svr7 opt]# rsync -a /test/ /opt //-a 也可以替换成-r 效果是一样的
[root@svr7 opt]# ls
a.txt当目录1中的数据出现权限、归属、修改时间等变化时,若文件内容不变默认不会同步,若希望目录2也同步这些变化,也需要-a选项。
[root@svr7 test]# ll /opt /test
/opt:
-rw-r--r-- 1 root root 0 8月 1 09:54 a.txt/test:
-rw-r--r-- 1 root root 0 8月 1 09:53 a.txt
[root@svr7 test]# chmod o+x /test/a.txt //修改文件权限
[root@svr7 test]# ll /test/a.txt
-rw-r--r-x 1 root root 0 8月 1 09:53 /test/a.txt[root@svr7 test]# rsync /test/a.txt /opt //不加-a选项 进行同步
[root@svr7 test]# ll /test /opt
/opt:
-rw-r--r-- 1 root root 0 8月 1 10:00 a.txt //opt下a.txt权限没有变化/test:
-rw-r--r-x 1 root root 0 8月 1 09:53 a.txt[root@svr7 test]# rsync -a /test/a.txt /opt //加入-a选项
[root@svr7 test]# ll /opt /test
/opt:
-rw-r--r-x 1 root root 0 8月 1 09:53 a.txt //权限变化/test:
-rw-r--r-x 1 root root 0 8月 1 09:53 a.txt
结论: 只要做rsync同步操作,都需要加上-a选项,事实证明任何情况下加-a 都是适用的
2) 验证-v选项
添加-v选项时,可以看到操作细节信息
[root@svr7 opt]# rsync -av /test/ /opt
sending incremental file list
./
a.txtsent 106 bytes received 38 bytes 288.00 bytes/sec
total size is 0 speedup is 0.00
3) 验证-n选项
将-n、-v选项合用,可以模拟同步过程,显示需要做哪些操作(但并不真的同步)。
[root@svr7 opt]# rm -rf /opt/* //删除文件下内容,避免干扰测试
[root@svr7 opt]# rsync -avn /test/ /opt
sending incremental file list
./
a.txtsent 99 bytes received 25 bytes 248.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
[root@svr7 opt]# ls //无文件
结论: -n 选项仅仅用于测试,与-v选项连用模拟同步过程
4) 验证--delete选项
rsync同步操作默认只是将目录1的数据同步到目录2,但如果目录2存在多余的文件却并不会去除,除非添加—delete选项。
[root@svr7 opt]# ls /opt //查看opt和test目录 根据delete选项描述 同步之后opt下的b.txt 将被删除
b.txt
[root@svr7 opt]# ls /test
a.txt[root@svr7 opt]# rsync -a --delete /test/ /opt //添加delete选项 注意delete要加双-
[root@svr7 opt]# ls /opt //再次查看 /opt下的b.txt被删除 而同步了test目录下的a.txt
a.txt
[root@svr7 opt]# ls /test
a.txt
结论: 加delete选项后 目录1和目录2的数据完全同步,目录2下多余的文件将被删除
rsync+SSH远程同步操作:
准备两台虚拟机svr7(192.168.4.7),pc207(192.168.4.207)
rsync [email protected]:/
[root@pc207 ~]# rsync [email protected]:/ //列出根目录下文件
Warning: Permanently added '192.168.4.7' (ECDSA) to the list of known hosts.
[email protected]'s password: //输入密码
dr-xr-xr-x 4,096 2019/08/01 09:53:13 .
lrwxrwxrwx 7 2019/01/26 12:33:13 bin
-rw-r----- 1,705 2019/07/17 09:56:21 etc.bak
-rw-r--r-- 10 2019/07/23 14:20:46 file1
-rw-r--r-- 10 2019/07/23 14:20:46 hdfile
lrwxrwxrwx 7 2019/01/26 12:33:13 lib
lrwxrwxrwx 9 2019/01/26 12:33:13 lib64
-rw-r----- 1,705 2019/07/17 09:56:30 named.bak
lrwxrwxrwx 8 2019/01/26 12:33:13 sbin
.............................
rsync -av -e "ssh -p 22" 同步目录 被同步目录
[root@svr7 opt]# ls /test //主机svr7下一个文件
a.txt[root@pc207 ~]# rsync -a [email protected]:/test/ /opt //将svr7下文件同步到 pc207的opt目录下,将远程目录同步到本机目录
Warning: Permanently added '192.168.4.7' (ECDSA) to the list of known hosts.
[email protected]'s password: //输入密码[root@pc207 ~]# ls /opt
a.txt
[root@pc207 ~]# rsync -a /opt/ [email protected]:/test/ //将本机文件同步到远程目录
这里有 两台虚拟机AB,每台机器上有自己的私钥,A将公钥私钥给B就可以免密登录B机器了(但是B仍然无法免密登录A)
[root@svr7 /]# ssh-keygen #一路回车
[root@svr7 /]# ls /root/.ssh/ #公钥 私钥生成位置[root@svr7 /]# ssh-copy-id [email protected] #传输公钥到虚拟机B
[root@svr7 /]# ssh [email protected] #直接登录无需密码
[root@svr7 /]# rsync -a /opt [email protected]:/opt -e 'ssh' //将本地文件同步到远程
这里只提一下思路,我们可以写一个sh脚本挂在后台(通过加&),使用inotifywait来监控要备份的文件,触发rsync的条件是该文件发生变化,或者通过对比前后变化的文件大小值,当大于某个值时进行备份,或者通过sleep控制间隙时间,两者的目的都是尽可能释放CPU和内存的占用。
另一种较简单,写一个定时任务即可,可以时每天的晚上12点或其他...