Linux

Linux文件实时同步的实现

 inotify介绍:

notify一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、
权限属性、删除创建移动等操作,也就是可以监控文件发生的一切变化,我们可以利用内核提供的这个属性,在文件发生任何变化时都
触发rsync同步动作,这样就做到数据的实时同步了。
Inotify的监控功能是需要内核支持的,Linux从kernel 2.6.13开始,Inotify功能正式加入内核,在RHEL5版本已经完全支持。

 

Rsync介绍:
1.1 软件简介
   Rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync本来是用以取代rcp的一个工具,它当前由 rsync.samba.org维护。Rsync使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。
    Rsync可以搭配rsh或ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方Rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。此外,它在windows平台下也有相应的版本,比较知名的有cwRsync和Sync2NAS。
Rsync的基本特点如下:
1.可以镜像保存整个目录树和文件系统;
2.可以很容易做到保持原来文件的权限、时间、软硬链接等;
3.无须特殊权限即可安装;
4.优化的流程,文件传输效率高;
5.可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
    6.支持匿名传输。
1.2 核心算法
假定在名为α和β的两台计算机之间同步相似的文件A与B,其中α对文件A拥有访问权,β对文件B拥有访问权。并且假定主机α与β之间的网络带宽很小。那么rsync算法将通过下面的五个步骤来完成:
1.β将文件B分割成一组不重叠的固定大小为S字节的数据块。最后一块可能会比S 小。
2.β对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的MD4强校验。
3.β将这些校验结果发给α。
4.α通过搜索文件A的所有大小为S的数据块(偏移量可以任选,不一定非要是S的倍数),来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
5.α发给β一串指令来生成文件A在β上的备份。这里的每一条指令要么是对文件B经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件B的任何一个数据块匹配上的。
1.3 命令语法
rsync的命令格式可以为以下六种:
rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
对应于以上六种命令格式,rsync有六种不同的工作模式:
1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
6)列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

 

Linux实时同步文件至Linux配置:

服务端配置【Linux】

1.到http://rsync.samba.org下载最新版本3.0.7
2.解压缩到/usr/local/rsync
3.编译 root@xiaoshan-desktop:/usr/local/rsync/rsync-3.0.7# ./configure –prefix=/usr/local/rsync && make && make install
4.配置/etc/rsyncd.conf

uid=root  

gid=root  

hosts allow=192.168.61.113,192.168.61.195  

#hosts deny=0.0.0.0/32  

use chroot=no  

max connections=10  

secrets file=/etc/rsyncd.pas  

motd file=/etc/rsyncd.motd  

pid file =/var/run/rsyncd.pid  

lock file=/var/run/rsyncd.lock  

log file=/var/log/rsyncd.log  

  

[test]  

path=/tongbu1  

comment=rsync files  

ignore errors  

read only=no  

list=no  

auth users=root  

#secrets file=/etc/rsyncd.pas  

pid file=/var/run/rsyncd.pid  

log file=/var/log/rsyncd.log  

lock file=/var/run/rsyncd.lock  

  

[test1]  

path=/tongbu2  

comment=rsync files  

ignore errors  

read only=no  

list=no  

auth users=root  

#secrets file=/etc/rsyncd.pas  

pid file=/var/run/rsyncd.pid  

log file=/var/log/rsyncd.log  

lock file=/var/run/rsyncd.lock  

 

【注:】rsyncd.conf中不能有空格,[test]为一个模块,在配置文件中可以增加多个模块

5.配置/etc/rsyncd.pas
root:000000
格式为:用户名:密码,可以设置多个用户密码,每个

6.修改rsyncd.pas的文件属性
chmod 0600 /etc/rsyncd.pas

7.启动rsync,默认端口为873
root@xiaoshan-desktop:~# /usr/local/rsync/bin/rsync --daemon --port=873

若需要在开机时自动启动,则可以
加入inetd.conf
编辑/etc/services,加入rsync 873/tcp,指定rsync的服务端口是873
编辑/etc/inetd.conf,加入rsync stream tcp nowait root /bin/rsync rsync –daemon
加入rc.local

8.检查防火墙开放873端口
9.使用telnet 192.168.61.195 873查看端口是否开放
10.使用rsync root@192.168.61.195验证是否可用

 

配置/etc/rsyncd_clinet.pas
000000
格式为:密码

修改rsyncd_client.pas的文件属性

sh#  chmod 0600 /etc/rsyncd.pas 

 

配置自动同步inotify【linux】

为能在shell下使用inotify特性,需要安装inotify-tools
下载地址:http://inotify-tools.sourceforge.net/
编译安装
./configure
make
make install
完成后,注意查看manpage,man inotify 、 man inotifywait
inotifywait 仅执行阻塞,等待 inotify 事件。您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。在 shell 脚本中使用 inotifywait。 
inotifywatch 收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

 

gedit /opt/inotify-rsync.sh

 

#!/bin/bash  

  

###########################  

# 在这里配置本地文件夹,目标host,目标的rsync_module。rsync_module在同步机器的/etc/rsyncd.conf文件中配置  

# 逗号前后不要有空格  

#sync[0]='/tongbu,192.168.61.113,test' # localdir,host,rsync_module  

#sync[0]='/tongbu,192.168.61.195,test' # localdir,host,rsync_module  

sync[0]='/tongbu,192.168.61.195,test'  

sync[1]='/tongbu,192.168.61.195,test1'  

###########################  

  

for item in ${sync[@]}; do  

  

dir=`echo $item | awk -F"," '{print $1}'`  

host=`echo $item | awk -F"," '{print $2}'`  

module=`echo $item | awk -F"," '{print $3}'`  

  

inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' \  

 --event CLOSE_WRITE,create,move,delete  $dir | while read  date time file event  

    do  

        echo $event'-'$file  

        case $event in  

            MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)  

                if [ "${file: -4}" != '4913' ]  && [ "${file: -1}" != '~' ]; then  

                    cmd="rsync -vzrtopg --progress --delete --password-file=/etc/rsyncd-clinet.pass $dir root@$host::$module"  

                    echo $cmd  

                    $cmd  

                fi  

                ;;  

  

            MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)  

                if [ "${file: -4}" != '4913' ]  && [ "${file: -1}" != '~' ]; then  

                    cmd="rsync -vzrtopg --progress --delete --password-file=/etc/rsyncd-clinet.pass $dir root@$host::$module"  

                    echo $cmd  

                    $cmd  

                fi  

                ;;  

        esac  

    done &  

done   

 

测试:

1.开放终端:/usr/local/rsync/bin/rsync --daemon --port=873  启动rsync服务端

2.root@xiaoshan-desktop:/opt# ./inotify-rsync.sh 启动监控脚本,此脚本支持多目录多服务器监控

3.增加文件:root@xiaoshan-desktop:/tongbu# touch happy.txt

4.查看/tongbu1、/tongbu2中文件变化

 

 

Linux实时同步文件至Windows配置:

服务端配置【windows】
1.到http://www.itefix.no/i2/cwrsync下载最新版本的cwRsync_Server和cwRsync
2.安装cwRsync服务端
3.配置rsyncd.conf文件,和linux一样的配置
4.启动服务,在“服务”中将服务设置为“自动”启动
5.测试从linux手动同步文件至windows
将linux的/tongbu中的文件同步到113的test模块对应的目录
root@xiaoshan-desktop:~# rsync -vzrtopg --progress --delete /tongbu root@192.168.61.113::test

 

 

由于inotify是Linux的守护进程,所有windows上使用这个无法做到实时同步,可以使用Jnotify进行编程,然后调用rsync的命令实现同步。

 

 

Windows实时同步文件:

windows下实时同步文件可以使用Robocopy,它可以做到将监控文件,但监控到变化之后,最少需要1分钟才会执行同步,当然执行同步的时间,和有多少文件变化才会同步,都可以设置,可以进行文件类型和文件夹过滤,可以对大问文件进行过滤,可以不删除备份服务器的文件等等,功能非常强大。

 
 
我使用的测试命令:  E:\application software>robocopy e:\data \\192.168.61.113\work /XF /MIR /MON:1 / MOT:0

 

Publish Comment发表评论

点击刷新验证码 点击图片可刷新验证码

Comment网友评论

詹绍乾 Jancy © 版权所有 2010

Copyright © 2010 by zhanshaoqian.cn All right reserved.