rsync+inotify实时同步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rsync+inotify实时同步相关的知识,希望对你有一定的参考价值。

一、Rsync简介:

rsync是一个远程数据同步工具,可通过lan/wan快速同步多台主机间的文件。它使用所谓的“rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。

运行rsync server的机器也叫backup server,一个rsync server可同时备份多个client的数据;也可以多个rsync server备份一个client的数据。rsync可以搭配ssh甚至使用daemon模式。rsync server会打开一个873的服务通道(port),等待对方rsync连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。

二、Inotify介绍

inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。

三、实验配置:

1、服务端安装并配置rsync

[[email protected] ~]# yum -y install rsync     #安装rsync,默认情况下已经安装

[[email protected] ~]# vim /etc/rsyncd.conf     #编辑rsync配置文件

pid file = /var/run/rsyncd.pid       #pid文件的存放位置

lock file = /var/run/rsync.lock      #支持max connections参数的锁文件

port = 873                           #监听端口

address = 192.168.192.130            #rsyncd服务监听端口

uid = root                           #设置rsync运行用户权限为root

gid = root                           #设置rsync运行组权限为root

use chroot = yes                     #默认为true,修改为false,增加对目录文件软连接的备份

read only = no                       #是否设置rsync服务端文件为只读权限

hosts allow = 192.168.0.0/16         #允许进行数据同步的客户端IP地址,可以设置多个,用英文状态下逗号隔开

hosts deny = *                       #禁止数据同步的客户端IP地址,可以设置多个

max connections = 5                  #最大连接数

#motd file = /etc/rsyncd.motd        #启动时欢迎信息页面文件位置(文件内容自定义)

log file = /var/log/rsyncd.log       #日志文件位置,启动rsync后自动产生这个文件,无需提前创建

log format = %t %a %m %f %b          #日志格式

syslog facility = local3             #日志级别{系统日志}

timeout = 300                        #设置超时时间

[postgres]                           #定义模板,自定义名称

path = /data/rsync                   #rsync服务端数据目录路径,自定义

list = yes                           #显示rsync服务端资源列表

ignore errors                        #忽略错误

#auth users = backuser               #执行数据同步的用户名,可以设置多个,用英文状态下逗号隔开(如果是匿名备份,可注释)

#secrets file = /etc/rsyncd.secrets  #用户认证配置文件,里面保存用户名称和密码

comment = this is pgsql  xlog arive  #模块名称信息

#exclude = arch                       #同步时所保留archive_status目录或文件

dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2    #指定类型的文件不在压缩传输

[[email protected] ~]# mkdir /rsydata  #创建备份目录

[[email protected] ~]# vim /etc/rsync.password  #编辑用户认证配置文件

backuser:redhat                   #格式:  用户名:密码

[[email protected] ~]# chmod 600 /etc/rsync.password  #一定要把用户认证配置文件的权限改成600

[[email protected] ~]# vi /etc/rsyncd.motd

------------welcome use rsyncd backup data----------


[[email protected] ~]# /usr/bin/rsync --daemon &  #后台运行rsync服务

[[email protected] ~]# systemctl enable rsyncd.service  #设置rsync服务开机自启

[[email protected] ~]# firewall-cmd --permanent --add-port=873/tcp  #配置防火墙

[[email protected] ~]# firewall-cmd --reload

2、客户端配置

[[email protected] ~]# yum -y install rsync            #安装rsync软件包。提供rsync客户端相关命令

[[email protected] test]# touch {1..9}                #在测试目录创建测试文件/data/test

[[email protected] test]# ls

1  2  3  4  5  6  7  8  9

[[email protected] test]# rsync -azv /data/test/ 192.168.192.130::postgres     #使用rsync客户端命令执行手动同步

------------welcome use rsyncd backup data----------       #服务端设置的欢迎语

sending incremental file list

./

1

2

3

4

5

6

7

8

9

sent 407 bytes  received 182 bytes  1178.00 bytes/sec

total size is 0  speedup is 0.00


命令选项注释:

-a #归档模式备份,相当于-rlptgoD的组合

-v #在终端显示同步过程的详细信息

-z #压缩传输

/data/test #本地文件位置

192.168.192.130::postgres   #rsync命令格式。服务器::模块名称

更多注释:

-r #递归模式,包含目录及子目录的所有文件

-l #对于符号链接文件仍复制为符号链接文件

-p #保留文件的权限标记

-t #保留文件的时间标记

-H #保留硬链接文件

-A #保留ACL属性信息

-D #保留设备文件及其他特殊文件

--delete #使备份服务器文件与本地文件保持一直

--checksum #根据校验和(而不是文件大小、修改时间)来决定是否跳过该文件

3、客户端配置inotify实时同步

[[email protected] ~]# yum -y install inotify-tools    #安装inotify-tools,提供inotify相关命令 inotifywait、inotifywatch

编写inotify脚本:

[[email protected] ~]# vi inotify.sh

#!/bin/bash

/usr/bin/inotifywait  -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e create /var/lib/pgsql/bac kups/  | while read file

do

    DATE=`date +%Y%m%d%H%M%S`

    event=$(echo $file | awk ‘{print $3}‘)

    echo "------------$DATE-------------"

    if [[ $event =~ ‘CREATE‘ ]] ; then

      /usr/bin/rsync -avzP --progress /var/lib/pgsql/backups/  192.168.192.134::postgres &>> /var/log/r sync/rsync-$DATE.log

    fi

done

[[email protected] ~]# chmod +x inotify.sh     #添加脚本的执行权限

[[email protected] ~]# sh inotify.sh &       #让脚本在后台终端运行

[1] 2631

[[email protected] ~]# echo "/root/inotify.sh" >> /etc/rc.local    #将脚本添加到开机执行的文件中

4、创建文件进行测试

[[email protected] test]# touch test{1..5}    #创建测试文件

------------welcome use rsyncd backup data----------    #脚本自动在此终端输出内容

sending incremental file list

./

test1

test2

test3

test4

test5

sent 228 bytes  received 8 bytes  472.00 bytes/sec

total size is 1088  speedup is 4.61

5、防止inotify异常运行,编写检测脚本

[[email protected] ~]# vi inotify_status.sh

#!/bin/bash

ps -ef | grep -w inotify.sh | grep -v $$

if [ $? -eq 0 ]

   then

        echo "inotify service is running"

   else

        /root/inotify.sh &

        echo "inotify service is activing"

fi

[[email protected] ~]# crontab -e           #编写计划任务,每分钟检测一遍服务的运行情况

*/1 * * * * /root/inotify_status.sh   

四、附加选项

参数说明

语法: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   指定监视的事件。

-c, –csv   输出csv格式。

–timefmt   指定时间格式,如(“%”后面的大小写代表不同的格式,如%y表示2位的年)

    %Y-%M-%D 日期:2012-10-13

    %H:%M:%S 时间:15:45:05

 是否显示该参数指定的时间,取决于–format选项中是否指定了“%T”。

–format   指定输出格式。

    %w 表示发生事件的目录

    %f 表示发生事件的文件

    %e 表示发生的事件

    %Xe 事件以“X”分

    %T 显示由–timefmt定义的时间格式

参数说明

语法:inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ ... ]

参数:

-h, –help   输出帮助信息

-v, –verbose   输出详细信息

@   排除不需要监视的文件,可以是相对路径,也可以是绝对路径。

–fromfile   从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。

-z, –zero   输出表格的行和列,即使元素为空

–exclude   正则匹配需要排除的文件,大小写敏感。

例:要排除/home/mjb目录下的test1,test2,cc目录,可这样写--exclude="/home/mjb/(test1/|test2/|cc/)"。

多个目录或文件一定要用“|”分开,不能在命令行中用两个--exclude,否则最后的--exclude会覆盖其它的。

系统只是在文件路径中查找是否有上面参数指定的字符,如果有就排除。因此在test1后面加了“/”。否则/home/mjb/test123也会被排除。

–excludei   正则匹配需要排除的文件,忽略大小写。

-r, –recursive   监视一个目录下的所有子目录。

-t , –timeout   设置超时时间

-e , –event   只监听指定的事件。

-a , –ascending   以指定事件升序排列。

-d , –descending   以指定事件降序排列。


可监听事件

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  文件系统取消挂载,之后不再监听此文件系统。


本文出自 “12889292” 博客,请务必保留此出处http://12899292.blog.51cto.com/12889292/1926647

以上是关于rsync+inotify实时同步的主要内容,如果未能解决你的问题,请参考以下文章

实现数据实时同步

三sersync+rsync实现服务器文件实时同步

rsync+inotify 实现自动同步

rsync下行同步rsync+inotify实时同步(同步如饮水一样简单)

Rsync下行同步+inotify实时同步介绍和部署

rsync下行同步+inotify实时同步部署