Linux下Rsync+Inotify-tools实现数据实时同步

服务器环境:Linux CentOS 7
服务器A:192.168.0.101(客户端)
服务器B:192.168.0.100(服务端)

在服务器A和服务器B上通过yum命令安装软件包:

[root@192 ~]# yum -y install rsync inotify-tools

一、在服务器A(客户端)的配置rsync


配置conf文件:

[root@192 ~]# vim /etc/rsyncd.conf
transfer logging = yes
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
lock file = /var/run/rsync.lock
uid = root
gid = root
use chroot = no
#ignore errors
read only = no

[gamelogs]
comment = data_gamelogs_sync
#log path
path = /data/game/gamelogs/
auth users = game
#configure password file
secrets file = /etc/rsync.pass
#input allow hosts ip
hosts allow = 192.168.0.100
hosts deny = *
list = false

 

配置认证文件:

[root@192 ~]# vim /etc/rsync.pass
game:password

 

启动rsync服务:

[root@192 ~]# service rsyncd start
Redirecting to /bin/systemctl start  rsyncd.service
[root@192 ~]# ps -ef |grep rsync
root      40419      1  0 16:12 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
root      40786  40562  0 16:12 pts/0    00:00:00 grep --color=auto rsync
[root@192 ~]#

 


二、在服务器B上面的配置rsync


在服务端不需要启动rsync的守护进程,采用脚本增量备份以及cron定时全量备份的方式

配置认证文件:

[root@192 ~]# vim /etc/rsync.pass
#这里只需要填写认证的密码,不需要填写用户名
password

 

编辑文件同步脚本,该脚本的功能是实现文件实时同步,采用的备份方式是增量备份,当文件发生变化时,文件都会发生同步

[root@192 ~]# vim rsync_game.sh
#!/bin/bash
#This Rsync script based on inotify.
#Date:2017-07-19
#version:1.0
#
export PATH=/bin:/usr/bin:/usr/local/bin
SRC=/data/game/gamelogs/
DEST=gamelogs
Client=192.168.0.101
User=game
Passfile=/etc/rsync.pass
cd $SRC
inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file 
do
        INO_EVENT=$(echo $file | awk '{print $1}')      # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
        INO_FILE=$(echo $file | awk '{print $2}')       # 把inotify输出切割 把文件路径部分赋值给INO_FILE
        echo "-------------------------------$(date)------------------------------------"
        echo $file
        #增加、修改、写入完成、移动进事件
        #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
        if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]]         # 判断事件类型
        then
                echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
                rsync -avzcR --password-file=${Passfile} $(dirname ${INO_FILE}) ${User}@${Client}::${DEST}
                 #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
        fi
        #删除、移动出事件
        if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
        then
                echo 'DELETE or MOVED_FROM'
                rsync -avzR --delete --password-file=${Passfile} $(dirname ${INO_FILE}) ${User}@${Client}::${DEST}
                #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。
        fi
        #修改属性事件 指 touch chgrp chmod chown等操作
        if [[ $INO_EVENT =~ 'ATTRIB' ]]
        then
                echo 'ATTRIB'
                if [ ! -d "$INO_FILE" ]                 # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。
                then
                        rsync -avzcR --password-file=${Passfile} $(dirname ${INO_FILE}) ${User}@${Client}::${DEST}
                fi
        fi
done &

为了保证文件的完整性,我们启动一个完全备份的定时任务

[root@192 ~]# vim /etc/cron.d/cron_rsync 
* */2 * * * rsync -avz --password-file=/etc/rsync.pass /data/game/gamevedio/ gamevedio@192.168.0.101::gamevedio

此时我们就完成了配置,在服务器B(服务端)上执行文件同步脚本,然后随便建立一个文件,然后去服务器A(客户端)查看,文件已经同步过去了

[root@192 ~]# ./rsync_game.sh

 

发表回复

Your email address will not be published.

名字 *
电子邮件 *
站点