赞
踩
我最近在使用rsync,但是一直在这三者之间徘徊rsync、inotify、sersync。于是记录一下这三者之间的关系。
rsync是把文件进行同步的工具,具有很好的实时性。
inotify是监控某文件,并记录其中有什么文件做了改变,需要写脚本进行调用rsync的命令进行文件同步。
sersync是在inotify的基础上做了包装,可以自动调用rsync。
为此写了三篇笔记,第一篇是rsync,第二篇是rsync+inotify,第三篇是rsync+sersync
1、服务说明
Rsync 是一款开源,快速,多功能,可实现全量及增量(差异化)的本地或远程数据同步备份工具,适用于 Linux、Windows 等多种操作系统,常用于以下常见:
在同步数据时,rsync 默认通过独特的quick check 算法,它仅同步大小或者最后修改时间发生变化的文件或目录。
当然也可以根据权限,属主等属性的变化同步,但需要指定相应的参数。
甚至可以实现只同步一个文件里有变化的内容部分,所以 rsync 可以实现快速的同步备份数据。
rsync 是一个典型的 C/S 架构,默认监听873端口。
2、特性说明
rsync 具有的特性:
rsync 的缺点:
3、服务安装
准备两台 CentOS 7 的机器,IP 地址为:node-01(192.168.200.101)node-02(192.168.200.102)都安装好 rsync:
# 安装服务
yum -y install rsync
# 添加用户
useradd rsync -s /sbin/nologin -M
# 创建测试数据目录,由于同步真实用户使用的是 rsync 用户,所以需要给目录授权
mkdir /data
chown rsync.rsync /data/
Copy to clipboardErrorCopied在两台机器上都创建 /data目录用于数据测试。
4、服务端配置
通过命令可看到配置文件支持的配置和说明:
man rsyncd.conf
node-01:服务端配置主配置文件 /etc/rsyncd.conf
# RSYNC Config # 指定传输文件使用的用户 uid = rsync # 指定传输文件使用的用户组 gid = rsync # 安全设置,切换到安全目录 use chroot = no # 最大连接数 max connections = 10 # 客户端超时时间,单位秒,设置为 0 不超时 timeout = 900 # PID 文件 pid file = /var/run/rsyncd.pid # 锁文件 lock file = /var/run/rsync.lock # 日志文件 log file = /var/log/rsyncd.log # 日志记录方式 transfer logging = yes # 忽略文件 exclude = lost+found/ # 忽略不可读文件 ignore nonreadable = yes # 传输时不压缩的文件 dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 现在的版本需要添加,保留文件的完整属性 fake super = yes # 模块 [data] # 对应的目录 path = /data # 传输的删除时忽略 I/O 错误,报错会跳过--delete ignore errors # 允许写入 read only = false # 不允许列出 list = false # 允许的网段,多个使用空格隔开 hosts allow = 192.168.200.0/24 # 拒绝的网段,拒绝所有 hosts deny = 0.0.0.0/32 # 连接的虚拟用户,非系统用户 auth users = rsync_user # 虚拟用户的账号密码文件 secrets file = /etc/rsync-data.password # 注释说明 comment = Test file share
node-01:创建密码文件 /etc/rsync-data.password
echo "rsync_user:123456" > /etc/rsync-data.password
chmod 600 /etc/rsync-data.password
node-01:启动服务
rsync --daemon
netstat -tlunp | grep 873
如图所示:
5、客户端配置
不管是推送还是拉取文件,都是通过客户端向服务端发起,所以客户端根本不需要配置,只需要有 rsync 命令和服务端的密码即可。
node-02:配置密码文件 /etc/rsync-data.password
echo "123456" > /etc/rsync-data.password
chmod 600 /etc/rsync-data.password
和服务端不同的是,客户端的文件只需要密码,不需要数据传输虚拟用户名。但是密码文件的权限必须改为600
6、发送测试
发送文件的方向为客户端向服务端发送。
node-02:创建文件测试发送
# 创建文件
echo "Hello World" > demo.txt
# 发送文件
rsync -avz demo.txt rsync_user@'192.168.200.101'::data/hello.txt --password-file=/etc/rsync-data.password
如图所示:
node-01:查看文件
可以发现文件名称修改了,并且保存的用户是 rsync。
注:有的时候命名传输过去了,但是依然有报错:rsync: chgrp “/.” (in ftp2) failed: Operation not permitted (1)
经排查是由于-a参数导致的,因为-a是归档模式传输,并保持所有文件属性,等价于-rtopgDl(还没有具体深入研究),可以使用下面这个命令替代
7、参数说明
rsync 中常用的参数包含如下一些:
-a:--archive,归档模式,表示以递归方式传输文件,并保持所有文件属性,等价于 -rtopgDl
-v:--verbose,详细模式输出,传输时的进度等信息。
-z:--compress,传输时进行压缩以提高传输效率,--compress-level=NUM 可按级别压缩。
-r:对子目录以递归模式,即目录下的所有目录都同样传输。
-o:保留文件属性。
-p:保留文件权限。
-g:保留文件组权限。
-D:保留设备文件信息。
-l:保留文件软链接。
-P:显示同步的过程及传输时的进度等信息。
-e:使用的信道协议,指定替代 rsh 的 shell 程序,例如:ssh。
--exclude=PATTERN:指定排除不需要传输的文件模式。
--delete:让目标目录 SRC 和源目录数据 DST 一致。
实际应用中常用的参数:
-avzP:带提示的文件传输。
-az:定时任务不用输出过程。
8、同步命令
# 推送文件
rsync -avz 本地文件 同步用户@'服务端IP'::模块名/文件名 --password-file=密码文件
# 拉取文件
rsync -avz 同步用户@'服务端IP'::模块名/文件名 本地路径 --password-file=密码文件
注意,这种写法在 IP 和模块之前需要使用 ::,如果不想改文件名字,推送时候模块名后不加文件名即可。
另外一种写法:
# 推送文件
rsync -avz 本地文件 rsync://同步用户@'服务端IP':模块名/文件名 --password-file=密码文件
# 拉取文件
rsync -avz rsync://同步用户@'服务端IP':模块名/文件名 本地路径 --password-file=密码文件
此时就不需要使用 ::。
9、完全同步
node-02:创建相关文件目录并同步给 node-01
# 创建相关目录文件测试
cd /data/
mkdir a b c
touch a/a.txt b/b.txt c/c.txt
touch e.txt
# 同步文件
rsync -avz /data/ rsync_user@'192.168.200.101'::data/ --password-file=/etc/rsync-data.password
此时查了 node-01上面的文件:
可以发现虽然同步的,但是 node-01 上面的文件和 node-02 上不一致,旧的文件还在。
node-02:通过 --delete参数处理同步:
rsync -avz --delete /data/ rsync_user@'192.168.200.101'::data/ --password-file=/etc/rsync-data.password
查看 node-01:
此时 node-01 和 node-02 才完全保持一致。
10、排除文件
有些时候某些文件不想同步,就可以加入参数 --exclude:
node-02:排除单个文件
# 创建新文件
cd /data/
touch d.txt
# 同步文件,排除指定文件
rsync -avz --delete --exclude="d.txt" /data/ rsync_user@'192.168.200.101'::data/ --password-file=/etc/rsync-data.password
在 node-01上查看:
可以发现文件并未同步。
node-01:删除所有文件
rm -rf /data/*
node-02:排除多个文件
# 排除多个文件
rsync -avz --delete --exclude={a,b,c} /data/ rsync_user@'192.168.200.101'::data/ --password-file=/etc/rsync-data.password
在 node-01上面查看:
11、使用 SSH
除了使用默认的 rsh传输数据,也可以指定其它协议,如 ssh。
node-02:通过 ssh 传输文件
rsync -avz -e "ssh -p 22" /data/ root@192.168.200.101:/data/
此时就不需要模块,密码文件这些,类似 scp 的操作,需要手动输入密码,当然服务器可以配置免密登录。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。