rsync + inotify简介
inotify是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要。在单独使用rsync同步时,每次同步它会把全部的文件读取一遍,而inotify+rsync同步是触发式同步。
Rsync是一个远程同步工具,融合了cp,和scp,Rsync 使用所谓的“ Rsync 演算法 ”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsyncserver 的机器也叫backupserver ,一个 Rsyncserver 可同时备份多个 client 的数据;也可以多个 Rsync server 备份一个client 的数据。特点:1、可以镜像保存整个目录树或文件系统;2、较高的数据传输效率;3、可以借助于ssh实现安全数据传输;4、支持匿名传输;
rsync命令的工作模式:
第一种模式:shell模式,也称作本地模式;
第二种模式:远程shell模式,可以利用ssh协议承载其远程传输过程;
第三种模式:列表模式,仅列出源中的内容,-nv
第四种模式:服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求
rsync命令的选项:
-n: 同步测试,不执行真正的同步过程;
-v: 详细输出模式
-q: 静默模式
-c: checksum,开启校验功能
-r: 递归复制
注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本向;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;
-a: 归档,保留文件的原有属性;
-p: 保留文件的权限;
-t: 保留文件的时间戳;
-l: 保留符号链接
-g: 保留属组
-o: 保留属主
-D:保留设备文件
-e ssh: 使用ssh作为传输承载;
-z: 压缩后传输;
--progress: 显示进度条
--stats: 显示如何执行压缩和传输
Accessvia rsync daemon(语法格式):
Pull拉取文件: rsync [OPTION...] [USER@]HOST::SRC...[DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push推送文件: rsync [OPTION...] SRC...[USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
rsync服务模式例:在172.16.31.31 当服务器,172.16.31.30,当客户端,在服务器上创建/data 目录,rsync自己监听,因为是瞬时守护进程,要借助于超级守护进程。
1,在服务器端安装超级守护进程
#yum installxinetd
#chkconfig rsync on
安装完后,会在/etc/xinetd.d/目录下生成一个rsync文件
2,编辑rsync文件
把disable= yes 改为 no 启用rsync服务
3、为rsync提供配置文件
/etc/rsyncd.conf
配置文件分两段:
全局配置段:1个
共享配置段:多个
[SHARE_NAME]
配置示例:
#Global Settings //全局定义段,只能有一个。
uid= nobody
gid= nobody
usechroot = no // rsync时是否支持chroot
maxconnections = 10 //最大连接次数
strictmodes = yes //启用严格模式
pidfile = /var/run/rsyncd.pid
logfile = /var/log/rsyncd.log
#Directory to be synced //定义同步的目录,可以有多个
[tools]
path= /data
ignoreerrors = yes //传输数据时是否忽略错误
readonly = no
writeonly = no
hostsallow = 172.16.0.0/16 //允许哪些主机通过,也就是白名单
hostsdeny = *
list= false //允许不允许列出文件
uid = root //指定此共享使用那个用户身份运行
gid = root // 指定此共享使用那个用户组身份运行
3、启动服务
#service xinetd start
监听于873/tcp
测试
rsync /etc/fstab 172.16.31.31::tools
rsync -a /etc/pam.d 172.16.31.31::tools //推送目录
rsync -a/etc/pam.d / 172.16.31.31::tools //推送文件
rsync -a172.16.31.31::tools ./ //拉取目录
rsync -a172.16.31.31::tools/centos.repo ./ //拉取文件
也可以基于用户认证配置,在[tools]最后添加
auth users = USER1, USER2 指定可以通过rsync同步的用户
secrets file =/etc/rsyncd.passwd 指定验证用户的文件
然后创建密码文件/etc/rsyncd.passwd
username:password
此文件不能允许其它用户有访问权限,且密码不能超过8个字符;
chmod 666 etc/rsyncd.passwd
用法 rsync [email protected]::tools/./
INOTUFY:
不过这样做有缺陷,在传数据的过程中,会出现断电,数据中断什么的,所以这时候类外一个技术inotify,弥补了这个缺陷
inotify: 在服务器端,可用于定义监控指定的目录下的所有文件,一旦有文件的元数据发生改变,即会通知客户端来拉取
编译安装
#tar xf inotify-tools-3.14.tar.gz
#cdinotify-tools-3.14
#./conifgure
#make&& make install
#cd /usr/local/bin
#ls
inotifywait inotifywatch 生成这两个文件
#yum install inotify-tools
inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。
inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息
inotifywait相关参数
-m 即--monitor,表示始终保持事件监听状态。
-r 即--recursive,表示递归查询目录。
-q 即--quiet,表示打印出监控事件。
-e 即--event,通过此参数可以指定要监控的事件
实验内容:2个客户端,一个rsync + inotify服务器
serveice1 ip 172.16.31.31
serveice1 ip 172.16.31.32
服务器端 ip 172.16.31.30
1 安装Rsync服务端S1
#yum -y install xinetdrsync
2 为rsync服务提供配置文件
uid = nobody
gid = nobody
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[s1]
path = /s1/data
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.31.30
hosts deny = *
list = yes
uid = root
gid = root
auth users = s1user
secrets file = /etc/s1.passwd
3 创建目录
# mkdir /s1/data
#vim /etc/s1.passwd
s1user:user
#chmod 600 /etc/ftp.passwd
4 配置Rsync服务端(172.16.31.30)
#Global Settings
uid = nobody
gid = nobody
use chroot = no
max connections = 5
timeout = 600
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
[s2]
path = /s2/data
ignore errors = yes
read only = no
write only = no
hosts allow = 172.16.31.32
hosts deny = *
list = yes
uid = root
gid = root
auth users = s2user
secrets file = /etc/s2.passwd
5 创建目录
# mkdir /s2/data
#vim /etc/s2.passwd
s2user:user
#chmod 600 /etc/s2.passwd
6 设置 (172.16.31.32)rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名
#echo "s1user" > /etc/web.passwd
#echo "s2user" > /etc/ftp.passwd
#chomd 600 /etc/s1.passwd
#chmod 600 /etc/s2.passwd
7 在rsync客户端(172.16.31.30)编写rsync脚本
#!/bin/bash
src=/var/web/
des1=s2
des2=s1
host1=172.16.31.32
host2=172.16.31.31
user1=s2
user2=s1
/usr/bin/inotifywait -mrq--timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -emodify,delete,create,attrib $src | while read file DATETIME DIR;
do
/usr/bin/rsync -vzrtopg --delete --progress $src$user1@$host1::$des1 --password-file=/etc/s2.passwd
/usr/bin/rsync -vzrtopg --delete --progress $src$user2@$host2::$des2 --password-file=/etc/s1.passwd
echo "${files} was rsynced" >> /var/log/rsync.log2>&1
done
接着,将这个脚本命名为rsync.sh,放到/var/web目录下,然后给定可执行权限,放到后台运行:
#chmod 755/var/web/rsync.sh
本文出自 “Linux” 博客,转载请与作者联系!