首页 > 编程知识 正文

linux文件双向同步,linux如何实时同步数据

时间:2023-05-03 18:37:38 阅读:43948 作者:1879

用Inotify Rsync实时同步linux文件一,介绍inotify

inotify是Linux内核版本2.6.13 (June 18,2005 )中新添加的子系统(API ),用于监视文件系统更改(如文件更改、添加和删除)并APP相应的事件该机制由知名桌面搜索引擎项目beagle引入,取代了此前具有类似功能但存在诸多缺点的dnotify。 inotify可以同时监视文件和目录。 监视目录时,可以同时监视目录和目录中的每个子目录和文件。 另外,inotify使用文件描述符作为接口,因此可以使用常规文件I/O操作select、poll和epoll来监视文件系统的更改。 IN_ACCESS :文件访问了IN_MODIFY,这是inotify可以监视的文件系统的常见事件。 文件更改为IN_ATTRIB,文件属性更改为IN_CLOSE_WRITE,可写打开的文件关闭为IN_CLOSE_NOWRITE文件为in _ moved _ ffrite 所谓将文件移动到监视目标目录IN_CREATE、在监视目标目录中创建新文件或子目录IN_DELETE、在IN_DELETE_SELF中删除文件或目录的自移动,是指实际移动1、/proc/sys/fs/inotify/max _ queue _ events当APP应用程序调用inotify实例时,必须初始化inotify实例,超过此上限的事件将被丢弃2、/proc/sys/fs/inotify/max _ user _ instances此文件中的数字用于设置可以为每个用户id (由id标识的用户)创建的inotify实例数的上限3、/proc/sys/fs/inotify/max _ user _ watches此文件中的数字用于设置每个用户ID可以监视的最大文件或目录数。 二. inotify-tools

inotify是一个API,需要开发和调用APP应用程序。 对很多用户来说,这带来了很多不便,inotify-tools的出现弥补了这一不足。 inotify-tools是一组组件,其中包括c库和若干命令行工具,可用于通过命令行或脚本监视文件系统事件。 是由Rohan McGovern开发的。 项目的网址为http://inotify-tools.SourceForge.net。 inotify-tools提供了两个命令行工具: inotifywait。 在inotify API中等待被监视文件上的对应事件并返回监视结果。 默认情况下,正常结果返回标准输出,诊断类信息返回标准错误输出。 这可以在监视为相应监视对象指定的事件后结束,也可以进行持续监视。 inotify watch—通过inotify API收集有关被监视的文件或目录的事件,并输出统计信息。 inotifywait命令的使用概述: inotifywait特别适合在脚本中等待事件的发生,以及基于特定事件执行相应的操作。 监视脚本指定目录中的文件更改、新建、删除和属性信息更改,并使用rsync命令将与事件对应的文件同步到其他主机。 典型选项为--m,--monitor:inotifywait,其中的默认操作在指定文件中发生一次监视的特定事件后终止,但该选项允许持续监视。 -r,--recursive :递归监视指定目录下的所有文件,包括新创建的文件或子目录; 如果要监视的目录中的文件数巨大,则通常默认值为8192,因此必须更改/proc/sys/fs/inotify/max _ users _ watchs内核参数。 -e event,--event event :指定要监视的特定事件。 缺省情况下监视所有事件。 其中,事件包括: access、modify、attrib、close_write、close_nowirte、close、open、move_to、moved_from、moved 如果在包含creeent的--time fmt-- format选项中使用%T,则可以使用--timefrt选项指定符合strftime规范的自定义时间格式。 此时间格式可用的格式可从strftime手册页获得。 - -timefrt后常用参数为“%d/%m/%y %H:%M”; - -格式' % t % w % f '; 一般格式如下。

%w:显示被监控文件的文件名; %f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串; %T:使用--timefmt选项中自定义的时间格式; 例如,要监控/tmp/test目录及其内部所有文件上发生的create,delete,modify,close_write事件,则使用如下命令: # inotify -r --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,close_write /tmp/test 此命令在监控到某文件上第一次事件后就会退出,如果想一直监控,则需要为命令添加-m选项。 在很多场景中都会用到将某主机上的某目录下的所有文件改变实时同步至另一主机上的指定位置,这也可以通过在脚本中使用inotifywait结合rsync命令来实现,比如如下脚本: #!/wxdjy/bash DESTHOST=172.16.100.6 DESTHOSTDIR=/www/htdocs/ SRCDIR=/www/htdocs/ inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e create,delete,modify,attrib $SRCDIR | while read DATE TIME DIR FILE do $FILECHANGE=${DIR}${FILE} rsync -avze 'ssh' $SRCDIR root@${DESTHOST}:${DESTHOSTDIR} &>/dev/null && echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/filesync.log done 需要注意的是,此脚本中的rsync是通过ssh加密后进行文件传输的,因此需要事先配置好相应的ssh能够基于密钥对用户进行认证,以免每一次文件同步都需要用户手动输入密码。 当然,如果数据传输不需要加密,此处也可以通过在目录主机的启动rsyncd守护进程来实现。

三、配置rsyncd+inotify实现文件实时同步:

本案例实现监控原主机上指定目录中的所有文件变化,并将变化实时同步至目标主机的指定目录中;所用主机及相关目录如下: 源主机:RHEL5.4(x86),172.16.100.1, 文件所在的目录为/www/htdocs; 目标主机:RHEL5.4(x86),172.16.100.6, 文件所在的目录为/www/htdocs; 1、设定目标主机(本例为172.16.100.6) 本案例中采用基于rsync守护进程的方式进行数据同步,其数据传输过程是明文方式,因此只适用于在特定的场景中应用。 1)安装相关软件: 目标主机是接收别的主机发送来的文件的服务器,因此,其rsync需要以守护进程的方式工作。rsync服务通常基于超级守护进程xinetd管理的方式来实现,因此需要事先安装rysnc和 xinetd: # yum -y install rsync xinetd 2)为rsync提供配置文件/etc/rsyncd.conf,内容类似如下内容: # Section 1: Global settings uid = nobody gid = nobody use chroot = no max connections = 3 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Section 2:Directory to be synced [htdocs] path = /www/htdocs ignore errors = yes read only = no write only = no hosts allow = 172.16.0.0/16 hosts deny = * list = false uid = root gid = root auth users = wwwuser secrets file = /etc/rsync.passwd 其中的相关指令及其说明可以通过rsyncd.conf的手册而获取。而其访问控制功能也可基于xinetd进行,具体方法请参照xinetd.conf的手册页。 3)提供secrets file所指定的口令文件/etc/rsync.passwd,其内容类似如下: htdocsuser:passwOrdForhtdOcs 其中冒号前的是用户名,冒号后的是对应用户的密码。此文件不能为其他任意用户可访问,因此可用如下命令修改: # chmod 600 /etc/rsync.passwd 4)配置服务可以开机启动: # chkconfig rsync on # chkconfig xinetd on # service xinetd start 默认情况下,rsyncd监听的端口为873/TCP,这可以通过如下命令查看: # netstat -tnlp | grep ":873" tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3653/xinetd 2、设定源主机 1)安装相关软件

源主机需要实时监控指定目录中的所有文件上与文件改变相关的事件,并在事件发生时将改变的数据同步至目录主机,因此,源主机上需要确保内核支持inotify,并安装inotify-tools和rsync。

rsync的安装参照目标主机的中的方式进行即可。 inotify-tools的安装可以基于源码编译的方式进行,也可以通过安装其rpm进行。 ×××地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz rpm包下载页面:http://rpm.pbone.net/index.php3/stat/4/idpl/15265939/dir/redhat_el_5/com/inotify-tools-3.14-1.el5.i386.rpm.html 这里以编译源代码的方式演示安装过程: # tar xf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure # make # make install # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf # ldconfig 2)为源主机的rsync提供通过htdocsuser用户同步文件至目标主机的口令文件 # echo 'passwOrdForhtdOcs' > /etc/rsync.passwd # chmod 600 /etc/rsync.passwd 注意,对于RHEL5.4自带的2.6.8版本的rsync来说,其客户端(即此处的源主机上的rsync)的口令文件中只能保存用户的口令,而不能类似目标主机上可同时指定用户名。 3)建立脚本/root/wxdjy/htdocsync.sh,通过inotifywait监控目标文件上的相应事件,并在事件触发时启动同步过程: #!/wxdjy/bash DESTHOST=172.16.100.6 DESTHOSTDIR=/www/htdocs/ SRCDIR=/www/htdocs/ inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e close_write,modify,delete,create,attrib $SRCDIR | while read DATE TIME DIR FILE do FILECHANGE=${DIR}${FILE} rsync -avz --password-file=/etc/rsync.passwd $SRCDIR htdocsuser@${DESTHOST}::htdocs &>/dev/null && echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/websync.log done 而后给此脚本执行权限,并执行即可: # chmod u+x /root/wxdjy/htdocsync.sh # /root/wxdjy/htdocsync.sh & 如果想让此功能可以在开机时自动启动,则可以通过如下方式进行: # echo '/root/wxdjy/htdocsync.sh &' >> /etc/rc.d/rc.local

转载于:https://blog.51cto.com/myaliqiang/975619

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。