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)
上一篇 2017-03-05 12:05
下一篇 2017-03-05 17:04

相关推荐

  • 第三周博客作业

      开始学习已经三周了,感觉到年底有些时间不够,作业也交的越来越晚,需要加紧学习的进度了。   1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  最简单的实现题目要求的方法是使用cut命令只显示用户名并用sort命令排序去重: [root@localhost ~]# who |&nbs…

    Linux干货 2016-12-20
  • LINUX–命令的格式、类型、别名的概述及运用

    命令格式       COMMAND [OPTIONS…] [ARGUMENTS..]      [OPTIONS..] 选项:用于启用或关闭命令的某个或某些功能                &n…

    2017-05-21
  • Linux文件管理相关命令、bash特性及元数据

    一、 Linux上的文件管理类命令及其常用的使用方法。 1、cp命令:copy     源文件、目标文件         单源复制cp [OPTION]…[-T] SOURCE DEST   &nb…

    2017-07-09
  • 文件权限特殊管理之ACL

    ACL:access control list 权限访问列表 应用范围:所属主和所属组和其他用户之外的他叔用户 ACL是Linux系统权限额外支持的一项功能,需要文件系统的支持,例如:ReiserFS , EXT2 , EXT3 , EXT4 , JFS , XFS等都支持ACL功能 centos7 中:安装系统分区和装完系统之后自己手动添加的分区自动支持a…

    Linux干货 2016-08-05
  • Linux发展史

    Linux发展史 操作系统出现前:   1946年第一台计算机诞生–20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式。程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片…

    Linux干货 2016-10-14
  • Linux之查找命令find简介

    查找命令find简介    Linux使用过程中难免会遇到查找功能,类似于Windows中的搜索功能,如果想要找某个文件在什么地方,什么格式的文件等等。在Linux中我们可以使用find、locate、which、whereis等命令。接下来我们就简单说一下如何使用这几个命令查找文件。 一、which which命令的作用是,在PATH变…

    Linux干货 2015-05-18