赞
踩
Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync可以使用SSH安全隧道进行加密数据传输。Rsync服务器端定义源数据,Rsync客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的。
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
RSYNC=Remote Sync 远程同步
官方网站:rsync
Author: Andrew Tridgell, Wayne Davison, and others
Andrew Tridgell是Samba项目的领导者和主要开发人员,同时还在参与开发rsync、Linux Kernel。
rsync --version #查看rsync版本,可以看到相关作者相信
rsync version 3.0.6 protocol version 30
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
……
与SCP的比较: scp=无法备份大量数据,类似windows的复制
rsync=变复制 ,边统计,边比较
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。
压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。
安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
选择性保持:符号连接,硬链接,文件属性,权限,时间等
完整备份,差异备份,增量备份
完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地
差量备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份,他备份过程中不清除存档属性)
增量备份:备份上次备份以后有变化的数据.(他才不管是那种类型的备份,有变化的数据就备份,他会清除存档属性)
采用C/S模式(客户端/服务器模式)[ 就是一个点到点的传输,直接使用rsync命令 ]
端口873
四个名词的解释:
发起端:负责发起rsync同步操作的客户机叫做发起端,通知服务器我要备份你的数据
备份源:负责相应来自客户机rsync同步操作的服务器脚在备份源,需要备份的服务器
服务端:运行rsyncd服务,需要备份的服务器
客户端:存放备份数据
Rsync有四种工作模式,具体如下:
1、列表模式
和ls -l相似,负责列出源的内容。不仅可以看本地还可以看远端。
2、shell模式,也称为本地模式
和cp相似,本地拷贝文件
3、远程shell模式,可以通过通过rcp,ssh等通道传输
和rcp相似,不过可以实现增量备份,并且能够通过安全的ssh方式进行数据传输。
4、服务器模式
在这种模式下,rsync 守护进程在一台机器上永久运行,接收文件传输请求。可以把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。
1、列表模式(list mode)
Rsync的列表模式,即等同于在实现 ls -l 的功能。我们可以通过分别执行rsync和ls命令来观察区别。
[root@rsync-server /]# rsync /rsync
drwxr-xr-x 4096 2014/06/04 00:45:06 rsync
[root@rsync-server /]# rsync /rsync/
drwxr-xr-x 4096 2014/06/04 00:45:06 .
-rw-r--r-- 0 2014/06/04 00:45:01 a
-rw-r--r-- 0 2014/06/04 00:45:03 b
-rw-r--r-- 0 2014/06/04 00:45:05 c
-rw-r--r-- 0 2014/06/04 00:45:06 d
[root@rsync-server /]# ls -dl /rsync
drwxr-xr-x. 2 root root 4096 Jun 4 00:45 /rsync
[root@rsync-server /]# ls -l /rsync
total 0
-rw-r--r--. 1 root root 0 Jun 4 00:45 a
-rw-r--r--. 1 root root 0 Jun 4 00:45 b
-rw-r--r--. 1 root root 0 Jun 4 00:45 c
-rw-r--r--. 1 root root 0 Jun 4 00:45 d
通过上面的输出,可以看出来,rsync后跟文件或目录和ls -l后跟文件和目录的效果大体相同(不一样的细节,这里不多描述)。需要注意的是,如果你身处某个目录,你ll能查看到所在目录下文件列表的详细信息。但是你执行rsync会报错,因此rsync必须后跟文件或目录才能查看相关的详细信息。
另外,rsync的列表模式是支持对远端的目录进行查看的,而ls -l是不具备这个功能的。
2、Shell模式(shell mode)
在 RSYNC 的 shell 模式(本地模式)中,我会列举rsync命令的用法和常规选项信息。
首先来看下 RSYNC 的命令语法:
rsync [OPTION]... SRC [SRC]... DEST
执行rsync --help可得到上面输出,当然输出不仅仅只有上面这一条,我仅仅将shell模式的语句摘了出来。下面对该条语句进行拆解。
rsync [OPTION]... SRC [SRC]... DEST
1)rsync为同步的命令
2)[OPTION]... 为同步时的参数选项
3)SRC为源,即需要拷贝的分区,文件或目录等
4)[DEST]为目地分区,文件或目录等
需要注意的是:rsync命令在使用中,如果源参数的末尾有斜线,就会复制指定目录内的内容,而不复制目录本身;如果没有斜线,则会复制目录本身。目标参数的末尾有没有斜线都不影响。
接下来,请看下面两个例子:
[root@rsync-server /]# rsync -a /rsync /backup #会把目录rsync直接同步至/backup目录中去
[root@rsync-server /]# rsync -a /rsync/ /backup #会把目录中的data/中的内容同步至/backups目录中
现在,我们在shell模式下,进行rsync的同步。
实例1:测试本地rsync同步
[root@rsync-server ~]# mkdir /rsync #创建rsync测试目录
[root@rsync-server ~]# touch /rsync/test #在rsync测试目录下建立test.txt文件[root@rsync-server ~]# chmod -R 700 /rsync #授权一下以查看同步后是不是保持了权限属性
[root@rsync-server rsync]# ll -a /rsync/
total 8
drwx------. 2 root root 4096 Jun 4 01:01 .
dr-xr-xr-x. 26 root root 4096 Jun 4 01:01 ..
-rwx------. 1 root root 0 Jun 4 01:01 test
[root@rsync-server ~]# rsync -avz /rsync/ /tmp
sending incremental file list
./test
sent 78 bytes received 34 bytes 224.00 bytes/sec
total size is 0 speedup is 0.00
[root@rsync-server ~]# ls -l /tmp/test
-rwx------. 1 root root 0 Jun 4 01:01 /tmp/test
上面的例子,演示了将本地/rsync目录下的文件,同步到/tmp目录下。其中使用的参数,-avz上面讲过。如果不明白,可以去上面看每个参数的详细介绍。
3、远程shell模式(remote shell mode)
远程shell模式的话,和shell模式是异曲同工。只不过,因为是要通过远程,因此我们需要指定远程主机的IP,如果采用ssh我们还需要指定ssh的端口等等。
远程shell模式,常规分为如下两种情况,其语法分别为:
拉取pull :rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
推送push:rsync [OPTION]... [USER@]HOST:SRC [DEST]
下面为大家拆解一下命令:
1)Rsync为同步的命令
2)[OPTION]... 为同步时的参数选项
3)[USER@]HOST... 为Rsync同步的远程的连接用户和主机地址
4)SRC为源,即需要拷贝的分区、文件或目录等,和HOST之间用一个冒号连接
5)[DEST]为目地分区、文件或目录等
大家可以发现,拉取和推送,不一样的地方就是源和目标换了位置。其中拉取,表示从远端主机把数据同步到执行命令的本地主机相应目录。(需要注意,拉取的话,远端主机上一定要安装rsync,不然会拉取失败)。推送,表示从本地主机执行命令把本地的数据同步到远端主机指定目录下
拉取实例:
老大要求拉取172.16.100.1这台服务器上的etc目录到我们的备份服务器172.16.100.2上的/backup目录下。
操作:
通过ssh连接到172.16.100.1这台服务器上,然后执行如下命令:
[root@rsync-server ~]# rsync -vzrtopg --progress -e ‘ssh -p 22’ root@172.16.100.1:/etc /backup
语法说明:
1)-vzrtopg 相当于上文的-avz,表示同步时文件和目录属性不变。
2)--progress 显示同步的过程,可以用-p替换
3)-e ‘ssh -p 22’,表示通过ssh的通道传输数据。如果ssh是默认的22号端口,此处的-p 22可省略。
4)root@192.168.1.111:/etc 远程的主机用户,地址,路径
5)/backup本地(172.16.100.2)的路径
推送实例:
公司内部有一台svn服务器(172.16.100.2),公司站点的更新代码通过后台的测试服务器测试之后,经过svn同步到svn服务器。老大要求你将svn服务器上的代码,推送到前台的服务器(172.16.100.1)上。
操作:通过ssh连接到svn服务器(172.16.100.2)上,然后执行如下命令
[root@rsync-server ~]# rsync -avz --progress -e ‘ssh -p 22’ /webrepo root@172.16.100.1:/data/web/html
特别说明:
1)上面两个例子中的数据同步都是加密传输的,因为是通过ssh通道进行数据传输的。
2)在传输前需要进行连接用户(一般为系统用户)密码验证,需要手工输入。这里我们可以通过配置ssh互信来实现免验证方式同步。
3)rsync软件必须安装在本地及远程服务器上
4、服务模式(daemon mode)
RSYNC的服务模式,部署时分为rsync的服务端和rsync的客户端。需要注意的是,rsync 的服务端和客户端都是一个软件包,如果你启用了 rsync 的服务模式,则该主机就变成 rsync 服务器。因此我们需要将 rsync 分别安装于服务端和客户端,服务端和客户端使用同一个 rsync 软件包来实现远程镜像和定期同步更新。
rsync 服务端可同时备份多个客户端的数据,多个服务端备份一个客户端的数据。 rsync 默认端口为 873,服务器在该端口接收客户的匿名或者认证方式的备份请求。
rsync 服务端在使用之前需要进行必要的配置,其配置文件为 /etc/rsyncd.conf,该文件默认没有,需要自己手动创建。Rsync服务端通过/etc/rsyncd.conf进行认证、访问、日志记录等控制,该配置文件包括全局参数、模块参数等设置。
rsyncd.conf 文件中 [module] 之前的所有参数为全局参数,也可以在全局参数部分定义模块参数。在这种情况下该参数的值就是所有模块的默认值。全局参数设置程序使用的端口号,指定消息文件、日志文件 pid 文件以及发送日志消息的级别。模块参数主要定义服务端哪个目录需要被同步。用户可根据不同的需要指定多个模块,每个模块对应需要备份的一个目录树,即若有 N 个需要备份的目录树,则需要 N 个模块与之对应。模块中可以定义许多参数。
本章节主要讲解服务模式。
推push:一台主机负责吧数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况
拉pull: 所有主机定时去找一主机拉数据,可能就会导致数据缓慢
推:目的主机配置为rsync服务器,源主机周期性的使用rsync命令把要同步的目录推过去
拉:源主机配置为rsync服务器,目的主机周期性的使用rsync命令把要同步的目录拉过来
两种方案,rsync都有对应的命令来实现
使用rsync来同步是先通过xinetd监听873号端口,如果rsync进来的是873号端口,那么xinetd就会通知它所管辖的rsync服务来做回应,接下来就是rsync俩服务于之间的通讯
实验拓扑:
taijitao63(Server 192.168.1.63)=====================taijitao64(Client 192.168.1.64)
Rsync服务依赖Xinetd,是使用超级服务来管理的
[root@taijitao63 ~]# rpm -ivh /media/Packages/xinetd-2.3.14-39.el6_4.x86_64.rpm
[root@taijitao63 ~]# rpm -ivh /media/Packages/rsync-3.0.6-9.el6_4.1.x86_64.rpm
[root@taijitao63 ~]# vim /etc/xinetd.d/rsync
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no #此行原=yes,改为=no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
[root@taijitao63 ~]# /etc/init.d/xinetd restart
[root@taijitao63 ~]# netstat -antup | grep 873
tcp 0 0 :::873 :::* LISTEN 2349/xinetd
我们需要注意的是,源码安装的rsync默认是没有加入xinetd的,因此你会发现,在/etc/xinetd.d目录下找不到rsync文件。
服务器端配置:
使用CentOS 7系统安装部署Rsync非常方便,安装光盘以及YUM源中都提供了rsync软件包,使用YUM方式安装即可。下面的案例演示了如何共享/common目录,为此,我们需要创建/common目录,并复制一些测试文件存放在该目录下。本例需要手动创建配置文件/etc/rsync.conf,该文件具体的语法格式在后面有详细的描述。
[root@taijitao63 ~]# yum install -y rsync
[root@taijitao63 ~]# mkdir /common; cp /etc/init.d/* /common/
[root@taijitao63 ~]# vim /etc/rsync.conf
#/etc/rsyncd.conf
motd file = /etc/rsyncd.motd #设置服务器信息提示文件名称,在该文件中编写提示信息
transfer logging = yes #开启Rsync数据传输日志功能
log file =/var/log/rsyncd.log #设置日志文件名称,可以通过log format参数设置日志格式
pid file =/var/run/rsyncd.pid #设置Rsync进程号保存文件名称
lock file =/var/run/rsync.lock #设置锁文件名称
strict modes = yes #指定是否检查口令文件的权限
port = 873 #设置服务器监听的端口号,默认为873
address = 192.168.0.254 #设置服务器所监听网卡接口的IP地址,这里服务器IP地址为192.168.0.254
uid = nobody #设置进行数据传输时所使用的账户名称或ID号,默认使用nobody
gid = nobody #设置进行数据传输时所使用的组名称或GID号,默认使用nobody
use chroot = no #设置user chroot为yes后,rsync会首先进行chroot设置,将根映射到path参数路径下,对客户端而言,系统的根就是path参数所指定的路径。但这样做需要root权限,并且在同步符号连接资料时仅会同步名称,而内容将不会同步。
read only = yes #是否允许客户端上传数据,这里设置为只读。
max connections = 10 #设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会收到稍后重试的提示消息
#模块,Rsync通过模块定义同步的目录,模块以[name]的形式定义,这与Samba定义共享目录是一样的效果。在Rsync中也可以定义多个模块
[common] #自定义模块
comment = Web content #comment定义注释说明字串
path = /common #同步目录的真实路径通过path指定
ignore errors #忽略一些IO错误
#exclude = test/ #exclude可以指定例外的目录,即将common目录下的某个目录设置为不同步数据
auth users = tom,jerry #设置允许连接服务器的账户,账户可以是系统中不存在的用户
secrets file = /etc/rsyncd.secrets #设置密码验证文件名称,注意该文件的权限要求为只读,建议权限为600,仅在设置auth users参数后有效
hosts allow=192.168.0.0/255.255.255.0 #设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网段之间使用空格分隔
hosts deny=* #设置拒绝所有(除hosts allow定义的主机外)
list= false #客户端请求显示模块列表时,本模块名称是否显示,默认为true
read only = false # 设定是否允许客户上载文件。若为 true 任何上载请求均会失败,若为 false 且客户端拥有服务器目录读写权限则可以上载。默认值为 true 。
write only 设定是否允许客户下载文件。若为 true 任何下载请求均会失败,默认值为 false 。
Dont commpress # 指定不进行压缩处理即可传输的文件,默认值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
exclude = common/ # 用来指定多个由空格隔开的多个文件或目录 ( 相对路径 ),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 --exclude 参数。一个模块只能指定一个 exclude 选项。但是需要注意的一点是该选项有一定的安全性问题,客户端很有可能绕过 exclude 列表,如果希望确保特定的文件不能被访问,那就最好结合 uid/gid 选项一起使用。
pre-xfer exec, post-xfer exec # 设置可在文件传输前/后执行的命令。若在文件传输前执行的命令失败,则取消本次传输操作。
接下来,通过echo的方式创建密码文件/etc/rsyncd.secrets,在该文件中输入两个账户:tom账户的密码是pass,jerry账户的密码是111。需要注意的是,密码文件不可以对所有的人开放可读权限,为了安全,建议设置权限为600。创建服务器提示信息文件并向该文件中导入欢迎词。由于Rsync默认不是开机启动服务,为了实现开机启动Rsync服务,我们可以通过echo将rsync --daemon追加至开机启动文件/etc/rc.local。最后通过设置防火墙开启873端口的入站数据请求。
[root@centos7 ~]# useradd tom
[root@centos7 ~]# useradd jerry
[root@centos7 ~]# echo pass |passwd --stdin tom
[root@centos7 ~]# echo “111” |passwd --stdin jerry
[root@centos7 ~]# echo "tom:pass" > /etc/rsyncd.secrets
[root@centos7 ~]# echo "jerry:111" >> /etc/rsyncd.secrets
[root@centos7 ~]# chmod 600 /etc/rsyncd.secrets
[root@centos7 ~]# echo “welcome to access” >/etc/rsyncd.motd
[root@centos7 ~]# rsync --daemon --config=/etc/rsyncd.conf #注意如果你的rsyncd.conf文件在/etc/目录下,就不需要再用--config去指定了。--daemon是以守护进程的方式启动 #启动rsync服务
[root@centos7 ~]# echo “/usr/bin/rsync --daemon” >> /etc/rc.local
[root@centos7 ~]# firewall-cmd --permanent --add-port=873/tcp #添加防火墙规则,允许873端口的数据访问
客户端同步数据
现在让我们开始同步数据吧,在客户端主机中同样是使用rsync命令进行初始化数据传输,使用同样的程序,但客户端主机不需要--daemon选项。
[root@centos7 ~]# yum -y install rsync
[root@centos7 ~]# rsync -vzrtopg --progress tom@192.168.0.254::common /test
rsync命令和scp命令很相似
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=formAT 指定日志文件格式
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息
-a, --archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等
-r, --recursive 复制所有下面的资料,递归处理
-p, --perms 保留档案权限 ,文件原有属性
-t, --times 保留时间点,文件原有时间
-g, --group 保留原有属组
-o, --owner 保留档案所有者(root only)
-D, --devices 保留device资讯(root only)
-l, --links 复制所有的连接 ,拷贝连接文件
-z, --compress 压缩模式, 当资料在传送到目的端进行档案压缩. –azP
-H, --hard-links 保留硬链接文件
-A, --acls 保留ACL属性文件,需要配合--perms
-P,-P参数和 --partial --progress 相同.只是为了把参数简单化,表示传进度
--version, 输出rsync版本
-v , --verbose 复杂的输出信息
-u, --update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件
--port=PORT, 定义rsyncd(daemon)要运行的port(预设为tcp 873)
--delete, 删除那些目标位置有的文件而备份源没有的文件
--password-file=FILE ,从 FILE 中得到密码
--filter “-filename”,需要过滤的文件
--exclude=filname,需要过滤的文件
第一种:基于系统用户的备份
第二种 :配置rsyncd服务,用户仅限备份使用
1.拷贝本地文件,将/home/coremail目录下的文件拷贝到/cmbak目录下
# rsync -avSH /home/coremail/ /cmbak/
2.拷贝本地机器的内容到远程机器
# rsync -av /home/coremail/ 192.168.11.12:/home/coremail/
3.拷贝远程机器的内容到本地机器
# rsync -av 192.168.11.11:/home/coremail/ /home/coremail/
4.拷贝远程rsync服务器(daemon形式运行rsync)的文件到本地机。
# rsync -av root@172.16.78.192::www /databack
5.拷贝本地机器文件到远程rsync服务器(daemon形式运行rsync)中。当DST路径信息包含”::”分隔符时启动该模式。
# rsync -av /databack root@172.16.78.192::www
6.显示远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
# rsync -v rsync://192.168.11.11/data
7、指定密码存放文件,无需输入密码,直接执行rsync传输
# rsync -rvzP --password-file=/etc/rsync.password rsync@$192.168.10.175::imgdata/ /data
对taijitao63网站根目录的/var/www/html目录备份到taijitao64的/web-back
[root@taijitao63 ~]# useradd rget1
[root@taijitao63 ~]# useradd rput1
[root@taijitao63 ~]# echo 123456|passwd --stdin rget1
[root@taijitao63~]# echo 123456 |passwd --stdin rput1
[root@taijitao63 ~]# setfacl -R -m user:rput1:rwx /var/www/html
[root@taijitao63 ~]# setfacl -R -m default:user:rput1:rwx /var/www/html
[root@taijitao63 ~]# setfacl -R -m user:rget1:rwx /var/www/html
[root@taijitao63 ~]# setfacl -R -m default:user:rget1:rwx /var/www/html
[root@taijitao63 ~]# getfacl /var/www/html
# file: var/www/html
# owner: root
# group: root
user::rwx
user:rput1:rwx
user:rget1:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:rput1:rwx
default:user:rget1:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@taijitao64 ~]# rpm -ivh /media/Packages/rsync-3.0.6-12.el6.x86_64.rpm
[root@taijitao64 ~]# mkdir /web-back //数据存放目录
[root@taijitao64 ~]# rsync -azP --delete rget1@192.168.1.63:/var/www/html/ /web-back/
//什么用户从哪个设备的哪个目录备份到本地的哪个目录
……
rsync: send_files failed to open "/var/www/html/initramfs-2.6.32-431.el6.x86_64.img": Permission denied (13)
……
rsync: send_files failed to open "/var/www/html/initrd-2.6.32-431.el6.x86_64kdump.img": Permission denied (13)
……
rsync: send_files failed to open "/var/www/html/grub/grub.conf": Permission denied (13)
#几行报错,排错
[root@taijitao63 ~]# getfacl /var/www/html/initramfs-2.6.32-431.el6.x86_64.img
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/initramfs-2.6.32-431.el6.x86_64.img
# owner: root
# group: root
user::rw-
user:rget1:rwx #effective:--- 虽然在前面看到是rwx,但是后面备注上说出有效权限是---
user:rput1:rwx #effective:---
group::r-x #effective:---
mask::---
other::---
[root@taijitao63 ~]# ll /var/www/html/initramfs-2.6.32-431.el6.x86_64.img
-rwx------+ 1 root root 17497376 Sep 18 14:36 /var/www/html/initramfs-2.6.32-431.el6.x86_64.img
#除开属主之外,其他人没有任何权限
[root@taijitao63 ~]# chmod 744 /var/www/html/initramfs-2.6.32-431.el6.x86_64.img //加上权限
[root@taijitao63 ~]# getfacl /var/www/html/initramfs-2.6.32-431.el6.x86_64.img
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/initramfs-2.6.32-431.el6.x86_64.img
# owner: root
# group: root
user::rwx
user:rget1:rwx #effective:r-- 有效权限可读了
user:rput1:rwx #effective:r--
group::r-x #effective:r--
mask::r--
other::r--
同理方法修改
/var/www/html/initrd-2.6.32-431.el6.x86_64kdump.img
/var/www/html/grub/grub.conf
再次客户端测试
[root@taijitao64 ~]# rm -rf /web-back/*
[root@taijitao64 ~]# rsync -azP --delete rget1@192.168.1.63:/var/www/html/ /web-back/ //没报错
[root@taijitao64 ~]# ssh-keygen //生成密钥
[root@taijitao64 ~]# ssh-copy-id rget1@192.168.1.63 //公钥复制给服务器
[root@taijitao64 ~]# rm -rf /web-back/
[root@taijitao64 ~]# rsync -avzP --delete rget1@192.168.1.63:/var/www/html/ /web-back/ //免密码、
[root@taijitao64 ~]# vim /root/rsync-ssh-get-wwwroot.sh // 首先编写脚本
#!/bin/bash
rsync -az --delete rget1@192.168.1.63:/var/www/html/ /web-back/
tar czvf web-back-`date +%Y-%m-%d`.tar.gz /web-back/*
#这里吧参数P去掉,后期执行备份我们不需要看进度,同步回来我们需要打包它,按日期命名
[root@taijitao64 ~]# rm -rf /web-back/*
[root@taijitao64 ~]# sh /root/rsync-ssh-get-wwwroot.sh // 测试脚本
[root@taijitao64 ~]# ls /web-back/ // 有以下内容证明是没有什么问题
config-2.6.32-431.el6.x86_64 initramfs-2.6.32-431.el6.x86_64.img symvers-2.6.32-431.el6.x86_64.gz
efi initrd-2.6.32-431.el6.x86_64kdump.img System.map-2.6.32-431.el6.x86_64
grub lost+found vmlinuz-2.6.32-431.el6.x86_64
[root@taijitao64 ~]# ls web-back-2015-09-18.tar.gz
web-back-2015-09-18.tar.gz
[root@taijitao64 ~]# chmod +x /root/rsync-ssh-get-wwwroot.sh
[root@taijitao64 ~]# echo "01 3 * * * sh /root/rsync-ssh-get-wwwroot.sh &" >> /var/spool/cron/root
使用系统配置文件/etc/rsyncd.conf来备份数据,创建备份账户,最后把rsync以deamon方式运行
配置文件分为两部分:全局参数,模块参数
全局参数:对rsync服务器生效,如果模块参数和全局参数冲突,冲突的地方模块参数生效
模块参数:定义需要通过rsync输出的目录定义的参数
常见的全局参数:
port #→指定后台程序使用的端口号,默认为873。
uid #→该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是" nobody"。
gid #→该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为" nobody"。
max connections #→指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。
lock file #→指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。
motd file #→" motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。
log file #→" log file"指定rsync的日志文件,而不将日志发送给syslog。
pid file #→指定rsync的pid文件,通常指定为“/var/run/rsyncd.pid”,存放进程ID的文件位置。
hosts allow = #→单个IP地址或网络地址 //允许访问的客户机地址
常见的模块参数:主要是定义服务器哪个要被同步输出,其格式必须为“ [ 共享模块名 ]” 形式,这个名字就是在 rsync 客户端看到的名字,其实很像 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。
Comment #→给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。
Path #→指定该模块的供备份的目录树路径,该参数是必须指定的。
read only #→yes为只允许下载,no为可以下载和上传文件到服务器
exclude #→用来指定多个由空格隔开的多个文件或目录(相对路径),将其添加到exclude列表中。这等同于在客户端命令中使用―exclude或----filter来指定某些文件或目录不下载或上传(既不可访问)
exclude from #→指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exclude列表定义,每个文件或目录需要占用一行
include #→用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用--include来指定模式,结合include和exclude可以定义复杂的exclude/include规则。
include from #→指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。
auth users #→该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果" auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在" secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。
secrets file #→该选项指定一个包含定义用户名:密码对的文件。只有在" auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,注意:该文件的权限一定要是600,否则客户端将不能连接服务器。
hosts allow #→指定哪些IP的客户允许连接该模块。定义可以是以下形式:
单个IP地址,例如:192.167.0.1,多个IP或网段需要用空格隔开,
整个网段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
“*”则表示所有,默认是允许所有主机连接。
hosts deny #→指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。
list #→该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,
可以创建隐藏的模块。默认值是true。
timeout #→通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。
[root@taijitao63 ~]# vim /etc/rsyncd.conf //文件不存在,需要自己创建
uid = nobody #运行进程的身份
gid = nobody #运行进程的组
address = 192.168.1.63 #监听IP
port = 873 #监听端口
hosts allow = 192.168.1.64 #允许同步客户端的IP地址,可以是网段,或者用*表示所有 192.168.1.0/24或192.168.1.0/255.255.255.0
use chroot = yes #是否囚牢,锁定家目录,rsync被黑之后,黑客无法再rsync运行的家目录之外创建文件,选项设置为yes
max connections = 5 #最大连接数
pid file = /var/run/rsyncd.pid #进程PID,自动生成
lock file = /var/run/rsync.lock #指max connectios参数的锁文件
log file = /var/log/rsyncd.log #日志文件位置
motd file = /etc/rsyncd.motd #客户端登陆之后弹出的消息,需要创建
[wwwroot] #共享模块名称
path = /var/www/html #路径
comment = used for web-data root #描述
read only = yes #只读方式(只可以下载)
list = yes #是否允许查看模块信息
auth users = rsyncuser #备份的用户,和系统用户无关
secrets file = /etc/rsync.passwd #存放用户的密码文件,格式是 用户名:密码
[root@taijitao63 ~]# echo "Welcome to Backup Server" > /etc/rsyncd.motd
[root@taijitao63 ~]# vim /etc/rsyncd.conf
[root@taijitao63 ~]# vim /etc/rsync.passwd
rsyncuser:password123
[root@taijitao63 ~]# chmod 600 /etc/rsync.passwd //目录权限必须是700或者600,否则的话身份验证会失效,设置rsync user的时候
[root@taijitao63 ~]# vim /etc/xinetd.d/rsync
disable = no #将原来的yes改为no(部分版本可能是no,则不用改)
[root@taijitao63 ~]# /etc/init.d/xinetd restart //启动服务
或者启动方式用守护进程方式启动服务
[root@taijitao63 ~]# rsync --daemon --config=/etc/rsyncd.conf
[root@taijitao63 ~]# netstat -antup | grep :873
tcp 0 0 :::873 :::* LISTEN 45089/xinetd
[root@taijitao63 ~]# chkconfig xinetd on
测试,rsync语法: rsync 选项 用户名@备份源服务器IP::共享模块名 目标目录
[root@taijitao64 ~]# rsync -azp rsyncuser@192.168.1.63::wwwroot /web-back/
Welcome to Backup Server
Password: #输入密码password123
或者:使用下面的命令,输出详细信息
[root@taijitao64 ~]# rsync -av --progress --delete rsyncuser@192.168.1.63::wwwroot /web-back/
Welcome to Backup Server
Password: #输入密码password123
receiving incremental file list
./
System.map-2.6.32-431.el6.x86_64
2518236 100% 80.05MB/s 0:00:00 (xfer#1, to-check=26/28)
……
sent 502 bytes received 29590149 bytes 6575700.22 bytes/sec
total size is 29584842 speedup is 1.00
[root@taijitao64 ~]# export RSYNC_PASSWORD=password123 //输出此变量
或者新建一个文件保存好密码,然后在rsync命令中使用--password-file指定此文件即可
[root@taijitao64 ~]# vim autobackup.sh
#!/bin/bash
export RSYNC_PASSWORD=password123
rsync -avz rsyncuser@192.168.1.63::wwwroot /web-back
[root@taijitao64 ~]# chmod +x autobackup.sh
[root@taijitao64 ~]# chmod +x autobackup.sh
[root@taijitao64 ~]# rm -rf /web-back/* //测试脚本
[root@taijitao64 ~]# sh autobackup.sh
[root@taijitao64 ~]# echo "01 3 * * * sh /root/autoback.sh &" >> /var/spool/cron/root
[root@taijitao63 ~]# iptables -A INPUT -p tcp --dport 873 -j ACCEPT
[root@centos7 ~]# firewall-cmd --permanent --add-port=873/tcp #添加防火墙规则,允许873端口的数据访问
作为一个镜像备份工具,可以说 rsync 做的很出色。
可是,随着应用系统规模的不断扩大,我们对数据的安全性和可靠性方面的需求也越来越高!Rsync 在高端业务系统中的不足也逐渐暴露了出来。
首先,rsync 在同步数据时,需要扫描所有文件后才进行比对,然后再进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的一个操作,并且往往发生变化的是其中很小的一部分,那么这将是非常低效的方式。
其次,rsync 不能实时的去监测和同步数据。虽然我们使用crontab的方式,加上 rsync 自身以守护进程启动的方式实现触发同步,但是两次触发动作一定会有时间差。受限于crontab最短也是1分钟,因此这就导致了服务端和客户端数据可能出现不一致,更无法在应用故障时做到数据的完全恢复。
为了满足这方面的需求,我们就结合了 linux文件系统事件监控机制这样一个系统特性(即inotify),通过使用工具 inotify-tools,整合出了 rsync+inotify 这样的一个技术架构,来实现数据实时同步的功能!
Linux 内核从 2.6.13 版本开始提供了 inotify 通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。
使用 rsync 工具与 inotify 机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。
下载地址:inotify-tools download | SourceForge.net notify-tools-3.13
# wget https://sourceforge.net/projects/inotify-tools/files/inotify-tools/3.13/inotify-tools-3.13.tar.gz
我们把taijitao63上/var/www/html目录实时同步到taijitao64的/web-back目录中
[root@taijitao63 ~]# ls /proc/sys/fs/inotify/ //查看调控参数
max_queued_events #表示监控时间队列 默认16384 可以使用cat命令查看
max_user_instances #表示最多监控实例数 默认128
max_user_watches #表示每个实例最多监控文件数 默认8192
#在Linux内核中,默认的Inotify机制提供了三种调控参数,当要监控的目录,文件数比较多的时候或者变化比较频繁的时候,要加大三个数值
可以直接修改/etc/sysctl.conf配置文件,将管理队列设置为32786,实例数:1024,文件数:9000000(大于监控目标总数即可)
[root@taijitao63 ~]# vim /etc/sysctl.conf
…… #末尾添加下面三行
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 90000000
[root@taijitao63 ~]# sysctl -p
随便查看一个是否成功:
[root@taijitao63 ~]# cat /proc/sys/fs/inotify/max_user_watches
90000000
安装 inotify-tools 后,将拥有 inotifywait、inotifywatch 辅助工具程序,从而来监控、汇总文件系统改动情况。
[root@taijitao63 ~]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@taijitao63 ~]# tar xvf inotify-tools-3.13.tar.gz -C /usr/local/src/
[root@taijitao63 ~]# cd /usr/local/src/inotify-tools-3.13/
[root@taijitao63 inotify-tools-3.13]# ./configure --prefix=/usr/local/inotify-tools ; make ; make install
inotifywait 仅执行阻塞,等待 inotify 事件,你可以使用它来监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等),并且可以结合 shell 脚本,更好的使用 inotifywait。
inotifywatch 用来收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
使用 inotifywait 命令监控网站目录/var/www/html发生的变化。然后在另一个终端向/var/www/html目录下添加文件、移动文件,查看屏幕输出结果。
[root@taijitao63 ~]# cd ; ln -s /usr/local/inotify-tools/bin/* /usr/bin/ //方便直接调用命令
语法:inotifywait [-hcmrq] [-e ] [-t ] [-- format ] [--timefmt ] [ ... ]
参数:
-h,–help # 输出帮助信息
@ # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径
–fromfile # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头
-m,–monitor # 接收到一个事情而不退出,无限期地执行。默认行为是接收到一个事情后立即退出
-d,–daemon # 跟–monitor一样,除了是在后台运行,需要指定 –outfile把事情输出到一个文件。也意味着使用了–syslog
-o,–outfile # 输出事情到一个文件而不是标准输出。
-s,–syslog # 输出错误信息到系统日志
-r,–recursive # 监视一个目录下的所有子目录。
-q,–quiet # 指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude # 正则匹配需要排除的文件,大小写敏感。
–excludei # 正则匹配需要排除的文件,忽略大小写。
-t,–timeout # 设置超时时间,如果为0,则无限期地执行下去。
-e,–event # 指定监视的事件。 这些事件包括: create 创建,move 移动,delete 删除,modify 修改文件内容,attrib 属性更改。
-c,–csv # 输出csv格式。
–timefmt # 指定时间格式,用于–format选项中的%T格式。
– format # 指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式
下面是一些可监听事件,针对-e选项使用:
access | 文件读取 |
modify | 文件更改。 |
attrib | 文件属性更改,如权限,时间戳等。 |
close_write | 以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。 |
close_nowrite | 以只读模式打开的文件被关闭。 |
close | 文件被关闭,不管它是如何打开的。 |
open | 文件打开。 |
moved_to | 一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。 |
moved_from | 一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。 |
move | 包括moved_to和 moved_from |
move_self | 文件或目录被移除,之后不再监听此文件或目录。 |
create | 文件或目录创建 |
delete | 文件或目录删除 |
delete_self | 文件或目录移除,之后不再监听此文件或目录 |
unmount | 文件系统取消挂载,之后不再监听此文件系统。 |
这里呢,我准备了一些范例来帮助大家理解 inotifywait 命令的使用。
1、实时监控/etc目录的所有事件(包括文件的访问,写入,修改,删除等)
# inotifywait -rm /etc
Setting up watches. Beware: since -r was given, this may take a while !
Watches established.
/etc/ OPEN ld.so.cache
/etc/ CLOSE_NOWRITE,CLOSE ld.so.cache
/etc/ CREATE test
/etc/ OPEN test
/etc/ ATTRIB test
/etc/ CLOSE_WRITE,CLOSE test
此时,我在另外一个新打开的终端,touch /etc/test,这边就会产生相应的事件信息了。
2、实时监控/home目录的文件或目录创建,修改和删除相关事件
# inotifywait -mrq -e create,modify,delete /home
/home/ CREATE,ISDIR test2
/home/test2/ CREATE .bash_profile
/home/test2/ MODIFY .bash_profile
/home/test2/ CREATE .bash_logout
/home/test2/ MODIFY .bash_logout
/home/test2/ CREATE .bashrc
/home/test2/ MODIFY .bashrc
此时,我在新打开的终端上,使用useradd创建一个用户,这边就会产生相应的事件信息了!
3、实时监控/etc/passwd的文件修改,删除和权限相关事件,并且要求指定输出格式为27/06/14 16:12 /etc/passwd ATTRIB。
# inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' --event modify,delete,attrib /etc/passwd
27 /06/14 16:39 /etc/passwd ATTRIB
27 /06/14 16:39 /etc/passwd IGNORED
此时,我在新打开的终端上,使用 useradd 创建一个新用户,这边就会产生相应的事件信息了!
4、写一个脚本实现对 /data/web 目录进行监控,监控文件删除,修改,创建和权限相关事件,并且要求将监控信息写入/var/log/web_watch.log。要求日志条目要清晰明了,能突显文件路径、事件名和时间。
# cat web_watch.sh
#!/bin/bash
inotifywait -mrq --timefmt '%y/%m/%d %H:%M' -- format '%T %w%f %e' --event delete,modify,create,attrib /data/web | while read date time file event
do
case $event in
MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
echo $event '-' $ file '-' $ date '-' $ time >> /var/log/web_watch .log
;;
MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
echo $event '-' $ file '-' $ date '-' $ time /var/log/web_watch .log
;;
esac
done
# cat /var/log/web_watch.log
CREATE- /data/web/a-14/06/27-16 :21
CREATE- /data/web/aa-14/06/27-16 :21
CREATE- /data/web/aaaa-14/06/27-16 :24
CREATE- /data/web/aaaaa-14/06/27-16 :24
此时,我在新打开的终端上,使用 touch 在/data/web目录下创建a,aa,aaa,aaaa这四个文件。然后查看/var/log/web_watch.log 文件,即可发现已经产生相应的事件信息,并且按照指定格式进行存放!
语法:inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]
参数:
-h,–help # 输出帮助信息
- v ,–verbose # 输出详细信息
@ # 排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile # 从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z,–zero # 输出表格的行和列,即使元素为空
–exclude # 正则匹配需要排除的文件,大小写敏感。
–excludei # 正则匹配需要排除的文件,忽略大小写。
-r,–recursive # 监视一个目录下的所有子目录。
-t,–timeout # 设置超时时间
-e,–event # 只监听指定的事件。
-a,–ascending # 以指定事件升序排列。
-d,–descending # 以指定事件降序排列
OK,继续拿一个范例来帮助大家理解!
1、统计/home目录所在文件系统发生的事件次数
# inotifywatch -v -e create -e modify -e delete -t 30 -r /home
Establishing watches...
Setting up watch (es) on /home
OK, /home is now being watched.
Total of 3 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total modify create delete filename
8 3 4 1 /home/
监控的时候,我在新打开的终端上,创建了4个文件,修改了3个文件内容,删除了一个文件。等监控的30秒时间到了之后,他就会显示出上面的事件次数报告!
[root@taijitao63 ~]# inotifywait -mrq -e create,move,delete,modify /var/www/html/
另外开一终端,做一些改动
[root@taijitao63 ~]# echo aaa > /var/www/html/a.html
[root@taijitao63 ~]# mkdir /var/www/html/test
[root@taijitao63 ~]# cp /etc/passwd /var/www/html/test/
[root@taijitao63 ~]# rm -rf /var/www/html/test/passwd
查看监控终端
/var/www/html/ CREATE a.html
/var/www/html/ MODIFY a.html
/var/www/html/ CREATE,ISDIR test
/var/www/html/test/ CREATE passwd
/var/www/html/test/ MODIFY passwd
/var/www/html/test/ DELETE passwd
#使用 inotifywait 输出的监控结果中,每行记录中依次包括目录、事件、文件。据此可以识别变动情况。
首先要做好免密码链接
[root@taijitao63 ~]# ssh-keygen
[root@taijitao63 ~]# ssh-copy-id root@192.168.1.64
编写脚本
[root@taijitao63 ~]# vim inotify.sh
#!/bin/bash
SRC=/var/www/html
DST=root@192.168.1.64:/web-back
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
do
/usr/bin/rsync -ahqzt --delete $SRC $DST
done
#思路:只要检测到变动时间,执行rsync上行同步操作,推数据
#while read D E F是是哪个变量,前面输出的内容是三段,每一段对应的就是后面的D E F
[root@taijitao63 ~]# chmod +x inotify.sh
[root@taijitao63 ~]# echo "sh /root/inotify.sh &>> /var/log/inotify.log &" >> /etc/rc.local
Sersync 项目利用 Inotify 和 Rsync 技术实现对服务器数据实时同步的解决方案,其中 Inotify 用于监控 Sersync 所在服务器上文件系统的事件变化,而 Rsync 是目前广泛使用的本地以及异地数据同步工具,其优点是只对变化的目录数据操作,甚至是一个文件不同的部分进行同步,所以其优势大大超过使用挂接文件系统或 scp 等方式进行镜像同步。
目前使用比较多的同步工具为 Inotify-tools 和 Openduckbill。Inotify-tools 在前面的博文介绍过,这里就不做阐述。简单说下 Openduckbill,Openduckbill 也是 google 的一个开源项目,它也是依赖于inotif-tools,并且它 和 Inotify都是基于脚本语言编写的,其设计思路同样是采用文件系统事件监控机制 Inotify 与 Rsync 命令 来做设计架构的。这里在多说一点,有些朋友可能会在两台甚至多台服务器之间,互相搭建 Inotify-tools + Rsync 之类的同步部署来做互相同步,这个是很不推荐的,主要一方面就是在同步的文件时间戳上容易出问题,导致同步失败,甚至版本不同步。因此,如果你是要做互相同步,推荐使用 Csync 。
相比较上面 Inotify-tools 和 Openduckbill两个项目,本项目优点是:
1、Sersync 使用 c++ 编写,对 linux 系统文件产生的临时文件和重复的文件操作会进行过滤,在本文后面会提到该点。使用sersyc和rsync结合做同步的时候,会大大减少运行时所消耗的本地以及网络资源,因此在速度方面有显著提升。
2、相比 Inotify-tools 和 Openduckbill,Sersync 配置起来更为简单方便。在谷歌 Sersync 项目下载的安装包的 bin 目录下,放置了已经编译好的二进制文件,搭配 bin 目录下的xml文件可以直接部署使用。
3、Sersync 采用多线程(默认10)进行同步(即可以并发同步多个不同文件),尤其是针对较大文件同步的时候,它能够保证多个服务器实时保持同步状态。
4、Sersync 自带了出错处理机制。它可以通过失败队列自动对之前出错的文件进行重新同步操作。如果届时依旧失败,它会每 10 个小时对同步失败的文件再进行重新同步操作,直到文件同步为止。
5、Sersync 自带有 crontab 功能,因此不需要借助系统的 crontab ,只需在 xml 配置文件中开启该功能,即可按预先的配置,每隔一段时间自动做一次整体同步操作。
6、Sersync 还自带了 socket 与 refreshCDN 的协议扩展,可以满足有特殊需求的公司二次开发。(之前的版本有http扩展,目前已去除)
下面是,Sersync 谷歌项目组上面的设计结构图!
针对上图的设计架构,这里做几点说明,来帮助大家阅读和理解该图:
1、线程组线程是等待线程队列的守护线程,当事件队列中有事件产生的时候,线程组守护线程就会逐个唤醒同步线程。当队列中 Inotify 事件较多的时候,同步线程就会被全部唤醒一起工作。这样设计的目的是为了能够同时处理多个 Inotify 事件,从而提升服务器的并发同步能力。同步线程的最佳数量=核数 x 2 + 2。
那么之所以称之为线程组线程,是因为每个线程在工作的时候,会根据服务器上新写入文件的数量去建立子线程,子线程可以保证所有的文件与各个服务器同时同步。当要同步的文件较大的时候,这样的设计可以保证每个远程服务器都可以同时获得需要同步的文件。
2、服务线程的作用有三个:
a、处理同步失败的文件,将这些文件再次同步,对于再次同步失败的文件会生成 rsync_fail_log.sh 脚本,记录失败的事件。
b、每隔10个小时执行 rsync_fail_log.sh 脚本一次,同时清空脚本。
c、crontab功能,可以每隔一定时间,将所有路径整体同步一次。
3、过滤队列的建立是为了过滤短时间内产生的重复的inotify信息,例如在删除文件夹的时候,inotify就会同时产生删除文件夹里的文件与删除文件夹的事件,通过过滤队列,当删除文件夹事件产生的时候,会将之前加入队列的删除文件的事件全部过滤掉,这样只产生一条删除文件夹的事件,从而减轻了同步的负担。同时对于修改文件的操作的时候,会产生临时文件的重复操作。
1、sersync是基于inotify开发的,类似于inotify-tools的工具
2、sersync可以记录下被监听目录中发生变化的(包括增加、删除、修改)具体某一个文件或者某一个目录的名字,然后使用rsync同步的时候,只同步发生变化的文件或者目录
1、rsync+inotify-tools
a、inotify只能记录下被监听的目录发生了变化(增,删,改)并没有把具体是哪个文件或者哪个目录发生了变化记录下来;
b、rsync在同步的时候,并不知道具体是哪个文件或目录发生了变化,每次都是对整个目录进行同步,当数据量很大时,整个目录同步非常耗时(rsync要对整个目录遍历查找对比文件),因此效率很低
2、rsync+sersync
a、sersync可以记录被监听目录中发生变化的(增,删,改)具体某个文件或目录的名字;
b、rsync在同步时,只同步发生变化的文件或目录(每次发生变化的数据相对整个同步目录数据来说很小,rsync在遍历查找对比文件时,速度很快),因此效率很高。
总结:
当同步的目录数据量不大时,建议使用rsync+inotify
当同步的目录数据量很大时(几百G甚至1T以上)文件很多时,建议使用rsync+sersync
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。