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

相关推荐

  • Linux网站架构系列之Mysql—-部署篇

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1321079   MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL所使用的SQL语言是用于…

    Linux干货 2015-04-01
  • Linux文件系统初识

    Linux文件系统初识        文件系统是一种用于向用户提供数据访问的机制,我们的硬盘,U盘等存储设备会被文件系统分割为特定大小的块,系统中的文件就被存储在数据块中,而我们平常接触到的分区,目录,文件等正是文件系统通过组织整合之后才呈现在我们面前的,我们无需去关心我们的数据到底存储在硬盘的那个…

    2017-07-15
  • Linux的用户组和权限(一)

    导读:本章主要内容如下       1.解释Linux的安全模型      2.解释用户账号和组群账号的目的      3.用户和组管理命令      4.理解并设置文件权限 &n…

    Linux干货 2016-08-04
  • Linux下装载软Raid

    步骤1.创建磁盘,并转换为fd #fdisk /dev/sdb //这里使用新的磁盘sdb 然后输入n ,创建分区 使用默认的起始点 输入大小为+100M 然后重复刚才的操作4次,创建4个分区,创建完4个分区后 我们还要改变分区的ID 在分区的主菜单输入T 然后输入要改变ID的分区号,也就是最后4个分区 然后输入分区的ID:fd 四个分区都改成FD 完成后,…

    Linux干货 2017-08-12
  • 马哥教育网络班20期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who |cut -d " " -f1 |sort -u 2、取出最后登录到当前系统的用户的相关信息。 [root@localhost ~]# who|tai…

    Linux干货 2016-06-29
  • Linux Basics–part6

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; tmp]# cp /etc/rc.d/init.d/rc.sysinit /tmp/rc.sysinit tmp]# vim rc.sysinit : 进入末行模式 %s@^[[:space:]]\+@#@g 2…

    Linux干货 2017-08-24