1、安装rsync

一般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 install

2、安装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机客户端执行同步

测试1

rsync -avzP /tmp/1 rsync://cs@192.168.14.152/appcs

结果是将B机/tmp下面的1文件夹同步到了A机的/soft/1目录
在这里插入图片描述

测试2

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/1

在这里插入图片描述

8、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 510 15:34 /etc/www1.pwd
[root@pgsql1 1]# more /etc/www1.pwd
www1:111111
[root@pgsql1 1]#

启动服务
rsync --daemon

A机为rsync客户端,部署inotify,文件更新服务器

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

Logo

更多推荐