rsync+inotify实现数据实时备份
§·实验案例:rsync配合inotify实现数据的实时备份 5
§·rsync简单介绍
传统的数据备份方式有cp命令,cp命令的源文件和目标文件都在本地,实现的是对文件的一种完整复制。
wget命令通过网络进行备份,不支持增量备份。
§·什么是rsync
rsync是Linux/unix系统下的文件同步和数据传输工具,它采用的“rsync”算法,使一个客户机和远程文件服务器之间的文件同步。通过rsync可以将同一个服务器的数据从一个分区备份到另一个分区,也可以将本地系统的数据通过网络传输当时备份到任何一个远程主机上,rsync可以在中断之后恢复传输,rsync只传输源文件和目标文件之间不一致的部分,rsync可以执行完整备份或增量备份。
§·rsync的功能特性
rsync即remote sync。从软件名称上就可以看出来它实现的功能,rsync有如下特性:
1.可以镜像保存整个目录树和文件系统;
2.可以增量同步数据,文件传输效果高,因而同步时间很短;
3.可以保持原有文件的权限,时间等属性;
4.加密传输数据,可以保证数据的安全性;
5.可以使用rcp ssh等方式传输文件,当然也可以通过Socket连接传输文件;
6.支持匿名传输。
介绍:rsync:remote sync(远程同步,也可以做本地同步,实现的是增量同步,对比文件特征码)
功能:本地同步如cp ,远程同步如:scp (rsync不具备加密)
§·rsync的优点和不足
rsync具有安全性高,备份迅速,支持增量备份的优点,通过rsync可以解决对实时性要求不高的数据备份需要。
rsync在高端业务系统中逐渐暴露出很多的不足:
1,rsync同步数据时,需要扫描所有文件后进行对比,然后进行差量传输。如果如文件数量达到百万甚至千万量级,扫描所有文件将是非常耗时的。
2.其次rsync不能实时监控同步数据。
§·初识inotify
inotify是一种强大的 细粒度的 异步的文件系统时间监控机制,linux内核从2.6.13版本起,加入了对inotify的支持。通过inotify可以监控文件系统中添加,删除,修改,移动等各种细微时间,利用这个内核接口,第三方软件可以监控文件系统下文件的各种变化情况,inotify-tools就是这样的一个第三方软件。
rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际的数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,会触发rsync同步,这样刚好解决了同步数据的实时性问题。
§·rsync命令工作模式
第一种:shell模式,也称为本地模式
Local: rsync [OPTION...] SRC... [DEST] [root@love681 rsync-test-dir]# rsync -av /etc ./ [root@love681 rsync-test-dir]# ls etc
第二种:远程shell模式,此时可以利用ssh协议承载其数据传输过程
第三种:列表模式(干跑模式)其工作方式与ls相似,仅列出源的内容: -nv
Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST](获取目标文件) Push: rsync [OPTION...] SRC... [USER@]HOST:DEST(上传文件) # rsync fstab root@10.1.16.20:/root/rsync-test
第四种:服务器模式,此时rsync可以工作为守护进程,能够接收客户端的数据传输请求;在使用时,可以在客户端使用rsync命令把文件发送给守护进程,也可以向服务器获取数据文件。
§·rsync常用命令选项
-n:在不确定命令是否能按愿意执行时,务必要事先测试:-n可以完成此功能;
-v:–verbose ,详细输出模式;
-q:–quiet,静默模式;
-c:–checksum,开启校验功能,强制对文件传输进行校验;
-r:–recursive,递归模式;
-a:–archives,归档,保留文件的原有属性;
-p:–perms 保留文件的权限;
-t:–times 保留文件的时间戳;
-l:–links 保留文件的符号链接;
-g:–group保留文件的属组;
-o:–owne保留文件的属主;
-D: –devices 保留设备文件
-e:ssh 表示使用ssh协议作为承载;
-z : 对文件压缩后传输;
–progress : 显示进度条;
–stats :显示如何执行压缩和传输的过程
—
注意:rsync命令使用时,如果源参数的末尾有斜线,就会复制指定目录的内容,而不会复制目录本身;如果没有斜线,则会复制目录本身;目标参数末尾的斜线没有作用,命令使用如下:
#rsync -r /mydata/data /backups/ :会把目录data直接同步到/backups目录中;
#rsync -r /mydata/data/ /backups/ :会把目录data/中的所有文件直接同步到/backups目录中;
§·配置rsync以守护进程的方式运行
※·安装并启动 xinetd
#yum -y install xinetd rsync
※·为rsync服务器提供配置文件
配置文件为: /etc/rsyncd.conf
定义一个全局配置和多个rsync的共享配置:
#Global Settings uid = nobody gid = nobody use chroot = no max connetions = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log #Directory to be rsynced [rsynced_name] path = /path/to/some_dir ignore errors = yes read only = no write only = no hosts allow = white_list_ip/net hosts deny = *
说明:
1.二者都不出现时,默认为允许访问;
2.只出现hosts allow : 定义白名单,但是没有被匹配到的主机由默认规则处理,即为允许;
3.只出现hosts deny : 定义黑名单,出现在名单中的都被拒绝,不匹配的即为允许;
4.二者同时出现,先检查hosts allow 如果匹配就allow,否则,检查hosts deny,如果匹配则拒绝;如果二
者均无匹配,则有默认规则处理,即为允许。
list = falseuid = rootgid = rootauth users = usernamesecrets file = /etc/rsyncd.passwd
※·配置/etc/rsyncd.passwd文件格式
文件格式(明文):
username:password
文件权限设置为:600
※·配置服务开机启动
#chkconfig rsync on
#service xinetd start
监听于 873/tcp
※·客户端测试命令
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] (下载数据) rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 格式:rsync -av username@10.1.16.20::rsynced_name/* ./ Push: rsync [OPTION...] SRC... [USER@]HOST::DEST (上传数据) rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST 格式 :rsync -av /etc username@10.1.16.20::rsynced_name
§·实验案例:rsync配合inotify实现数据的实时备份
§·rsync备份服务器的搭建
(别人可以备份数据到服务器,也可以把服务器上的数据同步到自己的本地去)
1 .提供其配置文件:
~]# yum -y install xinetd rsync #服务器端安装rsync服务器软件(该软件也包含客户端工具) ~]# vim /etc/rsyncd.conf #编辑主配置文件(默认该文件是没有的) uid = nobody gid = nobody use chroot = no max connetions = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log [ixdba] #服务器被访问时的对外地址(必要重要) path = /webdata #服务器上世纪存放数据的目录 comment = ixdba files #描述信息 ignore errors = yes #是否忽略错误 read only = no #只读 关闭 write only = no #只写 关闭 hosts allow = * #允许访问的主机 list = false uid = root #启动rsync服务的用户 gid = root #启动rsync该服务的组 auth users = user1,user2 #远程登录服务器的认证用户 secrets file = /etc/server.pass #认证用户的密码文件
2.由于rsync服务为xinetd管理的服务的,添加rsync服务开机自动启动
#chkconfig --add rsync #chkconfig rsync on #service xinetd start 监听于 873/tcp
3.设置服务器密码文件:
注意把文件权限改为:600权限,不让其他人可以看到密码
vim /etc/server.pass user1:123456 user2:666666
※·rsync客户端连接服务器
1.客户端准备密码文件,方便自动登录rsync服务器
注意把文件权限改为:600权限,不让其他人可以看到密码
vim /etc/rsync-back 123456
2.使用命令连接到rsync服务器
[root@Centos7 ~]# rsync -vzrtopg --delete --progress user1@10.1.16.44::ixdba /ixdba.net --password-file=/etc/server.pass
# -vzrtopg : 查看前面介绍,备份文件是不改变文件属性
v是:即详细输出模式;
z是:表示–compress压缩
r是:表示–recursive,对子目录以递归模式处理
t是:–times,保持的时间信息
o是:–owner,保持文件的属组
p是:–perms,保持文件的权限
g是:–group 保持文件的属组信息
# –delete : 以rsync服务器端基准进行数据镜像同步,以服务器的数据为准
# –progress :显示数据镜像同步的过程
# user1@10.1.16.44::ixdba :对rsync服务器ixdba模块进行备份
# /ixdba.net : 客户端存放数据的路径
# –password-file=/etc/server.pass :指定user1的密码文件路径
3.让其自动备份服务器上的数据,需要在crontab计划任务
crontab -e 30 3 * * * /usr/bin/rsync -vzrtopg --delete --progress user1@10.1.16.44::ixdba /ixdba.net --password-file=/etc/server.pass
§·rsync服务器配置小结:
以上两步的搭建保证了客户端可以把服务器上的数据每天备份一次,我们配合inotify程序的,来实现数据实现备份。linux 2.6.13以后的内核提供了 inotify文件监控机制,通过rsync与inotify的组合,完全可以实现rsync服务器端与客户端数据的实时同步。
§·安装inotify工具inotify-tools
※·判断系统内核是否支持inotify
1.内核版本大于:2.6.13
[root@localhost ixdba.net]# uname -r 2.6.18-308.el5 [root@localhost ixdba.net]# ll /proc/sys/fs/inotify/ 总计 0 -rw-r--r-- 1 root root 0 10-14 22:51 max_queued_events -rw-r--r-- 1 root root 0 10-14 22:51 max_user_instances -rw-r--r-- 1 root root 0 10-14 22:51 max_user_watches [root@localhost ixdba.net]#
※·安装inotify-tools
◎·该软件需要自己下载编译安装。inotify-tools-3.13
~}#cd inotify-tools-3.13 ~}#./configure ~}#make ~}#make install
◎·inotify-tools-3.13生成的两个命令文件
生成的两个程序文件
[root@love681 inotify-tools-3.13]# ll /usr/local/bin/inotifywa* -rwxr-xr-x 1 root root 38582 Oct 13 13:25 /usr/local/bin/inotifywait -rwxr-xr-x 1 root root 40353 Oct 13 13:25 /usr/local/bin/inotifywatch [root@love681 inotify-tools-3.13]#
inotifywait :用于等待文件或文件集上的一个特定时间,可以监控任何文件和目录设置,并且可以递归地监控整个目录树。
inotifywatch :用于手机被监控的文件系统统计数据,包括每个inotify时间发生多少次等信息。
————————————————————————————————————————————————
关于inotify定义的一些接口参数,可以限制inotify消耗kernel menory的大小,有一下几个参数可以了解下:
[root@love681 /]# cat /proc/sys/fs/inotify/max_queued_events 16384 #表示调用inotify_init是分配到的inotify instances中可排队的event数的最大值,超出这个值的时间被丢弃,但会触发IN_Q_OVERFLOW事件,默认值为:16384 [root@love681 /]# cat /proc/sys/fs/inotify/max_user_instances 128 #表示每一个real user ID可参见的inotify nstances的数量上限,默认值为 128 [root@love681 /]# cat /proc/sys/fs/inotify/max_user_watches 8192 #表示每个inotify 实例相关联的watches的上限,也就是每一个inotify实例可以监控的最大目录数量,如果监控的文件数目巨头,需要根据时间情况适当的增加此值的大小。默认为:8192,调整方式为: echo 30000000 > /proc/sys/fs/inotify/max_user_watches inotify instances 英文翻译为:通知实例
inotifywait命令相关解释
inotifywait是一个监控等待事件,可以配合shell脚本使用它。下面介绍一下常用的参数:
-m :—monitor ,表示始终保持事件监听状态
-r : –recursive , 表示递归查询目录
-q : –quiet ,表示打印出监控事件
-e : –event 通过此参数可以指定要监控的事件,常见的事件有 modify ,delete ,create , attrib 等等
modify : 修改文件
delete : 删除文件
create : 创建文件
attrib : 改变文件的属性
close_write : 等待写的操作完成
◎使用inotifywait脚本实时监控文件状态触发rsync上传命令
在服务器上搭建好rsync服务,客户机就可以自动的定时的上传文件到服务器上,不需要手工的输入用户名和密码,那我们现在只需要在客户机上配置一个脚本,当客户机上指定的监控目录有文件变化时,自动触发本地的rsync命令上传指定监控下的文件即可。
配置实例脚本一 :inotify脚本命令如下:
####inotify+rsync实现数据实时同步的脚本文件 #!/bin/bash host=192.168.12.131 src=/web/wwwroot/ dst=web1 user=user1 inot_cmd=/usr/local/bin/inotifywait ###把命令产生的信息管道传到while循序语句中 inot_cmd -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \ | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src $user@$host::$dst echo "${files} was resynced " >> /tmp/rsync.log 2>&1 done #### --timefmt : 指定时间的输出格式 #### --format : 指定变化文件的详细信息 这两个参数一般配合使用,通过指定输出格式输出类型一下的内容: 15/04/10 00:29 /web/wwwroot/ixdba.sh DELETE ,ISDIR was rsynced 15/04/10 00:30 /web/wwwroot/index.html MODIFY was rsynced 15/04/10 00:31 /web/wwwroot/prce-8.02.tar.gz CREATE was rsynced
这个脚本的作用就是通过inotify监控文件目录的变化,监控的文件变化为 -e后面定义的变化:创建文件,删除文件,修改文件,文件属性修改,只有其中一项有变动,就执行rsync把本地文件上传至rsync服务器上。
通过这样的脚本,就可以实现在一台本地rsync客户端电脑上修改文件,可以自动同步数据到远程或本地服务器上,服务器的数量可以是多台。
§·小结:rsync配合inotify实现数据的实时备份
1 . 搭建多台rsync服务器,搭建rsync服务器的要求就是,本地的客户机上传数据和下载数据不需要人工的干预即 可实现
2. 设置rsync客户端实现备份远程服务器上数据,或把本地的数据同步到远程服务器上。
如果是备份远程rsync服务器上的数据,可以在本地rsync客户机上做一个计划任务,定时去备份服务器上的数据。
如果是需要把本地的数据实时的上传到rsync服务器上去,就需要配合inotify的通知机制,实时的监控本地需要同步是的数据,当有数据该变时,inotify脚本自动触发rsync命令同步本地数据至服务器上。
3. inotify是由内核提供的文件系统监视机制,可以监视文件的 打开,关闭,移动/重命名,删除,创建或者改变属性等等,具体的inotify的机制,参考扩展 notify的机制一文。
原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/56003