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

相关推荐

  • grep命令

    alias命令 直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。 例一:列出当前系统中所有已经定义的命令别名。 [root@localhost ~]# alias alias cp=’cp -i’ alias egrep=’egrep –color=auto’ alias fgrep=’fgrep –color=auto’ alias …

    Linux干货 2016-01-09
  • DNS原理详解

    1、DNS概述   domain name service  区域名称服务或者domain named system 区域名称系统,是互联网最基础的服务,分为正向域名解析(将域名解析为IP地址)和反向域名解析(将IP地址解析为域名)两部分。 2、bind   bind(Berkeley Internet Name Domain)…

    Linux干货 2016-08-26
  • N24_jerry 第十二周作业

    1、请描述一次完整的http请求处理过程; 简介 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准…

    Linux干货 2017-03-22
  • 逻辑卷管理器LVM使用简介

    逻辑卷管理器(LVM) 原理图如下: 先准备一个分区/dev/sdb1,注意也存在ID问题,选择8e。 1.先把磁盘变成物理卷 在做这步前可以先看下系统中存在的物理卷,没有就什么都不会显示。 把我们准备好的两个磁盘变成物理卷,注意我那使用旧的格式化的分区磁盘,可能会出现上面有文件系统或者卷标类型的问题,所以尽量使用新磁盘做实验。如果出现这种情况,可以使用dd…

    2017-05-02
  • 重定向和管道

    重定向和管道 今天一起来学习一下重定向的一些相关命令及用法: 我们都知道程序=指令+数据 ,那么我们的数据的输入(Input)和输出(Output)是如何实现的呢?!跟小编君一起来看一下吧: 本博文小编君分成了四部分:1.重定向的讲解 2.管道符的讲解 3.涉及到的一些其他命令 4.练习题 一:重定向 重定向的本质是改变文件的默认位置,即换个地方存储数据。 …

    2017-08-04
  • 在centos6.9上实现软RAID

    在centos6.9上实现软RAID 什么是RAID?     RAID,全称Redundant Arrays of Inexpensive(Independent)Disks。简单翻译叫磁盘阵列。    通俗一点讲就是多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提…

    Linux干货 2017-08-12