前言
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。
rsync相关介绍
rsync(remote sync)是一款快速增量备份工具(远程同步),支持本地复制,或者与其他SSH(安全传输)、rsync主机同步。
特点
①可以镜像保存整个目录树或文件系统
②较高的数据传输效率
③可以借助于ssh实现安全数据传输
④支持匿名传输
工作模式
①shell模式,也称作本地模式
②远程shell模式,可以利用ssh协议承载其远程传输过程
③列表模式,仅列出源中的内容,-nv
④服务模式,此时rsync工作为守护进程,能接收客户端的数据同步请求
命令选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
-n: 同步测试,不执行真正的同步过程;
-
v
: 详细输出模式
-q: 静默模式
-c: checksum,开启校验功能
-r: 递归复制
-a: 归档,保留文件的原有属性;
-p: 保留文件的权限;
-t: 保留文件的时间戳;
-l: 保留符号链接
-g: 保留属组
-o: 保留属主
-D:保留设备文件
-e
ssh
: 使用
ssh
作为传输承载;
-z: 压缩后传输;
--progress: 显示进度条
--stats: 显示如何执行压缩和传输
|
1
2
3
|
注意:
rsync
命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本身;如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;
如:
rsync
-r
/var/log/
/tmp
#复制/var/log目录下的所有文件,不包括log本身
rsync
-r
/var/log
/tmp
#复制/var/log整个目录
|
rsync同步数据的时候,需要完整扫描文件,比对变化的文件,如果文件数量过于庞大,这样扫描是非常耗时的,而且rsync虽然可以通过crontab实现定期同步,但是也达不到实时同步的要求,要想解决这一弊端,就需要inotify了
数据实时同步实现
inotify相关介绍
可用于定义监控指定的目录下的所有文件,一旦有文件的元数据发生改变,就通知rsync进行数据同步,以此实现实时同步
部署过程
我们通过一个实例来看一下rsync+inotify是如何实现数据同步的
案例要求
web服务器1:172.16.10.100(主服务器)
web服务器2:172.16.10.212(辅服务器)
两台web服务器,要求在主服务器上更新数据,辅服务器要自动更新数据
rsync角色说明:因为inotify是监控在rsync的客户端,而且是主动同步,所以在此应用场景中主服务器为rsync客户端,辅服务器为rsync服务器端
rsync服务器端配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
[root@scholar ~]
# yum install xinetd -y #安装守护进程,rsync系统自带,如果没有安装即可
[root@scholar ~]
# vim /etc/xinetd.d/rsync
#修改此项
disable = no
#启用rsync
[root@scholar ~]
# vim /etc/rsyncd.conf #为rsync创建配置文件,默认没有此文件
# Global Settings
uid = nobody
#运行rsync用户
gid = nobody
#运行rsync组
use chroot = no
#关闭chroot
max connections = 10
#最大并发连接数
strict modes =
yes
#开启严格模式
pid
file
=
/var/run/rsyncd
.pid
#pid文件位置
log
file
=
/var/log/rsyncd
.log
#日志文件位置
# Directory to be synced
[web]
#文件共享名
path =
/web
#共享文件路径
ignore errors =
yes
#忽略错误
read
only = no
#不允许读
write only = no
#不允许写
hosts allow = 172.16.0.0
/16
#白名单
hosts deny = *
#黑名单
list =
false
#不允许列出文件
uid = root
#共享已root用户运行,可覆盖全局配置
gid = root
#共享已root组运行,可覆盖全局配置
auth
users
= scholar
#用户认证
secrets
file
=
/etc/rsync
.
passwd
#认证文件
[root@scholar ~]
# vim /etc/rsync.passwd #创建认证文件
#格式:username:password,此文件不能允许其它用户有访问权限,且密码不能超过8个字符
scholar:scholar
[root@scholar ~]
# chmod 600 /etc/rsync.passwd #设置权限
|
启动服务,设置开机自启,查看监听端口
rsync客户端配置
创建认证文件,只需密码即可
测试数据同步的方法
1
2
3
4
5
6
7
8
9
|
Access via
rsync
daemon:
Pull:
rsync
[OPTION...] [USER@]HOST::SRC... [DEST]
如:
rsync
--password-
file
=
/etc/rsync
.
passwd
scholar@172.16.10.212::web
/web
rsync
[OPTION...]
rsync
:
//
[USER@]HOST[:PORT]
/SRC
... [DEST]
如:
rsync
--password-
file
=
/etc/rsync
.
passwd
rsync
:
//scholar
@172.16.10.212
/web
/web
Push:
rsync
[OPTION...] SRC... [USER@]HOST::DEST
如:
rsync
--password-
file
=
/etc/rsync
.
passwd
/web
scholar@172.16.10.212::web
rsync
[OPTION...] SRC...
rsync
:
//
[USER@]HOST[:PORT]
/DEST
如:
rsync
--password-
file
=
/etc/rsync
.
passwd
/web
rsync
:
//scholar
@172.16.10.212
/web
|
安装inotify-tools
1
2
3
4
|
[root@scholar ~]
# tar xf inotify-tools-3.14.tar.gz
[root@scholar ~]
# cd inotify-tools-3.14
[root@scholar inotify-tools-3.14]
# ./configure
[root@scholar inotify-tools-3.14]
# make && make install
|
创建rsync脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@scholar ~]
# vim /usr/local/bin/rsyncd
#!/bin/bash
SRC=
/web/
DEST=web
HOST=172.16.10.212
/usr/local/bin/inotifywait
-mrq --timefmt
'%d/%m/%y %H:%M'
--
format
'%T %w%f%e'
-e
modify,delete,create,attrib $SRC |
while
read
files;
do
rsync
-vzrtopg --delete --progress --password-
file
=
/etc/rsync
.
passwd
$SRC
scholar@$HOST::$DEST
done
#inotifywait参数详解:
#-m,表示始终保持事件监听状态
#-r,表示递归查询目录
#-q,表示打印出监控事件
#-e,指定要监控的事件,包括modify、delete、create、attrib等
#--timefmt:指定时间的输出格式
#--format:指定变化文件的详细信息
|
设置开机自动运行
测试同步
我们在主服务器上增加一个站点,站点已做好我们直接复制进去
我们去辅服务器上看一下,数据有没有同步过来
同步成功,至此基于rsync + inotify实现数据实时同步配置完成
The end
好了,rsync + inotify就讲到这里了,如果要实现多台从服务器同步,多设几个rsync服务器端就好了,相应的主服务器inotify的脚本也需要略加修改,过程并不麻烦,实验过程中遇到问题可留言。以上仅为个人学习整理,如有错漏,大神勿喷~~~
本文转自 北城书生 51CTO博客,原文链接:http://blog.51cto.com/scholar/1639713