rsync数据同步工具

rsyncremote sync可以实现本地和远端数据的同步。基于rsync算法类似有提取特征码实现数据的增量备份。帮助文档中的定义是rsync -- a fast, versatile, remote (and local) file-copying tool。

一、rsync的特性

  • 可以镜像保存整个目录和文件系统

  • 安全可以使用scp、ssh方式来传输文件数据安全性较高

  • 可以比较容易的做到保持文件原来的权限、时间、软硬链接等属性

  • 文件支持匿名传输方便进行网站镜像

  • 快速第一次同步时rsync会复制全部的内容但在下一次时只同步修改过的文件。rsync在传输数据过程中可以实行压缩和解压缩操作可以使用更少的带宽。

二、rsync的工作模式

第一种Local模式类似于本地cp,install命令。

       使用格式 rsync [OPTION...] SRC... [DEST]

第二种Access via remote shell远端shell模式类似于scp命令

使用格式

    Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 本地向远端推送文件

    Push: rsync [OPTION...] SRC... [USER@]HOST:DEST  本地向远端来去文件

第三种列表模式

    使用格式rsync -n [-v] [USER@]HOST:DEST

第四种 Access via rsync daemon服务模式此时rsync工作位守护进程能接受到客户端的同步请求。

使用格式如下

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

三、rsyn命令

常见的参数如下:


-v,--verbose 详细的输出模式
-q,--quiet 静默模式
-c,--checksum 开启校验功能
-r,--recursive 递归复制
-a.--archive 归档保留文件的原有属性。等价于 -rlptgoD
-l,--links 保留符号链接
-p,--perms 保留文件的权限
-t,--times 保留文件的时间戳
-g,-o              
--group,--owner
保留文件的属主属组
-D-devices --specials 保留设备文件
-e ssh 使用ssh作为传输参数
-z,--compress 压缩传输可以使用--compress-level指定压缩级别
--progress 显示进度
--password-file=FILE   读取密码文件

--delete  参数的目的是在同步的时候删除多余的文件,只保留同步文件,其他无关的文件,都删除。

例如:rsync -a --delete /test1 /test2 ,test1是一个空文件目录,在没有同步之前,test2目录里有好多文件,但是同步之后,test2 此时就变为空目录了。

常常用于删除大量文件,例如:我们要删除 百万级 文件时,此时 rm 就不起作用了。此时,就会用到这种方式,而且所消耗的时间是可以接受的。

四、服务模式示例

至于本地模式远端shell模式和列表模式比较简单这里不再详述。但注意一点在远端shell模式下如果SRC中要复制的目录后有”/“此时会复制此目录的所有文件不包括目录本身如果没有”/“则会复制目录本身和此目录下的所有文件。

下图是对比效果

rsync数据同步工具

rsync数据同步工具

服务器模式此时rsync相当一个服务器。更简单的来说此时相当于samba文件服务器功能上主要值文件共享和上传有太大的差别配置文件有samba的也相当类似原因是rsync项目是由samba项目维护的官方站点是rsync.samba,org)。

rsync服务默认是不提供配置文件的,需要自己创建。配置文件时在/etc/rsyncd.conf。配置如下

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
###自己手动创建 rsyncd.conf 文件
# Global Settings
uid = nobody
gid = root
use chroot = no # 是否启用chroot的功能
max connection = 10 # 最大并发数
strict modes = yes # 是否启用 UID 检测
pid file /var/run/rsyncd.pid
log file /var/log/rsyncd.log
 
 
[share]
path = /data
ignore errors = yes # 忽略错误
read only = no
write only = no
hosts allow = 192.168.1.0/24
uid = root 
gid = root
 
 
###创建必要文件 pid和log文件
touch /var/run/rsyncd.pid /var/log/rsyncd.log
 
########启动服务
chkconfig rsync on
service xinetd start

结果

rsync数据同步工具

此时传输是匿名传输不进行用户名认证

rsync数据同步工具

 

要想实现用户认证非系统用户需要修改配置文件。

1
2
3
4
5
6
7
8
9
10
# 在配置文件的对应共享目录下添加
auth users= tom,jerry
secrets file /etc/rsyncd.pass
 
 
# 提供用户文件 /etc/rsyncd.pass格式如下
tom:guoting
jerry:guoting
 
chmod 600 /etc/rsyncd.pass

rsync数据同步工具

四、rsync+inotify实现数据的时时同步

1、inotify简介

inotify是一种强大的、细粒度的、异步的文件系统事件监控机制linux内核从2.6.13版本起加入了对inotify的支持。通过inotify可以监控文件系统中添加、删除、修改、移动等各种细微事件利用这个内核接口第三方软件可以监控文件系统下文件的各种变化情况inotify-tools就是这样的一个第三方软件。inotify-tools提供两种工具一是inotifywait它是用来监控文件或目录的变化二是inotifywatch它是用来统计文件系统访问的次数。

2、inotify软件的安装

首先查看内核支持inotify的机制有对应的参数表示支持。

rsync数据同步工具

安装inotify-tools软件可以使用源码和rpm方式安装epel源中。这里使用rpm方式

yum install inotify-tools -y    

rsync数据同步工具

安装完成后会提供inotifywait和inotifywatch 2个命令。

inotifywait命令介绍

inotifywait - wait for changes to files using inotify。使用inotify机制来等待文件的变化。

使用格式inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

常见的选项如下

-m|--monitor

保持监听

-r|--recursive

递归监听

-q|--quiet

只打印events信息

-qq

不打印任何信息

--format <fmt>   

指定特定的格式

--timefmt <fmt>

指定时间格式

-e|--event <event1>

常见的监听动作

access、modify、attrib、close_write、close_nowrite、close、open、moved_to    
moved_from、move、create、delete、delete_self、unmount    

3、inotify的配置实现

实验拓扑图如下实现在192.168.1.77上只要有文件指定文件改变就push到远端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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
####################在192.168.1.66#################################################
# 1、vim /etc/rsynd.conf,内容如下
# Global Settings
uid = nobody
gid = nobody
use chroot = no
max connection = 10
strict modes = yes
pid file /var/run/rsyncd.pid
log file /var/log/rsyncd.log
 
 
[share]
path = /data
ignore errors = yes
read only = no
write only = no
hosts allow = 192.168.1.0/24
uid = root  
gid = root
auth users= tom,jerry
secrets file /etc/rsyncd.pass
 
# 2、创建必要的文件
mkdir /data
touch /var/run/rsyncd.pid /var/log/rsyncd.log
 
# vim /etc/rsyncd.pass
tom:guoting
jerry:guoting
 
chmod 600 /etc/rsyncd.pass
 
# 3、启动服务
chkconfig rsync on
service xinetd restart
 
##################################################################################
 
 
####################在192.168.1.99#################################################
# 1、vim /etc/rsynd.conf,内容如下
# Global Settings
uid = nobody
gid = nobody
use chroot = no
max connection = 10
strict modes = yes
pid file /var/run/rsyncd.pid
log file /var/log/rsyncd.log
 
 
[share]
path = /data
ignore errors = yes
read only = no
write only = no
hosts allow = 192.168.1.0/24
uid = root  
gid = root
auth users= tom,jerry
secrets file /etc/rsyncd.pass
 
# 2、创建必要的文件
mkdir /data
touch /var/run/rsyncd.pid /var/log/rsyncd.log
 
# vim /etc/rsyncd.pass
tom:guoting
jerry:guoting
 
chmod 600 /etc/rsyncd.pass
 
# 3、启动服务
chkconfig rsync on
service xinetd restart
 
##################################################################################
 
####################在192.168.1.77#################################################
 
# 1、提供密码文件和push目录
echo "guoting" /etc/rsync.pass
chmod 600 /etc/rsync.pass
mkdir /mdata
 
# 2、安装软件
yum install inotify-tools -y
 
# 3、创建监听脚本
 
# vim ~/rsyncmon.sh 内容如下
#!/bin/bash
#
passfile=/etc/rsync.pass
rsyncd1=192.168.1.66  
rsyncd2=192.168.1.99              
src=/mdata                       
dst=share                       
user=tom                    
   
#注意这里的信息是会记录到192.168.1.66和192.168.1.66服务器的日志文件中
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src |while read line \
do 
    /usr/bin/rsync -az --delete --progress --timeout=120 --password-file=$passfile $src $user@$rsyncd1::$dst &>/dev/null
    /usr/bin/rsync -az --delete --progress --timeout=120 --password-file=$passfile $src $user@$rsyncd2::$dst &>/dev/null
   
done
########
chmod +x ~/rsyncmon.sh 
 
# 4、执行脚本
~/rsyncmon.sh  &

结果

192.168.1.77上创建一个文件

rsync数据同步工具

在192.168.1.66和192.168.1.99上查看

rsync数据同步工具

查看对应的日志信息注意格式

rsync数据同步工具 

补充

1、如果想开机自动监听echo "/root/rsyncmon.sh &" >> /etc/rc.d/rc.local

2、有关inotify的内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
查看系统默认参数值
sysctl -a | grep max_queued_events
结果是fs.inotify.max_queued_events = 16384
 
sysctl -a | grep max_user_watches
结果是fs.inotify.max_user_watches = 8192
 
sysctl -a | grep max_user_instances
结果是fs.inotify.max_user_instances = 128
 
参数说明
max_queued_events
inotify队列最大长度如果值太小会出现"** Event Queue Overflow **"错误导致监控文件不准确
 
max_user_watches
要同步的文件包含多少目录可以用find /path -type d | wc -l 统计必须保证max_user_watches值大于统计结果这里/path为同步文件目录
 
max_user_instances
每个用户创建inotify实例最大值

over.










本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1544199,如需转载请自行联系原作者
上一篇:android TypedValue.applyDimension()的作用


下一篇:给 iOS 开发者的 GCD 用户手册