rsync+inotify实时同步目录数据

时间:2020-11-24 11:29:00

rsync+inotify实时同步目录数据

为什么使用rsync+inotify

  配合rsync实现文件自动同步,利用inofity监听某个目录,当此目录发生变化时,触发rsync实现文件同步

  单独rsycn同步数据时,rsync先需要扫描所有文件进行对比,进行差量传输。在数据达到百万级别时,扫描文件时非常耗时的,往往就出现了瓶颈。

  rsync不能实时同步数据,而且触发同步数据时也会有时间差,造成数据不一致等情况。

rsync同步命令中常用的几个参数说明:
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-v, --verbose 详细模式输出
-p, --perms 保持文件权限
-g, --group 保持文件属组信息
-o, --owner 保持文件属主信息
-r, --recursive 对子目录以递归模式处理。同步目录的时候要加上这个参数
-l, --links 保留软链结,加上这个参数,同步过来的文件会保持之前的软链接属性不变
-H, --hard-links 保留硬链结
-e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步
-z, --compress 对备份的文件在传输时进行压缩处理
--stats 给出某些文件的传输状态
--progress 打印同步的过程
--timeout=TIME 同步过程中,IP超时时间,单位为秒
--delete 删除那些目标目录中有而源目录中没有的多余文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!!!
--delete-before 接受者在输出之前进行删除操作。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!!
--delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件
--delete-excluded 删除目标目录中那些被该选项指定排除的文件
--ignore-errors 即使出现IO错误也进行删除,忽略错误
--exclude 指定同步时需要过滤掉的文件或子目录(即不需要同步过去的),后面直接跟不需要同步的单个文件名或子目录(不需要跟路径) ,过滤多个文件或子目录,就使用多个--exclude
--exclude-from 指定同步时需要过滤掉的文件或子目录,后面跟文件(比如/root/exclue.txt),然后将不需要同步的文件和子目录放到/root/exclue.txt下。
--version 打印版本信息
--port=PORT 指定其他的rsync服务端口
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second

 

案例说明:

  机器

  client  192.168.2.200

  client  192.168.2.202

  server  192.168.2.201

  需要将192.168.2.200 /data目录 和 192.168.2.202 /test目录实时同步到192.168.2.201 /home/backup对应的 data和test目录

 

一、server部署过程

  1、部署前操作

[root@cc ~]# vim /etc/sysconfig/selinux	#关闭selinux
SELINUX=disabled
[root@cc ~]# setenforce 0
setenforce: SELinux is disabled

#允许22号端口和873端口进来
[root@cc ~]# iptables -I INPUT -s 192.168.2.200 -p tcp --dport 22 -j ACCEPT
[root@cc ~]# iptables -I INPUT -s 192.168.2.200 -p tcp --dport 873 -j ACCEPT
[root@cc ~]# iptables -I INPUT -s 192.168.2.202 -p tcp --dport 22 -j ACCEPT
[root@cc ~]# iptables -I INPUT -s 192.168.2.202 -p tcp --dport 873 -j ACCEPT

   2、安装部署rsync服务

[root@cc ~]# yum -y install rsync xinetd
[root@cc ~]# systemctl enable rsyncd	#开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.

[root@cc ~]# systemctl restart rsyncd
[root@cc ~]# vim /etc/rsyncd.conf
log file = /var/log/rsyncd.log  #日志存放路径,无需手动创建
pidfile = /var/run/rsyncd.pid   #pid文件存放路径
lock file = /var/run/rsyncd.lock        #支持max connections参数的锁文件
secrets file = /etc/rsync.pass  #用户认证配置文件,里面保存用户名称和密码,后面需要创建
motd file = /etc/rsyncd.Motd    #rsync启动时欢迎信息页面配置文件(内容自己定义)

[data]  #名称自定义
path = /home/backup/data        #rsync服务端数据目录路径,即同步到目标目录后存放路径
comment = data  #模块名称和[data]自定义名称一样
uid = nginx     #设置rsync运行的uid权限,要保证同步到目标目录后的权限和源目录一致,即都是nginx
gid = nginx     #gid权限
port = 873      #默认rsnyc端口
use chroot = no #默认为ture,改为no或者false,增加对目录文件软连接的备份
read only = no  #设置rsync服务器文件为读写权限
list = no       #不显示rsnyc服务器资源列表
max connections = 200   #最大链接数
timeout = 600   #设置超时时间
auth users = RSYNC_USER #执行数据同步的用户名,后面手动设置。可以设置多个,用,隔开
hosts allow = 192.168.2.200     #允许进行数据同步的客户端ip地址,可以设置多个,用,隔开
#hosts deny = 192.168.2.200     #禁止数据同步的客户端ip地址,可以设置多个,用,隔开,如果没有,则不用设置此行

[test]
path = /home/backup/test	###centos6可以不写后面的test,如果写了到时候同步的路径为/home/backup/test/test
comment = test
uid = root
gid = root
port = 873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 192.168.2.202

   3、设置密码文件以及修改权限

[root@cc ~]# cat /etc/rsync.pass 	#用户认证文件
RSYNC_USER:123456@rsync

[root@cc ~]# chmod 600 /etc/rsyncd.conf	#设置文件权限
[root@cc ~]# chmod 600 /etc/rsync.pass

   4、创建同步过来目录

[root@cc ~]# systemctl restart rsyncd	#重启服务
[root@cc ~]# netstat -tunlp | grep 873
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      6429/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      6429/rsync

[root@cc ~]# cd /home/backup/	#创建同步过来后的目标目录
[root@cc backup]# mkdir test
[root@cc backup]# mkdir data
[root@cc backup]# chown nginx:nginx data -R
[root@cc backup]# chown test:test test -R

 

二、server部署过程

  2台机器操作一样

  1、部署前准备工作

[root@1ogg2zbl ~]# vim /etc/sysconfig/selinux	#关闭selinux
SELINUX=disabled
[root@1ogg2zbl ~]# setenforce 0
setenforce: SELinux is disabled

[root@1ogg2zbl ~]# yum -y install rsync xinetd

 

   2、启动rsync以及配置认证密码

[root@1ogg2zbl ~]# vim /etc/xinetd.d/rsync
disable = no	#由默认的yes改为no,设置开机启动rsync

[root@1ogg2zbl ~]# /etc/init.d/xinetd restart
Stopping xinetd:                                           [FAILED]
Starting xinetd:                                           [  OK  ]
[root@1ogg2zbl ~]# netstat -tunlp | grep 873
tcp        0      0 :::873                      :::*                        LISTEN      1959/xinetd

[root@1ogg2zbl ~]# vim /etc/rsync.pass	#认证文件
123456@rsync
[root@1ogg2zbl ~]# chmod 600 /etc/rsync.pass	#设置权限

  3、查看机器是否支持inofity

[root@1ogg2zbl ~]# ll /proc/sys/fs/inotify/	#出现下列内容,说明服务器内核支持inofity 注:linux下inofity内核最小为2.6.13
total 0
-rw-r--r-- 1 root root 0 Nov 21 14:52 max_queued_events
-rw-r--r-- 1 root root 0 Nov 21 14:52 max_user_instances
-rw-r--r-- 1 root root 0 Nov 21 14:52 max_user_watches

   4、部署inofity

[root@1ogg2zbl src]# cd /usr/local/src/
[root@1ogg2zbl src]# yum -y install make g1ogg2zbl g1ogg2zbl-c++ wget
[root@1ogg2zbl src]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@1ogg2zbl src]# tar -xf inotify-tools-3.14.tar.gz 
[root@1ogg2zbl src]# cd inotify-tools-3.14
[root@1ogg2zbl inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[root@1ogg2zbl inotify-tools-3.14]# make && make install

[root@1ogg2zbl inotify-tools-3.14]# vim /etc/profile	#设置环境变量
export export PATH=$PATH:/usr/local/inotify/bin
[root@1ogg2zbl inotify-tools-3.14]# source  /etc/profile
[root@1ogg2zbl inotify-tools-3.14]# vim /etc/ld.so.conf
/usr/local/inotify/lib
[root@1ogg2zbl inotify-tools-3.14]# ldconfig

[root@1ogg2zbl inotify-tools-3.14]# sysctl -a | grep max_queued_events	#查看以及修改默认inofity参数大小
fs.inotify.max_queued_events = 16384
[root@1ogg2zbl inotify-tools-3.14]# sysctl -a | grep max_user_watches
fs.inotify.max_user_watches = 8192
fs.epoll.max_user_watches = 798556
[root@1ogg2zbl inotify-tools-3.14]# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128
[root@1ogg2zbl inotify-tools-3.14]# sysctl -w fs.inotify.max_queued_events="99999999"	#inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
fs.inotify.max_queued_events = 99999999
[root@1ogg2zbl inotify-tools-3.14]# sysctl -w fs.inotify.max_user_watches="99999999"	#要同步的文件包含多少目录,可以用:find /data -type d | wc -l 统计这些源目录下的目录数,必须保证max_user_watches值大于统计结果(这里/data为同步的源文件目录)
fs.inotify.max_user_watches = 99999999
[root@1ogg2zbl inotify-tools-3.14]# sysctl -w fs.inotify.max_user_instances="65535"	#每个用户创建inotify实例最大值
fs.inotify.max_user_instances = 65535

   5、开始同步

##第一次执行rsync全量同步(加上--delete参数,保持目标目录和源目录文件一致)
[root@cc /]# rsync -avH --port=873 --progress --delete /test RSYNC_USER@192.168.2.201::test --password-file=/etc/rsync.pass

sending incremental file list
test/
test/aa
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/2)

sent 105 bytes  received 31 bytes  272.00 bytes/sec
total size is 0  speedup is 0.00

##接下来使用rsync+inofity实时同步脚本操作
##实时同步脚本里添加的是--delete-before参数,而不是--delete参数(第一次全量同步时rsync用的参数),二者区别:
##	--delete参数:表示rsync同步前,暴力删除目标目录中的所有文件,然后再执行同步操作。
##	--delete-before参数:表示rsync同步前,会先对目标目录进行一次扫描检索,删除目标目录中对比源目录的多余文件,然后再执行同步操作。显然比--delete参数安全些。

[root@cc /]# useradd rsync
[root@cc /]# cd /home/rsync/
[root@cc rsync]# ll
total 0
[root@cc rsync]# cat rsync_test_inotify.sh 
#!/bin/bash

SRCDIR=/$1
USER=RSYNC_USER
IP=192.168.2.201
DESTDIR=$1

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
	/usr/bin/rsync -avH --port=873 --progress --delete-before /${SRCDIR} RSYNC_USER@192.168.2.201::${DESTDIR} --password-file=/etc/rsync.pass
	echo "${file} was rsyncd" >> /tmp/rsync.log 2>&1
done

[root@cc test]# nohup sh /home/rsync/rsync_test_inotify.sh test &	#后台执行

[root@cc test]# su - test	#测试
su: warning: cannot change directory to /home/test: Permission denied
-bash: /home/test/.bash_profile: Permission denied
-bash-4.1$ cd /test/
-bash-4.1$ mkdir ggg
-bash-4.1$ touch nnn

[root@cc backup]# ll /home/backup/test/test/
total 48
drwxrwxr-x 2 test test  4096 Nov 21 16:02 ggg
-rw-rw-r-- 1 test test     0 Nov 21 16:02 nnn