![](https://img.haomeiwen.com/i9500234/32cc8dac78f0023f.jpg)
简介
rsync是一个同步工具,支持增量和全量备份。配合inotify可以实现同步备份。
实验准备
192.168.80.10
,192.168.80.20
这两台服务器分别为源主机和目标主机,分别在两台服务器上建立/rsyncsrc
和/rsyncdes
用来存放实验文件。
安装
一、仅rsync的方式
对于源主机而言是将文件“推送到(push)目标主机”
对于目标主机而言是将文件从源主机“拉取到(pull)本地”
下载rsync
yum -y install rsync
由于rsync支持ssh
,rsync
两种协议,下面分别对这两种进行实验:
a. 使用ssh协议进行同步
在源主机/rsyncsrc
下建立文件
![](https://img.haomeiwen.com/i9500234/bbc3e764fc7ccaaa.png)
将源主机内容推送到目标主机
rsync -avz /rsyncsrc/* root@192.168.80.20:/rsyncdes
a
: 递归保留文件的属性
v
: 显示过程
z
: 压缩
![](https://img.haomeiwen.com/i9500234/59dad5b5748191a5.png)
可以看到目标主机有了源主机推送的内容
同理,在目标主机将文件推送到源主机
rsync -avz /rsyncdes/* root@192.168.80.10:/rsyncsrc/
![](https://img.haomeiwen.com/i9500234/0160221e81895401.png)
Note: 若要配置免密登陆
ssh-keygen -t rsa
ssh-copy-id hostname
b.使用rsync协议进行同步
修改/etc/rsyncd.conf
添加如下内容
uid = nobody
gid = nobody
use chroot = yes
address = 192.168.80.10
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
[web]
path = /rsyncsrc
read only = no
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = test1
secrets file = /etc/rsyncd_users.db
新建/etc/rsyncd_users.db
用于保存rsync所需的用户和密码
test1:123456
修改权限(必须,否则不会生效)
chmod 600 /etc/rsyncd_users.db
启动服务
rsync --daemon
查看进程
![](https://img.haomeiwen.com/i9500234/5f3898a0cc1a66d0.png)
测试
下行同步(下载):
rsync -avz rsync://test1@192.168.80.10/web/ /rsyncdes/
上行同步 (上传)
rsync -avz /rsyncdes/* rsync://test1@192.168.80.10/web
拓展: --delete 删除本地比源主机上多的文件(源主机没有,本地有)
Note:由于在目标主机是用nobody进行操作的,因此对于源主机的/rsyncsrc
目录可能没有足够的权限去操作。因此可以配合ACL
来增加特殊权限。
setfacl -m u:nobody:rwx /rsyncsrc
拓展
rsync
协议若想要免密登陆,由客户端添加一个环境变量,export RSYNC_PASSWORD=虚拟用户密码
二、rsync+inotify 同步备份
解压inotify源码文件并编译安装。
inotifywait -mrq -e create,modify,delete /rsyncsrc/ &
其中 m:
保持监听状态
r
递归查询
q
只打印监控事件的信息
e
后面跟具体的事件
基于以上,可以写个脚本用来实时同步备份文件(在源主机上执行)
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /rsyncsrc/"
RSYNC_CMD="rsync -azH --delete /rsyncsrc/ root@192.168.80.20:/rsyncdes"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 5 ] ; then
$RSYNC_CMD
fi
done
结果如下:
![](https://img.haomeiwen.com/i9500234/4d8cf9fad3f45747.png)
![](https://img.haomeiwen.com/i9500234/42970bb55a5d739a.png)
网友评论