CentOS7.5搭建Rsync,实现文件同步

Rsync(remote sync)是UNIX及类UNIX平台下一款神奇的数据镜像备份软件,它不像FTP或其他文件传输服务那样需要进行全备份,Rsync可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。可以使用它进行本地数据或远程数据的复制,Rsync可以使用SSH安全隧道进行加密数据传输。Rsync服务器端定义源数据,Rsync客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的。Rsync使用TCP 873端口。

一、搭建Rsync服务器

为了检验Rsync服务配置的效果,需要使用两台Linux主机(一台充当Rsync服务器,另一台充当Rsync客户端),下表是它们所使用的操作系统以及IP地址。

两台Linux主机所使用的操作系统以及IP地址

主机名称 操作系统 IP地址
Rsync服务端 CentOS7.5 192.168.5.12
Rsync客户端 CentOS7.5 192.168.5.5

 # yum安装rsync

yum install rsync

# 启动rsync

systemctl start rsyncd

# 允许开机自启动

systemctl enable rsyncd

# 检查是否已经成功启动

netstat -lnp |grep 873

因为Rsync是Andrew Tridgell(Samba的作者)与Paul Mackerras合作开发的软件,所以Rsync配置文件与Samba配置文件比较相似。Rsync主要分为三个配置文件,分别是:rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)和rsyncd.motd(服务器信息文件)。

下面的案例将演示如何共享/common目录,为此,需要创建/common目录,并复制一些测试文件存放在该目录下

mkdir /common

cp /etc/init.d/* /common/

进入Rsync的主配置文件

vim /etc/rsyncd.conf

默认配置文件如下图所示:

下面将进行Rsync配置:

#/etc/rsyncd.conf
#设置服务器信息提示文件名称,在该文件中编写提示信息
motd file=/etc/rsyncd.motd
#开启Rsync数据传输日志功能
transfer logging=yes
#设置日志文件名称,可以通过1og format参数设置日志格式
log file=/var/1og/rsyncd.1og
#设置Rsync进程号保存文件名称
pid file=/var/run/rsyncd.pid
#设置锁文件名称
lock file=/var/run/rsync.lock
#设置服务器监听的端口号,默认为873
port=873
#设置服务器所监听网卡接口的IP地址,这里服务器IP地址为192.168.5.12
address=192.168.5.12
#设置进行数据传输时所使用的账户名称或ID号,默认使用nobody
uid=nobody
#设置进行数据传输时所使用的组名称或GID号,默认使用nobody
gid=nobody
#设置user chroot为yes后,rsync会首先进行chroot设置,将根映射到path参数路径下,对客户端而言,系统的根就是path参数所指定的路径。但这样做需要root权限,并且在同步符号连
接资料时仅会同步名称,而内容将不会同步。
use chroot=no
#是否允许客户端上传数据,这里设置为只读。
read only=yes
#设置并发连接数,0代表无限制。超出并发数后,如果依然有客户端连接请求,则将会收到稍后重试的提示消息
max connections=10
#模块,Rsync通过模块定义同步的目录,模块以[name]的形式定义,这与Samba定义共享目录是一样的效果。在Rsync中也可以定义多个模块
[common]
#comment定义注释说明字串
comment=Web content
#同步目录的真实路径通过path指定
path=/common
#忽略一些IO错误
ignore errors
#exclude可以指定例外的目录,即将common目录下的某个目录设置为不同步数据
#exclude=test/
#设置允许连接服务器的账户,账户可以是系统中不存在的用户
auth users=zhangsan,wangwu
#设置密码验证文件名称,注意该文件的权限要求为只读,建议权限为600,仅在设置auth users参数后有效
secrets file=/etc/rsyncd.secrets
#设置允许哪些主机可以同步数据,可以是单个IP,也可以是网段,多个IP与网段之间使用空格分隔
hosts allow=192.168.5.0/255.255.255.0
#设置拒绝所有(除hosts allow定义的主机外)
hosts deny=*
#客户端请求显示模块列表时,本模块名称是否显示,默认为true
list=false

接下来,通过echo的方式创建密码文件/etc/rsyncd.secrets,在该文件中输入两个账户:zhangsan账户的密码是123,wangwu账户的密码是456。需要注意的是,密码文件不可以对所有的人开放可读权限,为了安全,建议设置权限为600。创建服务器提示信息文件并向该文件中导入欢迎词。

echo "zhangsan:123" > /etc/rsyncd.secrets

echo "wangwu:456" >> /etc/rsyncd.secrets

chmod 600 /etc/rsyncd.secrets

echo "Welcome to access" > /etc/rsyncd.motd

systemctl restart rsyncd

iptables -F   # 清空防火墙规则链

二、客户端同步数据

在客户端主机中同样是使用rsync命令进行初始化数据传输,使用同样的程序。

yum install rsync

rsync -vzrtopg --progress zhangsan@192.168.5.12::common /test

rsync命令的描述和用法如下:

描述:一个快速、多功能的远程(或本地)数据复制工具。

用法:下表较全面地介绍了rsync的语法格式,SRC表示源路径,DEST表示目标路径。

本地复制

rsync [选项] SRC... [DEST]

通过远程shell复制
下载数据

rsync [选项] [USER@]HOST:SRC…[DEST]

上传数据

rsync [选项] SRC... [USER@]HOST:DEST

通过rsync远程复制
下载数据

Rsync [选项] [USER@]HOST::SRC…[DEST]

Rsync [选项]rsync://[USER@]HOST[:PORT]/SRC…[DEST]

上传数据

Rsync [选项]SRC…[USER@]HOST::DEST

Rsync [选项]SRC...rsync://[USER@]HOST[:PORT]/DEST

 选项:

-v,--verbose 显示详细信息
-q,--quiet 静默模式,无错误信息
-a,--archive 归档模式,主要保留文件属性,等同于-rlptgoD
-r,--recursive 递归
-b,--backup 如果目标路径已经存在同名文件,将旧的文件重命名为~filename,可以使用--suffix指定不同的备份前缀
--back-dir 将备份文件保存至指定目录
--suffix 指定备份文件前缀
-u,--update 如果目标地址中的文件比将要下载的文件新,则不执行同步,也就是说,不会用旧的文件覆盖新的文件
-l,--links 保留符号链接
-p,--perms 保留文件权限属性
-H,--hard-links 保留硬链接
-A,--acls 保留ACL权限
-X,--xattrs 保留文件附加属性
-o,--owner 保留文件所有者属性
-g,--group 保留文件所属组属性
--devices 保留设备文件
--specials 保留特殊文件
-D 等同于-devices-specials
-t 保留修改时间属性
-W,--whole-file 不做增量检查,直接复制全部文件
-e,--rsh=COMMAND 指定远程shell
--existing 仅同步目标路径中已经有的文件,不下载源路径下新的文件
--delete 删除那些仅在目标路径中存在的文件(源路径中不存在)
-z,--compress 传输过程中对数据进行压缩
--include=PATTERN 匹配不排除的文件
--exclude=PATTERN 匹配需要排除的文件
--progress 显示数据传输的进度信息
--partial 保留因故障未传输完成的文件
-P 等同于--progress-partial
--delete 删除那些目标位置有而原始位置没有的文件
--password-file=FILE 指定密码文件,将密码写入文件,实现非交互式数据同步
--list-only 仅列出服务器模块列表,需要rsync服务器设置list=true

实例:

1、从192.168.5.12主机上以递归方式将/common目录复制至本机/demo目录

rsync -avz 192.168.5.12:/common /demo

注意:需要输入root账户的密码

2、从192.168.5.12主机上以递归方式将/common/目录下的所有内容复制至本机/demo目录,但在/demo目录下不会创建common目录

rsync -avz 192.168.5.12:/common/ /demo

3、将本机当前目录下的以.c结尾的文件复制至192.168.5.12主机的common目录下

rsync -t *.c 192.168.5.12:/common

这里遇到如下图的错误:

解决方法:

执行一下:ssh -o StrictHostKeyChecking=no 192.168.5.12

再重新执行 rsync -t *.c 192.168.5.12:/common,就好了

4、将本机/demo/目录复制至本机/dest目录

rsync -avz /demo/ /dest

5、使用zhangsan账户连接远程192.168.5.12主机的rsync进程,将common模块定义的path路径下载至本地/demo目录。

rsync -avz zhangsan@192.168.5.12::common /demo

6、匿名下载192.168.5.12服务器的common模块至本地/demo目录

rsync -avz 192.168.5.12::common /demo

注意,执行这条命令前需要把 /etc/rsyncd.conf 配置文件里的 auth users=zhangsan,wangwu 注释掉,才能成功,若不注释,会提示输入密码

7、显示192.168.5.12服务器所有的模块名称,需要服务器端配置list=true才会显示

rsync --list-only zhangsan@192.168.5.12::

8、客户端主机每次连接服务器都需要输入密码显得非常麻烦,为此,我们可以创建密码文件rsync.pass,在该文件中仅包含密码,最后使用rsync命令的--password-file参数指定密码文件,就可以省去每次输入密码的烦恼。

echo "123" > rsync.pass

chmod 600 rsync.pass

rsync -avz --delete --password-file=rsync.pass zhangsan@192.168.5.12::common /demo 

注意权限必须设置为600,否则会报以下错误:

三、Rsync+lnotify实现文件自动同步

如果仅使用Rsync进行数据同步,只能满足企业对数据实时性要求不高的环境,即使使用计划任务也仅可以实现定期的数据同步。而且使用Rsync在进行数据同步前需要对所有的文件进行对比,然后进行差异数据同步,然而我们的数据可能只是1TB数据中的1KB数据发生了改变,在不知道什么时候会发生数据改变的情况下,为了同步1KB的数据,我们需要不停地进行Rsync连接,对比客户端与服务器之间的数据差异,这样的机制在当前大数据时代背景下是低效的。往往数据的变化随时都有可能发生,如果多台主机之间要求当数据发生变化后进行实时同步,就需要结合Inotify(inode notify)工具。目前Inotify 已经被集成到Linux内核中(Linux从2.6.13版本的内核以后全部集成了Inotify功能),Inotify为用户态应用程序提供了文件系统事件通告机制,比如,当发生文件的访问、修改以及删除等事件时,可以立刻通告给用户态应用程序,通过Inotify可以实时了解文件系统发生的所有变化。

# 查看当前系统是否支持inotify

ll /proc/sys/fs/inotify/

解释:

/proc/sys/fs/inotify/max_queued_events

# 表示调用inotify_init时分配给inotify instance中可排队的event的数目的最大值,超出这个值的事件被丢弃,但会触发IN_Q_OVERFLOW事件。

/proc/sys/fs/inotify/max_user_instances

# 表示每一个real user ID可创建的inotify instatnces的数量上限。

/proc/sys/fs/inotify/max_user_watches

# 表示每个inotify instatnces可监控的最大目录数量。如果监控的文件数目巨大,需要根据情况,适当增加此值的大小。

例如:echo 30000000 > /proc/sys/fs/inotify/max_user_watches

下表是Inotify可以监控的部分常见文件系统事件。

时间名称 描述
IN_ACCESS 文件访问事件
IN_MODIFY 文件修改事件
IN_ATTRIB 文件属性修改事件
IN_OPEN 文件打开事件
IN_CLOSE_WRITE 可写文件被关闭事件
IN_CLOSE_NOWRITE 不可写文件被关闭事件

IN_MOVED_FROM

IN_MOVED_TO

文件移动或重命名事件
IN_DELETE 文件或目录删除事件
IN_CREATE 文件或目录创建事件
IN_DELETE_SELF 自删除事件

利用Inotify的这种事件通知机制,用户态的应用程序就可以实时监控文件系统的变化,然而Inotify仅是内核提供的一种系统功能,用户如果需要使用该功能,还需要安装用户态软件,在CentOS系统中可以使用inotify-tools来实现文件系统的实时监控,该软件可以从GitHub上(https://github.com/rvoicilas/inotify-tools)或者从SourceForge.net上(https://sourceforge.net/projects/inotify-tools/)下载。

安装:

注意:以下是在充当Rsync客户端的192.168.5.5主机上进行操作的

yum install rsync  # 安装rsync

systemctl start rsyncd     # 启动rsync

systemctl enable rsyncd    # 允许开机自启动

yum install -y gcc     # 安装gcc编译器

# 下载安装inotify-tools

wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

tar -zxvf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure --prefix=/usr/local/inotify

make && make install

监控数据:

inotify-tool提供了两个应用程序,分别为inotifywait与inotifywatch。其中,inotifywait命令的描述和用法如下。

描述:使用inotify机制等待文件系统事件,该命令非常适合实时监控文件系统的变化。

用法:inotifywait [-hcmrq] [-e <event>] [-t <seconds>] [--format <fmt>] [--timefmt <fmt>] <file>…

选项:

-h,--help 显示帮助信息
@<file> 指定监控路径中的例外文件,应用于不需要监控的文件
--fromfile<file> 从文件中读取需要监控与例外的文件名称,每行一个文件名,如果文件名称以@开头,则表示例外文件
-m,--monitor 接收到事件后不退出,默认程序在接收一个事件信息后会退出
-d,--daemon 与--monitor类似,但程序会进入后台执行,需要通过--outfile指定事件信息的输出文件
-o,outfile<file> 将事件信息输出至文件,默认输出至标准输出
-s,--syslog 将错误信息输出至syslog系统日志,默认输出至标准错误输出
-r,--recursive 递归监控
-q,--quiet 静默模式,不输出信息
--exclude<pattern> 使用正则表达式匹配例外文件,区分大小写
--excludei<pattern> 使用正则表达式匹配例外文件,不区分大小写
-t<seconds>,--timeout<seconds> 在指定的时间没有发生事件,则退出程序
-e<event>,--event<event> 仅监控指定的事件
-c,--csv 使用CSV格式输出
--timefmt<fmt> 设置时间格式,即--format指定的%T格式
--format<fmt> 指定输出信息格式,具体格式参考man手册

实例:创建测试目录/test和测试用文件/etc/foo,运行inotifywait命令监控/test目录,然后开启一个新的终端窗口运行命令cat /test/foo,验证当发生查看文件事件时,是否会有事件通知。

mkdir -p /test; echo "hello" > /test/foo

/usr/local/inotify/bin/inotifywait /test/

开启一个新的终端窗口运行命令cat /test/foo,如下图:

收到事件通知,如下图:

Rsync与Inotify 双剑合璧

单一的Rsync工具仅可以进行数据同步,单一的Inotify仅可以实现实时文件监控,而两者的结合将能满足企业对数据中心实时数据同步的要求。接下来用案例说明两者结合部署的流程。在这个案例中,ABC公司需要部署一套Web服务,然而随着用户访问量的增加,单台服务器已经满足不了大量的并发访问。因此,ABC公司决定使用集群技术,整合多台服务器处理能力实现负载均衡,从而满足不断增加的并发访问量。
由于Web服务器所提供的网站数据需要保持一致,但当服务器越来越多时,公司发现在这些主机之间同步那些随时可能发生改变的网站数据简直就是一场噩梦。我们的解决方案是在后端建立一个数据发布服务器,该服务器作为Rsync客户端,通过Inotify机制实时监控网站数据,当数据发生变化后调用Rsync命令上传数据至多个Rsync服务器,这里的Rsync服务器就是提供Web服务的Web服务器。

首先需要在多台Web服务器上部署Rsync服务器,这些Rsync服务器要能够提供客户端上传功能,以实现客户端主机将数据推送至Rsync服务器,实现数据的实时同步功能。最终我们只要在充当Rsync客户端的192.168.5.5主机上修改数据,就可以实时推送数据至多台Web服务器。

在数据发布服务器(192.168.5.5)上安装好下载的 inotify-tool 软件包,并编写监控脚本,当监控到数据发生改变时,自动进行数据同步操作,将数据推送至Web服务器(192.168.5.12),这里的脚本名称为inotify_rsync.sh。

vim inotify_rsync.sh

#!/bin/bash
#This Rsync script based on inotify.
SRC=/demo/
DEST1=common
# DEST2=common2
Client1=192.168.5.12
# Client2=192.168.5.22
User=zhangsan
inotify_home=/usr/local/inotify/ #inotify的安装目录
Passfile=/etc/rsyncd.secrets
[ ! -e $Passfile ] && exit 2     # 判断Passfile文件是否存在

# Wait for change
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e close_write,modify,delete,create,move,attrib $SRC | while read line

do
echo "$line" >> /var/log/inotify_web 2>&1  # # 对/demo/目录的操作事件写入/var/log/inotify_web文件
rsync -avz --delete --progress --password-file=${Passfile} ${SRC} ${User}@${Client1}::${DEST1}
# rsync -avz --delete --progress --password-file=/etc/rsyncd.secrets ${SRC} ${User}@${Client2}::${DEST2}

done

chmod a+x inotify_rsync.sh    # 赋予脚本执行权限

echo "123" > /etc/rsyncd.secrets    # 123为虚拟用户zhangsan的密码

chmod 600 /etc/rsyncd.secrets    # 为密码提取,增加安全性

调试脚本:

bash -n inotify_rsync.sh

bash -x inotify_rsync.sh

-n:可用于测试shell脚本是否存在语法错误,但不会实际执行命令。

-x:进入跟踪方式,显示所执行的每一条命令。

遇到如下错误:

解决方法:在Rsync服务端(192.168.5.12)配置文件/etc/rsyncd.conf里设置read only=false

再重新执行脚本即可。

本文参考自:

(1)丁明一    编著    《Linux运维之道》

(2)博客:https://blog.51cto.com/lwm666/1981947

 

原文地址:https://www.cnblogs.com/opsprobe/p/11809399.html