服务器环境: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