rsync远程同步和inotify实时同步
rsync远程同步
rsync(Remote Sync): 是一款开源,快速,多功能的可实现本地或远程主机数据同步与增量备份的优秀工具。(数据同步与备份的工具)可使本地主机不同分区或目录之间及本地和远程两台主机之间的数据快速同步,远程备份等功能 。
在同步备份时,默认情况下,rsync通过其独特的“quick check”算法,仅同步大小或者最后修改时间发生变化的文件或目录(也可根据权限,属主等变化同步,需要制定参数)。甚至是只同步一个文件里变化的内容部分,所以可以实现快速的同步数据的功能。
提示:传统的cp,scp工具拷贝每次均为完整拷贝,而rsync除了完整拷贝,还具备增量拷贝的功能,因此更加灵活。
rsync特性
1)支持拷贝特殊文件如链接,设备文件等
2)可以有排除指定文件或目录同步的功能
3)可以保持原来文件或目录的权限,时间,软硬链接等所有属性均不改变。
4)可实现增量同步,即只同步发生变化的数据,因此数据传输效率更高
生产场景
1)借助cron定时任务+rsync把所有客户服务器数据同步到备份服务器
2)针对公司重要数据备份混乱状况和领导提出备份全网数据的解决方案
3)通过本地打包备份,然后rsync结合inotify(监控)应用把全网数统一备份到一个固定存储服务器,然后在存储服务器上通过脚本检查并报警管理员备份结果
4)定期将IDC机房的数据备份公司的内部服务器,防止机房地震及火灾问题 导致数据丢失
实时同步,解决存储服务器的单点问题
rsync总结
rsync就是会同步指定的两端目录之间的数据,这个数据可以是特殊的数据。同步之前就先进行两端的数据的比对,只会同步两者之间不同的部分,并保留文件原本的属性。并且支持匿名的方式进行同步传输。所以rsync在备份、同步上就会较为快速。
软件安装
rsync官方地址: http://rsync.samba.org/
安装方式:源码安装、二进制RPM安装
#安装rsync
[root@master ~]# yum -y install rsync
本地同步语法
命令格式1:rsync 选项… 本地目录A 本地目录B #同步整个目录
命令格式2:rsync 选项… 本地目录A/ 本地目录B #只同步目录下的数据
常用选项
选项 | 作用 |
---|---|
-n | 测试同步过程,不做实际修改 |
--delete | 删除目标目录下多余的文档 |
-v | 显示详细操作信息 |
-z | 传输过程中启用压缩/解压缩 |
-a | 递归同步,包含目录/字子目录及所有文件、保留符号链接文件、保留文件权限、时间标记、保留文件的属主/属组标记、保留设备文件及其他特殊文件 |
本地同步
#在本地创建2个目录使用rsync实现数据同步
[root@master ~]# mkdir /test1 /opt/test2
#将/test1目录同步至/opt/test2目录下(同步整个目录)
[root@master ~]# rsync -avz /test1 /opt/test2
sending incremental file list #发送增量文件列表
test1/
sent 59 bytes received 20 bytes 158.00 bytes/sec
total size is 0 speedup is 0.00
#sent:发送字节59
#received:接收字节20
#158.00:字节/秒
#total:总大小为0
#speedup is:加速值为0.00
#查看目录是否同步成功
[root@master ~]# ls /opt/test2/
test1
#在/test1目录下创建测试文件
[root@master ~]# touch /test1/xx.txt
#同步/test1/目录下的数据至/opt/test2目录下
[root@master ~]# rm -rf /opt/test2/*
[root@master ~]# rsync -avz /test1/ /opt/test2
#查看数据是否同步
[root@master ~]# ls /opt/test2
xx.txt
#在/test1目录下创建新文件验证是否只同步新增加的数据
[root@master ~]# touch /test1/abc.txt
[root@master ~]# ls /test1
abc.txt xx.txt
#执行同步
[root@master ~]# rsync -avz /test1/ /opt/test2
sending incremental file list
./
abc.txt #只同步了新增加的文件
sent 130 bytes received 38 bytes 336.00 bytes/sec
total size is 0 speedup is 0.00
[root@master ~]# ls /opt/test2
abc.txt xx.txt
#向xx.txt文件增加内容验证同步
[root@master ~]# echo xxoo > /test1/xx.txt
[root@master ~]# cat /test1/xx.txt
xxoo
#执行同步
[root@master ~]# rsync -avz /test1/ /opt/test2
sending incremental file list
xx.txt #只同步变化的文件
sent 135 bytes received 35 bytes 340.00 bytes/sec
total size is 5 speedup is 0.03
[root@master ~]# cat /opt/test2/xx.txt
xxoo
#在执行同步时,如果目标目录下的内容发生变化,源目录不会跟着改变
[root@master ~]# cd /opt/test2
[root@master test2]# touch test{1..100}
#执行同步操作
[root@master test2]# rsync -avz /test1/ /opt/test2
sending incremental file list
./ #没有任何的变化,既没同步任何的数据
sent 93 bytes received 19 bytes 224.00 bytes/sec
total size is 5 speedup is 0.04
#执行同步时,删除目标目录下多余的文件
[root@master test2]# rsync -avz --delete /test1/ /opt/test2
#查看test2目录
[root@master test2]# ls
abc.txt xx.txt
远程同步语法
命令格式1:rsync 本地目录 用户名@对方IP地址:/目标目录 #同步源目录本身
命令格式2:rsync 本地目录/ 用户名@对方IP地址:/目标目录 #同步源目录下内容
远程同步
#客户端主机安装rsync程序
[root@client ~]# yum -y install rsync
#将本地主机/test1目录下内容同步到其他主机
[root@master ~]# rsync -avz /test1/ root@192.168.0.28:/opt
root@192.168.0.28's password:
sending incremental file list
./
abc.txt
xx.txt
sent 174 bytes received 57 bytes 154.00 bytes/sec
total size is 5 speedup is 0.02
#远程主机查看是否同步成功
[root@client ~]# ls /opt
abc.txt xx.txt
[root@client ~]# cat /opt/xx.txt
xxoo
#在本地主机/test1目录下创建文件执行同步
[root@master ~]# touch /test1/test{1..10}
[root@master ~]# ls /test1
abc.txt test10 test3 test5 test7 test9
test1 test2 test4 test6 test8 xx.txt
[root@master ~]# rsync -avz /test1/ root@192.168.0.28:/opt
root@192.168.0.28's password:
sending incremental file list
./
test1
test10
test2
test3
test4
test5
test6
test7
test8
test9
#远程主机验证是否同步成功
[root@client ~]# ls /opt
abc.txt test10 test3 test5 test7 test9
test1 test2 test4 test6 test8 xx.txt
rsync+inotify实时同步
inotify 是Linux内核用于通知用户空间的程序文件系统变化的机制,如文件增加、删除等事件可以立刻让用户得知。
inotify官方地址:http://download.sf.net/inotify-tools/
环境前准备
#配置同步主机之间ssh免密登录
[root@master ~]# ssh-keygen
[root@master ~]# ssh-copy-id root@192.168.0.28
[root@master ~]# ssh 192.168.0.28
[root@client ~]# exit
源码安装inotify
#安装inotify依赖包(gcc)
[root@master ~]# yum -y install gcc
#解压源码包
[root@master ~]# tar -xf inotify-tools.tar.gz 、
[root@master ~]# cd tools/
[root@master tools]# ls
inotify-tools-3.13.tar.gz other
[root@master tools]# tar -xf inotify-tools-3.13.tar.gz
[root@master tools]# cd inotify-tools-3.13
[root@test inotify-tools-3.13]# ./configure --prefix=/usr/local/inotify #指定安装路径
[root@test inotify-tools-3.13]# make
[root@test inotify-tools-3.13]# make install
[root@master ~]# ls /usr/local/inotify/
bin include lib share
[root@master ~]# ls /usr/local/inotify/bin
inotifywait(命令) inotifywatch
#将命令程序链接到PATH路径下,方便后期的使用
[root@master ~]# ln -s /usr/local/inotify/bin/inotifywait /sbin
inotify使用方式
命令格式:inotify 选项 目标文件
常用选项
选项 | 功能 |
---|---|
-m | 持续监控,捕获一个事件后不退出 |
-r | 递归监控,包括子目录 |
-q | 减少屏幕输出信息 |
-e | 指定监控的:modify(修改),move(移动、改名),create(创建),delete(删除),attrib(权限) |
配置实时监控
#监控本机/test1目录
[root@master ~]# vim rsync.sh
#!/bin/bash
while inotifywait -rq -e modify,create,delete,attrib /test1/
do
rsync -avz --delete /test1/ root@192.168.0.28:/opt
done
#实现从本地到远程的Web目录推送
#源目标:/var/www/html
#参考脚本
#!/bin/bash
FROM_DIR=“/var/www/html/”
RSYNC_CMD=“rsync –za --delete $FROM_DIR root@192.168.0.211:/var/www/html”
while inotify –rqq –e modify,move,create,delete,attrib $FROM_DIR #q不显示输出
do
$RSYNC_CMD
done &