inotify+rsync同步方案(ubuntu,适用其他发行版)

系统:Ubuntu 16.04.1  工具:rsync 3.1.1 、inotify -tools 3.14      作者:jevtse    本文除了软件安装部分,其他内容同样适用其他linux系统;
同步目标主机:172.16.250.141;rsync服务端,只需搭建rsync服务;
同步源主机:172.16.250.142;rsync客户端,只需安装inotify -tools工具包;

1、rsync传输方式        0%
2、rsync命令             10%
3、rsync服务端配置    40%
4、rsync服务端配置    50%
5、inotify-tools          50%
6、inotifywait+rsync实现数据实时同步    60%
7、inotify+rsync双机同步脚本    80%


    rsync是一个远程文件同步(备份)工具,使用Rsync算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快,常用小规模网络或局域网文件同步传输;
    由于rsync每次同步需要将整个目录扫描一次,当文件数量较大时,整个过程非常耗时耗性能,同时rsync不能实时监控文件的变化;而inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
    所以我们可以通过inotify -tools工具包实现对 Linux 文件实时监控,当文件发生变化时,实时将变化的文件通过rsync同步到远端备份服务器;
  本文以把客户端/data/rsyncy下的文件同步备份到服务端的/data/backup目录下为例;
    Ubuntu默认自带rsync工具,不需要安装;

1、rsync传输方式


  基于SSH协议传输:类似于scp命令,可实现PUSH本地文件至远程,或PULL远程文件到本地,只需主机安装rsync程序即可,无需开启rsync服务;
  基于rsync协议传输:基于C/S模型的rsyncd服务端与rsync客户端命令完成单向数据传输,远程端需开启rsync服务,本文同步方案就是使用该协议传输数据;

2、rsync命令


Usage: rsync [OPTION]... SRC [SRC]... DEST                            #本地文件拷贝
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST                #拷贝本地数据到远端主机(ssh、rsh等工具)
or   rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST                #拷贝本地数据到远程rsync服务器
or   rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST    #拷贝本地数据到远程rsync服务器,URL模式
or   rsync [OPTION]... [USER@]HOST:SRC [DEST]                    #拷贝远端主机数据到本地(ssh、rsh等工具)
or   rsync [OPTION]... [USER@]HOST::SRC [DEST]                    #拷贝远程rsync服务器数据到本地
or   rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]        #拷贝远程rsync服务器数据到本地,URL模式
#HOST后面为单冒号( : )时表示使用shell远程工具连接(如ssh、rsh等);HOST后面为双冒号时( :: )或rsync://时表示使用rsync协议传输,此时服务器端的[SRC]或[DEST]为rsyncd.conf中定义的模块名称;
-v,    --verbose:详细输出模式
-q,    --quiet 精简输出模式
-c,    --checksum:对传输完成的文件进行校验
-b,    --backup:不覆盖原有文件,为其重命名~file
-u,     --update:仅更新旧文件,判断mtime,不同步相同的文件
-z,     --compress:压缩传输
-r,     --recursive:递归子目录
-a,     --archive:归档且递归,保留所有属性,相当于 -rltogpD (不包括 -HAX)
-l,    --links:保留软链接
-H,     --hard -links:保留硬链结
-A,    --acls:保留ACL权限
-X,    --xattrs:保留扩展属性
-t,     --times:保留时间戳
-o,     --owner:保留属主信息
-g,     --group:保留属组信息
-p,     --perms:保留文件权限
-D,     --devices:保留设备文件属性
--delete:删除目标主机多余的文件
--delete -after:传输完成后再删除多余的文件
--force:强制删除目录,即使不为空
--password -file=login.passwd:从文件读取密码
--progress:显示备份过程,进度条
--ignore -errors:忽略IO错误进行删除
--partial:保留未完全传输的文件,恢复后断点续传
--compare -dest=DIR 比较DIR中的文件来决定是否需要同步
--exclude=PATTERN:指定排除的文件或目录,可模式匹配
--include=PATTERN:指定不排除的文件或目录
--bwlimit=Kbps:限制传输带宽,KBytes per second

3、rsync配置


可以从/usr/share/doc/rsync/examples/拷贝rsync自带的模板文件rsyncd.conf到/etc目录下修改,或直接在创建/etc/rsyncd.conf

root@jev -u1:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/

服务端常用配置如下:

root@jev -u1:~# cat /etc/rsyncd.conf
# GLOBAL OPTIONS                   #全局配置段
use chroot = no                    #是否chroot
strict modes = yes                 #严格模式
lock file = /var/lock/rsyncd       #程序锁文件存放位置
pid file = /var/run/rsyncd.pid     #pid文件位置
log file = /va/log/rsyncd.log      #日志文件位置

# MODULE OPTIONS                   #局部配置段
[backup]                           #模块名称
path = /data/backup                #同步文件存放目录
max connections=10                 #最多并发数
read only = no                     #开启读取
list = false                       #是否允许查看列表
#      exclude = lost+found/       #不同步的文件
#      exclude from =              #指定一个包含exclude模式定义的文件名
#      include =                   #类似exclude
#      include from =              #指定一个包含include模式定义的文件名
uid = root                         #以谁的身份运行rsync
gid = root                         #运行rsync的组
auth users = jevtse                #虚拟用户名(非linux用户),同步登录用
secrets file = /etc/rsyncd.secrets #虚拟用户的密码存放文件
hosts allow = 172.16.250.142       #白名单
hosts deny = *                     #黑名单
ignore errors = yes                #忽略I/O错误
ignore nonreadable = yes           #忽略没有访问文件权限的用户
transfer logging = no              #使用ftp格式独立记录日志
#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.        #日志格式
timeout = 600                           #超时时间
refuse options = checksum dry -run      #客户端不能使用的命令
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz        #不进行压缩传输的文件

创建虚拟用户的密码文件,格式为”auth_name:passwd”

root@jev -u1:~# echo jevtse:jevtsepass >> /etc/rsyncd.secrets

给予密码文件最小权限

root@jev -u1:~# chmod 600 /etc/rsyncd.secrets 

创建数据备份目录,需于配置文件一致,如果存在无需创建

root@jev -u1:~# mkdir  /data/backup  -pv

确保selinux与iptables不会成为阻碍;

4、rsync客户端配置


创建虚拟用户认证密码文件,密码需与服务端对应;

root@jev -u2:~# echo jevtsepass > /etc/rsyncd.login.secrets

给予密码文件最小权限

root@jev -u2:~# chmod 660 /etc/rsyncd.login.secrets

创建数据源目录

root@jev -u2:~# mkdir /data/rsync  -pv

5、inotify-tools


在客户端安装inotify-tools工具包

root@jev-u2:~# apt install inotify-tools -y
root@jev-u2:~# dpkg -L inotify-tools
。 。 。
/usr/bin/inotifywait
/usr/bin/inotifywatch

可以看到工具包包含inotifywait与inotifywatch俩个工具,inotifywait命令用于监视文件系统的细微变化;inotifywatch用于收集关于被监视的文件系统的统计数据。

inotifywait命令

Usage: inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]
-m,    --monitor:持续保持监听,
-d,    --daemon:以守护进程方式在后台监听
-r,    --recursive:递归监听所有目录
-o,    --outfile <file> :将events信息保存向到指定文件
-s,    --syslog:将错误信息写进系统日志文件
-q,    --quiet:静默模式,只输出events
-qq        :静默模式,不输出任何信息
-e,    --event <event1> [ -e|--event <event2> ... ]:指定监控的events(access,modify,attrib,close,move,delete,……)
--timefmt <fmt>:指定时间格式,相等于将时间格式赋值给%T
--format:指定输出文件events变化的信息格式, %T时间,%w触发事件文件所在绝对路径,%f触发事件文件名称,%e触发的事件名称…

6、inotifywait+rsync实现数据实时同步


通过inotifywait实时监控172.16.250.142:/date/rsync目录下文件的修改、删除、创建、移动、属性变化情况,如有变动,将发生变化的文件通过管道传送给rsync,触发rsync实时同步到172.16.250.141上srync服务器的[backup]模块对应的备份目录下:

root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e'   -e modify,delete,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete  --password-file=/etc/rsyncd.login.secrets  /data/rsync/ jevtse@172.16.250.141::backup ; done

注意[SRC]即(/data/rsync/)后面必须带分隔符(/),否则会在目标服务器重新创建目录;

再开启一个终端,在/date/rsync下面创建多级目录测试是否能正常触发数据同步:

root@jev-u2:~# mkdir /data/rsync/test0/test1/test2 -pv
mkdir: created directory '/data/rsync/test0'
mkdir: created directory '/data/rsync/test0/test1'
mkdir: created directory '/data/rsync/test0/test1/test2'

查看刚刚运行同步命令的终端的输出:

root@jev-u2:~# inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete
,create,move,attrib /data/rsync/ | while read line ; do rsync -avz --delete --password-file=/etc/rsyncd.login.secrets /data/rsync/ jevtse@172.16.250.141::backup ; done sending incremental file list
./
test0/
test0/test1/
test0/test1/test2/

sent 128 bytes  received 39 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list 

sent 112 bytes  received 23 bytes  270.00 bytes/sec
total size is 0  speedup is 0.00
sending incremental file list

sent 112 bytes  received 23 bytes  270.00 bytes/sec
total size is 0  speedup is 0.00

可以看到,已经正常触发rsync传输部分文件到rsync服务端;

在rsync服务端172.16.250.141查看对应目录是否创建成功

root@jev-u1:~# tree /data/backup/
/data/backup/
└── test0
└── test1
└── test2
3 directories, 0 files

初步测试成功

7、inotify+rsync双机同步脚本


inotify+rsync同步方案(ubuntu,适用其他发行版)

root@jev-u2:~# cat  inotify-rsync.sh
#!/bin/bash
#Version 2.0
#Auther: jevtse
    SRC=/data/rsync/                                          #备份源目录#
    DEST=jevtse@172.16.250.141::backup            #目标目录#
    PASS_FILE=/etc/rsyncd.login.secrets                #密码文件位置#
    LOG=/var/log/inotify-rsync.log                        #成功日志#
    ERR_LOG=/var/log/inotify-rsync-error.log          #错误日志#
    TEMP=`mktemp /tmp/rsync.XXX`
    inotifywait -rmq --timefmt '%y-%m-%d %H:%M' --format '%T %w %f %e' -e modify,delete,create,move,attrib $SRC |    
      while read line ; do
        > $TEMP
        rsync -avz --delete --password-file=$PASS_FILE $SRC $DEST   2>> $TEMP
            [ -s $TEMP ] &&
                ( echo $line  >>  $ERR_LOG ; cat $TEMP >> $ERR_LOG ) ||
                    echo $line >> $LOG ;
        done
        unset SRC DEST PASS_FILE LOG ERR_LOG TEMP

脚本使用:

root@jev-u2:~# chomd u+x inotify-rsync.sh
root@jev-u2:~# ./inotify-rsync.sh  &

客户端事件同步成功日志示例:

root@jev-u2:~# cat /var/log/inotify-rsync.log
17-03-05 14:46 /data/rsync/test0/test1/test2/ txt1 MODIFY

客户端事件同步失败日志示例:

root@jev-u2:~# cat /var/log/inotify-rsync-error.log
17-03-05 14:54 /data/rsync/test0/test1/test2/ txt1 MODIFY
rsync: failed to connect to 172.16.250.141 (172.16.250.141): Connection refused
rsync error: error in socket IO (code 10) at clientserver.c(128) [sender=3.1.1]

【本文完】

原创文章,作者:Jev Tse,如若转载,请注明出处:http://www.178linux.com/70527

(6)
Jev TseJev Tse
上一篇 2017-03-05
下一篇 2017-03-05

相关推荐

  • 软件包管理–RPM YUM

    包管理器 二进制应用程序的组成部分 二进制文件,配置文件,说明文档,库文件 程序包管理器 Debian  deb文件  dpkg包管理器 Redhat  rpm文件  rpm包管理器                   &nbsp…

    Linux干货 2016-08-21
  • 20160804正则表达式作业

    正则表达式表示18位身份证号 正则表达式表示手机号 正则表达式表示邮箱 Ø  截取出ifconfig命令结果中所有的本机的ipv4地址   Ø  查看分区中使用率最大的百分比 Ø  查看UID最大的用户名、UID以及shell类型 Ø  查看/tmp权限,并且以数字方式显示 思路:先找到如何才能查看到/tmp…

    Linux干货 2016-08-08
  • Mariadb数据库备份恢复系列(三):xtrabackup物理备份工具之增量备份

       实验三:利用xtrabackup+二进制日志实现增量备份和恢复数据库 本例中实现的是将所有的增量日志都通过apply-log的步骤同步到完全备份文件中,如果希望利用增量日志还原到固定某次增量备份的数据,则不能使用本例中方式对所有的备份都进行apply-log操作,如果希望利用增量日志还原到固定哪次增量备份的数据,则将最初的完全备份的数据、和期望还原到某…

    Linux干货 2016-11-24
  • CentOS系统启动流程

    Linux系统(Centos 5、6)启动流程 一、POST加电自检 Power-On-Self-Test 按下电源键以后,系统调用存储在ROM中的BIOS和存储在RAM中的CMOS(用来保存各项参数的设定)完成系统硬件状态的检查,如果硬件有问题则提示用户问题严重无法开机的会发出警报声音;硬件自检完成后进入下一步。 二、Boot Sequence与…

    Linux干货 2016-11-24
  • 马哥教育网络班22期第五周课程练习1

    1、cat /etc/passwd  | egrep "^root|^fedora|^user1"| cut -d":" -f1,7  2、egrep -o  "[^[:space:]]+\(\)" /etc/rc.d/init.d/functions   3…

    Linux干货 2016-09-15
  • 开始学习Linux的一些建议

    建议读者范围 有开发经验者。 科研人员(由其Numrical)。 动手能力强的。 只是好奇,对于Linux只是浅尝辄止的就不建议继续往下看了。 端正学习态度 Linux不等于骇客(or Cracker)。 当然众所周知很多“黑客工具”都是Linux平台上的,我帮助过很多Linux小白发现他们殊途同归都是朝着类似Aircrack-ng去的。 但他们不知道的是:…

    Linux干货 2015-02-26