一般linux系统默认是安装发了rsync,如果没有的话就需要手动安装
官网:https://rsync.samba.org/
下载地址:https://rsync.samba.org/ftp/rsync/
https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz
# 解压 tar zxvf rsync-3.2.4.tar.gz cd rsync-3.1.3/ # 配置 ./configure # 编译及安装 make && make install2、安装inotify
inotify安装在文件更新服务器,比如
2.1、inofity-tools下载地址http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
https://github.com/inotify-tools/inotify-tools
inotify-tools 的详细介绍可以看:https://github.com/rvoicilas/inotify-tools/wiki
# 解压 cd /soft tar zxvf inotify-tools-3.14.tar.gz cd inotify-tools-3.14 # 配置 ./configure # 编译及安装 make && make install
在通过kill杀死rsync进程的时候,还需要处理掉/var/run/rsync.pid文件
2.2、调整inotify内核参数(在客户端操作)在linux内核中,默认的inotify机制提供给了三个调控参数:
cat /proc/sys/fs/inotify/max_queued_events (表示监控事件队列)(16384)
16384
cat /proc/sys/fs/inotify/max_user_instances (最多监控实例数)(128)
128
cat /proc/sys/fs/inotify/max_user_watches (每个实例最多监控文件数)(8192)
8192
当要监控的目录,文件数量较多或者变化频繁时,建议加大这三个参数的值
vim /etc/sysctl.conf
fs.inotify.max_queued_events = 99999999
fs.inotify.max_user_watches = 99999999
fs.inotify.max_user_instances = 65535
sysctl -p
3、本机文件夹同步rsync -av --progress /etc/fstab /tmp/back
会看到/etc/fstab文件传输到/tmp/back的列表和速率,再运行一次会看到 sending incremental file list
上面需要考虑以下问题:
删除/etc/fstab文件不会同步删除/tmp/back/fstab,除非加入–delete选项
文件访问时间等属性、读写等权限、文件内容等有任何变动,都会被认为修改,目标目录下如果文件比源目录还新,则不会同步
源路径的最后是否有斜杠有不同的含义:有斜杠,只是复制目录中的文件;没有斜杠的话,不但要复制目录中的文件,还要复制目录本身
rsync /abc/opt 复制目录 rsync /abc/ /opt 复制目录中的文件(不复制目录)3、远程服务器同步
在服务器间rsync传输文件,需要有一个是开着rsync的服务,而这一服务需要两个配置文件,说明当前运行的用户名和用户组,这个用户名和用户组在改变文件权限和相关内容的时候有用,否则有时候会出现提示权限问题。配置文件也说明了模块、模块化管理服务的安全性,每个模块的名称都是自己定义的,可以添加用户名密码验证,也可以验证IP,设置目录是否可写等,不同模块用于同步不同需求的目录。
3.1、认证两种方式rsync-daemon
ssh
=====================
rsync-daemon认证:
在rsync-daemon认证方式下,默认监听tcp的873端口
在rsync-daemon认证下,rsync可以把密码写入到一个文件中。
注意:被同步端的rsync必须启动,配置文件。同步端可以不起动服务,但必须有这个应用。
=====================
ssh认证:
通过ssh隧道进行传输,类似于scp工具,同步操作不在局限于rsync中定义的同步文件夹,并且双方只要安装rsync,也不要双方启动rsync。
如:rsync -avz /root/test root@192.168.19.248:/root/
若rsync服务端SSH为非标准端口,可通过rsync的-e参数进行端口指定。使用方式如下:
rsync -avz /root/test -e ‘ssh -p1234’ root@192.168.19.248:/root/
注意:在使用rsync时,源服务器和目标服务器都必须安装rsync程序。
3.2、配置rsync文件1.建立rsyncd.conf配置文件、独立的rsunc账号文件
配置文件rsyncd.conf
需手动配置,语法类似于Samba配置,此配置文件分两段:全局配置段:1个,共享配置段:多个,可自定义,是以[SHARED_NAME] 定义的.
认证配置auth users、secrets file,不加则为匿名
rsync账号文件
采用“用户名:密码”的格式记录,每行一个用户记录
独立的账号数据,不依赖系统账号
这里配置以socket方式传输文件,[tools]自定义的一个共享目录配置,指定了要同步的目录path, 授权用户,密码文件, 允许哪台服务器IP同步发送等, 配置文件中各个参数具体定义可以通过# man rsyncd.conf查看手册
vim /etc/rsyncd.conf # Global Settings uid = nobody # rsync以什么用户身份启动,uid和gid设置成root时可以读取任何文件目录,但会带来安全隐患 gid = nobody # rsync以什么组启动 use chroot = no # 固定在同步目录 max connections = 0 # 最大连接数,0代表没有限制 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log log file = /var/log/rsyncd.log # exclude = lost+found/ # 设置不同步的目录或文件,多个用空格隔开 # transfer logging = yes timeout = 900 ignore nonreadable = yes # dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # Directory to be synced [tools] #同步模块名称,可以设置多个(这个模块就是待会儿对端写脚本的里面一个参数的名称) path = /data #需要同步的目录(准确的说是同步过来后放到哪里的目录路径) ignore errors = no #是否允许忽略错误 read only = no #表示网络权限可写(本地控制真正可写) write only = no host allow = * #白名单列表,多个用逗号隔开 host deny = 172.16.0.0/16 #黑名单列表,多个用逗号隔开 list = true # 是否允许列出文件 uid = root #这个共享是以root用户运行的, 这里的共享配置可以覆盖global的里面的配置 gid = root auth users=jingming #执行数据同步的用户名,可以设置多个用逗号隔开 secrets file=/etc/rsyncd.secrets #用户认证配置文件,里面保存用户名称和密码
密码文件/etc/rsynced.secrets内格式为: username:password 内容为明文,一行一个用户,密码。这里的密码和系统用户无关,是自定义设置的 这里定义的用户要和/etc/rsyncd.conf的auth users 对应 [root@localhost soft]# more /etc/rsyncd.secrets jingming:123456 修改权限:权限必须600,不然GG [root@localhost soft]# chmod 600 /etc/rsyncd.secrets
2.启用rsync服务
通过 --daemon独自提供服务:rsync --daemon 可以通过执行kill $(cat /var/run/rsyncd.pid)关闭服务 #开机启动 echo "rsync --daemon --config=/etc/rsyncd.conf" >>/etc/rc.local #立即运行服务端,其实这儿的配置文件位置就是默认的,可以不加--config rsync --daemon --config=/etc/rsyncd.conf
# yum -y install xinetd # chkconfig rsync on 1.1为rsync提供配置文件 /etc/rsyncd.conf 此配置文件分两段: 全局配置段:1个 共享配置段:多个,可自定义,是以[SHARED_NAME] 定义的 1、2配置示例 # Global Settings uid = nobody gid = nobody use chroot max connections = 10 strict modes = yes 严格模式 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log # Directory to be synced [tools] path = /data ignore errors = yes 是否允许忽略错误 read only = no write only = no host allow = 172.16.0.0/16 白名单列表 host deny = * list = true 是否允许列出文件? uid = root 这个共享是以root用户运行的, 这里的共享配置可以覆盖global的里面的配置 gid = root auth users=jingming secrets file=/etc/rsyncd.secrets 这里配置以socket方式传输文件,[tools]自定义的一个共享目录配置,指定了要同步的目录path, 授权用户,密码文件, 允许哪天服务器IP同步发送等, 配置文件中各个参数具体定义可以通过 # man rsyncd.conf 查看手册 密码文件/etc/rsynced.secrets内格式为: username:password 内容为明文,一行一个用户,密码。这里的密码和系统用户无关,是自定义设置的 这里定义的用户要和/etc/rsyncd.conf的auth users 对应 修改权限: # chmod 600 /etc/rsyncd.secrets 确保除了root,任何人不能访问此文件
黑白名单此处需要注意: (1)默认规则为允许访问,二者都不出现时 (2)只出现hosts allow:定义白名单;但没有被匹配到的由默认规则处理,即为允许 (3)只出现hosts deny:定义黑名单;出现在名单中的都被拒绝 (4)二者同时出现,先检查hosts allow,如果匹配就allow,否则,检查hosts deny 如果匹配则拒绝,如二者均无匹配,则使用默认的,即允许5、rysnc参数
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等价于 -rlptgoD (注意不包括 -H) -v, --verbose 详细输出模式 -r, --recursive 对子目录以递归模式处理 -l, --links 保持软链接文件,加上这个参数,同步过来的文件会保持之前的软链接属性不变 -H, --hard-links 保持硬链接文件 -p, --perms 保持文件权限 -t, --times 保持文件时间信息 -g, --group 保持文件属组信息 -o, --owner 保持文件属主信息 (super-user only) -D 保持设备文件和特殊文件 (super-user only) -e, --rsh=COMMAND 指定替代 rsh 的 shell 程序 -z, --compress 在传输文件时进行压缩处理 --stats 给出某些文件的传输状态 --progress 在传输时显示传输过程 --timeout=TIME 同步过程中,IP超时时间,单位为秒 --exclude=PATTERN 指定同步时需要过滤掉的文件或子目录(即不需要同步过去的),后面直接跟不需要同步的单个文件名或子目录(不需要跟路径) ,过滤多个文件或子目录,就使用多个--exclude --exclude-from=FILE 指定同步时需要过滤掉的文件或子目录,后面跟文件(比如/root/exclue.txt),然后将不需要同步的文件和子目录放到/root/exclue.txt下 --include=PATTERN 指定需要传输的文件匹配模式 --include-from=FILE 从 FILE 中读取包含规则 --copy-unsafe-links 拷贝指向SRC路径目录树以外的链接文件 --safe-links 忽略指向SRC路径目录树以外的链接文件(默认) --existing 仅仅更新那些已经存在于接收端的文件,而不备份那些新创建的文件 --ignore-existing 忽略那些已经存在于接收端的文件,仅备份那些新创建的文件 -b, --backup 当有变化时,对目标目录中的旧版文件进行备份 --backup-dir=DIR 与 -b 结合使用,将备份的文件存到 DIR 目录中 --link-dest=DIR 当文件未改变时基于 DIR 创建硬链接文件 --delete 删除那些目标目录中有而源目录中没有的多余文件。这个是rsync做增量方式的全备份的最佳选择方案!!!!! --delete-before 接受者在输出之前进行删除操作。即先将目标目录中文件全部删除,再将源目录文件拷贝过去。这是rsync保持目标目录跟源目录一致的方案!!! --delete-after 在同步操作之后做比较,删除那些目标目录中有而源目录中没有的多余文件 --delete-excluded 删除目标目录中那些被该选项指定排除的文件 --ignore-errors 即使出现 I/O 错误也进行删除 --partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输 -P 等价于 --partial --progress --delay-updates 将正在更新的文件先保存到一个临时目录(默认为 “.~tmp~”),待传输完毕再更新目标文件 -q, --quiet 精简输出模式 -h, --human-readable 输出文件大小使用易读的单位(如,K,M等) -n, --dry-run 显示哪些文件将被传输 --list-only 仅仅列出文件而不进行复制 --rsyncpath=PROGRAM 指定远程服务器上的 rsync 命令所在路径 --password-file=FILE 从 FILE 中读取口令,以避免在终端上输入口令,通常在 cron 中连接 rsync 服务器时使用 --version 打印版本信息 --port=PORT 指定其他的rsync服务端口 --log-format=formAT 指定日志文件格式 --password-file=FILE 从FILE中得到密码 --bwlimit=KBPS 限制I/O带宽,KBytes per second --help 显示帮助信息 -4, --ipv4 使用 IPv4 -6, --ipv6 使用 IPv6
rsync命令的选项 -n: 同步测试, 不执行真正的同步过程 -v: 详细输出模式 -q: 静默模式, 不输出信息 -c: checksum,开启校验功能 -r: 递归复制 注意:rsync命令中,如果源路径是目录,且给出复制路径末尾含有/, 则会复制目录中的内容,而非目录本身,如果路径末尾没有/,则会同步目录本身及目录中的所有文件。 目标路径末尾是否有/无关紧要 eg: # rsync /etc/yum.repo.d /tmp/test 此时源路径结尾不含/ 则复制的是 yum.repo.d的文件夹本身及其内的所有文件 此时同步过去的目录结构为:/tmp/test/yum.repo.d # rsync /etc/yum.repo.d/ /tmp/test 此时源路径结尾含有/ 则复制的是/etc/yum.repo.d下所有的文件到/tmp/test/下 -a:归档, 保留文件的原有属性 -p: 保留文件权限(rwx) -t: 保留文件时间戳 -l: 保留符号链接 -g: 保留属组 -o: 保留属主 所以 -a相当用与 -rptlgo -D: 保留设备文件 -e ssh: 使用ssh作为传输承载 -z: 压缩后传输--progress: 显示进度条--stats: 显示如何执行压缩和传输6、Inotify参数
1、inotify 可以监视的文件系统事件包括: IN_ACCESS,即文件被访问 IN_MODIFY,文件被 write IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等 IN_CLOSE_WRITE,可写文件被 close IN_CLOSE_NOWRITE,不可写文件被 close IN_OPEN,文件被 open IN_MOVED_FROM,文件被移走,如 mv IN_MOVED_TO,文件被移来,如 mv、cp IN_CREATE,创建新文件 IN_DELETe,文件被删除,如 rm IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己 IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己 IN_UNMOUNT,宿主文件系统被 umount IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO) 注:上面所说的文件也包括目录。7、rsync实例配置,远程同步
A机配置,作为服务端,数据可上传下载
[root@localhost soft]# vi /etc/rsyncd.conf # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: # uid = nobody # gid = nobody # use chroot = yes # max connections = 4 # pid file = /var/run/rsyncd.pid # exclude = lost+found/ # transfer logging = yes # timeout = 900 # ignore nonreadable = yes # dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # [ftp] # path = /home/ftp # comment = ftp export area [appcs] path = /soft/1 uid = root gid = root auth users = cs secrets file = /etc/rsyncd.secrets read only=no ~
B机客户端执行同步
测试1rsync -avzP /tmp/1 rsync://cs@192.168.14.152/appcs
结果是将B机/tmp下面的1文件夹同步到了A机的/soft/1目录
rsync -avzP /tmp/1/ rsync://cs@192.168.14.152/appcs 结果是将B机/tmp/1文件夹下面的内容同步到了A机的/soft/1目录测试3
rsync -avp rsync://cs@192.168.14.152/appcs /tmp/1 将A机房/soft/1文件数据同步到B机/tmp/1文件夹下 下面的命令效果是一样的,前面两个测试一样有对应的命令 rsync -avp cs@192.168.14.152::appcs /tmp/1 上面是daemon的方式,都是通过rsync配置的内容,比如上面的cs用户是虚拟的,appcs是模块名称。 下面是ssh的方式,需要使用实际的用户名和路径。不需要启动rysnc daemon。 rsync -avp root@192.168.14.152:/soft/1/ /tmp/18、inotify+rsync实例,远程同步
测试目的,A机/data目录下文件变化,同步到B机的/data/www1目录
B机作为rsync服务端,接受A机的文件同步1、rsync配置
[root@pgsql1 1]# more /etc/rsyncd.conf # /etc/rsyncd: configuration file for rsync daemon mode # See rsyncd.conf man page for more options. # configuration example: # uid = nobody # gid = nobody # use chroot = yes # max connections = 4 # pid file = /var/run/rsyncd.pid # exclude = lost+found/ # transfer logging = yes # timeout = 900 # ignore nonreadable = yes # dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # [ftp] # path = /home/ftp # comment = ftp export area uid = root gid = root use chroot = no max connections = 100 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [web1] path = /data/www1/ read only = no list = no auth users = www1 secrets file = /etc/www1.pwd
uid gid使用root用户,不然无权限写入,或者单独授权,这里为方便,直接用的root。
2、创建密码文件
[root@pgsql1 1]# ls -l /etc/www1.pwd -rw------- 1 root root 12 5月 10 15:34 /etc/www1.pwd [root@pgsql1 1]# more /etc/www1.pwd www1:111111 [root@pgsql1 1]#
启动服务
rsync --daemon
1、安装rsync和inotify,参考上面1和2章节。
2、配置密码文件,和服务端密码对应
[root@localhost soft]# more /etc/www1.pwd 111111
2、配置inotify监控脚本
vi rsync.sh
#!/bin/bash
src_dir=/data #需要实时同步的文件夹源路径,注意这里目录后要记得带上/,不带/会将data文件夹也同步过去,我们只是需要data下面的文件而已。
des_host=192.168.14.152 #B机IP,rsync服务IP
des_dir=web1 #B同步的模块名称
des_user=www1 #B rsync同步的用户名
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src_dir} | while read file
do
rsync -vzrtopg --delete --progress ${src_dir} ${des_user}@${des_host}::${des_dir} --password-file=/etc/www1.pwd &&
echo "${file} was rsynced" >> /tmp/rsync.log 2>&1 #记录同步日志
echo "---------------------------------------------------------------------------"
done
-r, 即–recursive,表示递归查询目录。
-q, 即–quiet,表示打印出监控事件。
-e, 即–event,通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、attrib等
–timefmt:指定时间的输出格式
–format:指定变化文件的详细信息
%m 月份(以01-12来表示)。
%d 日期(以01-31来表示)。
%y 年份(以00-99来表示)。
%w:表示发生事件的目录
%f:表示发生事件的文件
%T:使用由-timefmt定义的时间格式
%e:表示发生的事件
3、启动监控脚本
[root@localhost soft]# chmod +x rsync.sh [root@localhost soft]# nohup ./rsync.sh & [1] 35304 [root@localhost soft]# nohup: ignoring input and appending output to ‘nohup.out’
4、测试
9、inotify+rsync实例,本地同步A机实现不同目录同步,从/tmp/1同步到/tmp/2目录
1、安装了rsync和inotify工具
2、配置inotify监控脚本
#!/bin/bash
src_dir=/data #需要实时同步的文件夹源路径,注意这里目录后要记得带上/,不带/会将data文件夹也同步过去,我们只是需要data下面的文件而已。
des_host=192.168.14.152 #B机IP,rsync服务IP
des_dir=web1 #B同步的模块名称
des_user=www1 #B rsync同步的用户名
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src_dir} | while read file
do
# rsync -vzrtopg --delete --progress ${src_dir} ${des_user}@${des_host}::${des_dir} --password-file=/etc/www1.pwd &&
rsync -av --progress ${src_dir} /tmp/2 &&
echo "${file} was rsynced" >> /tmp/rsync.log 2>&1 #记录同步日志
echo "---------------------------------------------------------------------------"
done
只是把rsync的命令和目录替换下即可,然后启动监控脚本
10、开机启动#rsync开机启动
echo “rsync --daemon --config=/etc/rsyncd.conf” >>/etc/rc.local
#inotify开机启动
echo “bash /soft/rsync.sh &” >>/etc/rc.local
在在CentOS7中,官方将/etc/rc.d/rc.local 的开机自启的权限禁止掉了,他为了兼容性,设置了这个,但是并不默认启动.如果需要的话.执行以下代码
chmod +x /etc/rc.d/rc.local
就可以开机自启了.
参考https://www.dandelioncloud.cn/article/details/1419660984435937282
https://www.cnblogs.com/jokerxtr/p/14802077.html



