1、同步目的服务器作为服务端搭建rsync
centos7: 一般已经自带rsync服务,可以直接使用
修改配置文件:
cat /etc/rsyncd.conf
### rsyncd.conf 文件的配置
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# 传输文件使用的用户和用户组,如果是从服务器=>客户端,要保证用户对文件有读取的权限;如果是从客户端=>服务端,要保证用户对文件有写权限。
uid = root
gid = root
# 允许chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下,chroot为yes时必须使用root权限,且不能备份path路径外的链接文件
use chroot = yes
# read only =no #只读为假(可写)
read only = no
# 只写
write only = no
# 设定白名单,可以指定IP段(172.xx.xx.1/255.255.255.0),各个Ip段用空格分开
hosts allow = *
# 设置黑名单
#hosts deny = *
# 允许的客户端最大连接数,根据最多一次性同步的agent数量设置
max connections = 10
# rsync监听端口
port = 888
# IP地址,启动rsync报错failed: Cannot assign requested address (address-family 2) unable to bind any inbound sockets on port 873,把rsyncd.conf中的address改为127.0.0.1
#address = 127.0.0.1
# 欢迎(同步过程中展示的提示)文件的路径,非必须
#motd file = /etc/rsync/rsyncd.motd
# 进程对应的进程号pid文件路径
pid file = /var/run/rsyncd.pid
# 锁文件路径
#lock file = /data/rsync/rsyncd.lock
# 记录传输文件日志
transfer logging = yes
# 日志文件格式
log format = %t %a %m %f %b
# 指定日志文件
log file = /var/log/rsync.log
# 剔除某些文件或目录,不同步
#exclude = lost+found/
# 设置超时时间
timeout = 900
ignore nonreadable = yes
# 设置不需要压缩的文件
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# 忽略错误
ignore errors
# 添加注释
comment = just test
# 模块验证的用户名称,可使用空格或者逗号隔开多个用户名
auth users = rsync1
# 模块验证密码文件 可放在全局配置里
secrets file = /etc/rsyncd.passwd
# 模块名称,同步时可以根据配置的模块名称找到要同步模块的目录,可以配置多个,使用如: sate@192.xx.xx.xxx::source
[cv]
# cv模块的根目录,同步目录,要注意权限
path = /home/cv
# 是否允许列出模块内容
list = yes
rsync设置的认证用户是rsync1,因此需要创建密码认证文件 /etc/rsyncd.passwd 并写入用户名密码:
cat /etc/rsyncd.passwd
rsync1:123456
修改密码文件权限为600
chmod 600 /etc/rsyncd.passwd
启动:
systemctl start rsyncd
2、客户端,也就是需要同步的服务器上,安装inotify-tools工具。监控文件的更改事件。使用脚本同步仅发生改变的文件,而非每次都全量扫描和同步。
yum -y install inotify-tools
创建rsync认证服务端的密码文件,只需密码即可不需要账号:
echo "123456" > /etc/rsyncd.passwd
修改密码文件权限为600
chmod 600 /etc/rsyncd.passwd
3、执行同步脚本,在需要同步的源服务器上运行,文件会同步到目标服务器上。
远程shell模式脚本如下,远程shell模式下,不需要配置启动rsyncd服务:
#!/bin/bash
src=/home/rsync/ # 需要同步的源路径
des=/home/rsync # 目标服务器上的路径。
#rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件
ip1="192.168.1.2" # 目标服务器1
user=root # ssh验证用户名
cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
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 $(dirname ${INO_FILE}) -e "ssh -p 626" $user@$ip1:$des # INO_FILE变量代表路径哦 -c校验文件内容
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzR --delete $(dirname ${INO_FILE}) -e "ssh -p 626" $user@$ip1:$des
#看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 $(dirname ${INO_FILE}) -e "ssh -p 626" $user@$ip:$des
fi
fi
done
rsync-daemon模式脚本如下,此模式下需配置启动rsyncd服务:
#!/bin/bash
src=/home/rsync/ # 需要同步的源路径
des=cv # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件
ip1="192.168.1.2" # 目标服务器1
user=rsync1 # rsync --daemon定义的验证用户名
cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
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 -avzcRP --port 888 $(dirname ${INO_FILE}) $user@$ip1::$des --password-file=/etc/rsyncd.passwd # INO_FILE变量代表路径哦 -c校验文件内容
#仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性
fi
#删除、移动出事件
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
then
echo 'DELETE or MOVED_FROM'
rsync -avzRP --delete --port 888 $(dirname ${INO_FILE}) $user@$ip1::$des --password-file=/etc/rsyncd.passwd
#看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 -avzcRP --port 888 $(dirname ${INO_FILE}) $user@$ip1::$des --password-file=/etc/rsyncd.passwd
fi
fi
done