rsync之数据的远程实时同步

389 阅读13分钟

一、rsync的概念

rsync是一款快速增量备份工具

  • Remote Sync,远程同步
  • 支持本地复制,或者与其他SSH、rsync主机同步
  • rsync(Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
  • rsync 的官方站点的网址是 rsync.samba.org/,目前最新版本是 3.3.0,由 Wayne Davison 进行维护。作为一种最常用的文件备份工具,rsync 往往是 Linux 和 UNIX 系统默 认安装的基本组件之一。

二、rsync的特性

支持拷贝特殊文件,如连接文件、设备等。

可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。

可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。

可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。

可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。

可以通过socket(进程方式)传输文件和数据(服务端和客户端)。

支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

三、rsync的三种工作方式

rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时数据同步。

  1. 本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
  2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。
  3. 本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一个端口上,等待客户端的连接。

四、实时同步技术的介绍

在生产环境,有时会需要两台主机的特定目录实现实时同步。比如,将NFS共享目录的数据文件,自动实时同步到备份服务器特定目录中。

实现实时同步的方法

  • inotify + rsync 方式实现数据同步
  • sersync :在 inotify 软件基础上进行开发的,功能更加强大

inotify+rsync使用方式

  • inotify 对同步数据目录信息的监控
  • rsync 完成对数据的同步
  • 利用脚本进行结合

工作原理

  • 要利用监控服务(inotify),监控同步数据服务器目录中信息的变化
  • 发现目录中数据产生变化,就利用rsync服务推送到备份服务器上

五、inotify 实时监控

inotify:异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件。

实现inotify软件

  • inotify-tools
  • sersync
  • lrsyncd

1. 内核支持

Linux支持inotify的内核最小版本为 2.6.13,参看 man 7 inotify

//列出下面的文件,说明服务器内核支持inotify
[root@localhost ~]# ll /proc/sys/fs/inotify/
总用量 0
-rw-r--r--. 1 root root 0 7月  15 14:59 max_queued_events
-rw-r--r--. 1 root root 0 7月  15 14:59 max_user_instances
-rw-r--r--. 1 root root 0 7月  15 14:59 max_user_watches
[root@localhost ~]# cat /proc/sys/fs/inotify/max_queued_events 
16384
[root@localhost ~]# cat /proc/sys/fs/inotify/max_user_instances 
128
[root@localhost ~]# cat /proc/sys/fs/inotify/max_user_watches 
8192

image.png

inotify 内核参数说明

  • max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错误,默认值:16384, 生产环境建议调大,比如:327679
  • max_user_instances:每个用户创建inotify实例最大值,默认值:128
  • max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大

在市场环境中需调整内核参数

[root@localhost ~]# vim /etc/sysctl.conf
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000

[root@localhost ~]# sysctl -p
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000

[root@localhost ~]# cat /proc/sys/fs/inotify/*
66666
128
100000

image.png

image.png

2. inotify-tools工具

inotify-tools参考文档:github.com/rvoicilas/i…

安装inotify-tools:基于epel源

[root@localhost ~]# yum install epel-release.noarch -y  
[root@localhost ~]# yum install inotify-tools -y

inotify-tools包主要工具

  • inotifywait: 在被监控的文件或目录上等待特定文件系统事件(open ,close,delete等)发生,常用于实时同步的目录监控
  • inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计

3. inotifywait命令

inotifywait命令格式

inotifywait [ options ] file1 [ file2 ] [ file3 ] [ ... ]

常用选项:

选项解释
-m, --monitor始终保持事件监听
-d, --daemon以守护进程方式执行,和-m相似,配合-o使用
-r, --recursive递归监控目录数据信息变化
-q, --quiet输出少量事件信息
--exclude 指定排除文件或目录,使用扩展的正则表达式匹配的模式实现
--excludei 和exclude相似,不区分大小写
-o, --outfile 打印事件到文件中,相当于标准正确输出,注意:使用绝对路径
-s, --syslogOutput发送错误到syslog相当于标准错误输出
--timefmt 指定时间输出格式
--format 指定的输出格式;即实际监控输出内容
-e指定监听指定的事件,如果省略,表示所有事件都进行监听

inotifywait的 --timefmt 时间格式

%Y   //年份信息,包含世纪信息
%y   //年份信息,不包括世纪信息
%m   //显示月份,范围 01-12
%d   //每月的第几天,范围是 01-31
%H   //小时信息,使用 24小时制,范围 00-23 
%M   //分钟,范围 00-59 
%S   //秒,范例 0-60

示例:
--timefmt "%Y-%m-%d %H:%M:%S"

inotifywait的 --format 时间格式

%T   //输出时间格式中定义的时间格式信息,通过 --timefmt option 语法格式指定时间信息
%w   //事件出现时,监控文件或目录的名称信息,相当于dirname
%f   //事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空,相当于basename
%e   //显示发生的事件信息,不同的事件默认用逗号分隔
%Xe  //显示发生的事件信息,不同的事件指定用X进行分隔  x表示分隔符

示例:
--format "%T %w%f event: %;e"
--format '%T %w %f'

inotifywait -e 选项指定的事件类型

create                //文件或目录创建
delete                //文件或目录被删除
modify               //文件或目录内容被写入
attrib                //文件或目录属性改变
close_write        //文件或目录关闭,在写入模式打开之后关闭的
close_nowrite    //文件或目录关闭,在只读模式打开之后关闭的
close                //文件或目录关闭,不管读或是写模式
open                 //文件或目录被打开
lsdir                 //浏览目录内容
moved_to          //文件或目录被移动到监控的目录中
moved_from       //文件或目录从监控的目录中被移动
move               //文件或目录不管移动到或是移出监控目录都触发事件
access              //文件或目录内容被读取
delete_self        //文件或目录被删除,目录本身被删除
unmount           //取消挂载

示例:
-e create,delete,moved_to,close_write,attrib

六、rsync的命令

1. 本地使用

rsync [OPTION...] SRC... [DEST]

示例:
rsync  -av /etc   root@192.168.100.20:/opt   
#复制目录和目录下文件   -a约等于cp命令中的a  v显示过程
rsync  -av /etc/   root@192.168.100。20:/opt
#只复制目录下文件

2. 远程使用基于ssh协议

Pull: 
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: 
rsync [OPTION...] SRC... [USER@]HOST:DEST

3. 远程使用基于 后台 daemon 双冒号或者 双 //

Pull: 
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
#
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connectto an rsync daemon, and require SRC or DEST to start with a module name.

常见选项:

选项作用
-v显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息
-P显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)
-n --dry-run仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的
-a --archive归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"
-r --recursive递归到目录中去
-t --times保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效
-o --owner保持owner属性(属主)
-g --group保持group属性(属组)
-p --perms保持perms属性(权限,不包括特殊权限)
-D是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件
-l --links如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象
-z传输时进行压缩提高效率
-R --relative使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性
--size-only默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小
-u --update仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为
-d --dirs以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1
--max-size限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件
--exclude指定排除规则来排除不需要传输的文件
--delete以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在exclude/include规则生效之后才执行的
-b --backup对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀
--backup-dir指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下
-e指定所要使用的远程shell程序,默认为ssh
--port连接daemon时使用的端口号,默认为873端口
--password-filedaemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码
-W --whole-filersync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效
--existing要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输
--ignore-existing要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能
--remove-source-files要求删除源端已经成功传输的文件

七、rsync的数据同步配置

1. 前期准备,关闭防火墙

systemctl stop firewalld
setenforce 0

2. 修改rsync源服务器配置文件

 vim /etc/ rsyncd. conf
 read only = no   #关闭只读,上行同步需要可以写

 #之后重启
 kill $(cat /var/run/rsyncd.pid)
 rm -rf /var/run/rsyncd.pid
 rsync --daemon  
 netstat -anpt | grep rsync

 #创建一个同步目录,并修改权限
 mkdir /data
 chmod 777 /data

3. 发起端:调整 inotify 内核参数

在Linux内核中,默认的inotify机制提供了三个调控参数

  • max_queue_events ( 监控事件队列,默认值为16384)、
  • max_user_instances (最多监控实例数,默认值为128)、
  • max_user_watches (每个实例最多监控文件数,默认值为8192)。

当要监控的目录、文件数量较多或者变化较频繁时,建议加大这三个参数的值。

cat /proc/sys/fs/inotify/max_queued_events
cat /proc/sys/fs/inotify/max_user_instances
cat /proc/sys/fs/inotify/max_user_watches

vim /etc/sysctl.conf    #内核参数都在该文件中修改
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

sysctl -p

4. 发起端:安装 inotify-tools

用inotify 机制还需要安装inotify-tools, 以便提供inotifywait、 inotifywatch 辅助工具程序,用来监控、汇总改动情况。

  • inotifywait:可监控modify (修改)、create (创建)、move (移动)、delete (删除)、attrib ( 属性更改)等各种事件,一有变动立即输出结果。
  • inotifywatch:可用来收集文件系统变动情况,并在运行结束后输出汇总的变化情况。
tar zxvf inotify-tools-3.14.tar.gz -C /opt/

cd /opt/inotify-tools-3.14
./configure
make && make install

#可以先执行“inotifywait”命令,然后另外再开启一个新终端向 /data 目录下添加文件、移动文件,在原来的终端中跟踪屏幕输出结果。
inotifywait -mrq -e modify,create,move,delete /data

#选项“-e”:用来指定要监控哪些事件
#选项“-m”:表示持续监控
#选项“-r”:表示递归整个目录
#选项“-q”:简化输出信息

5. 发起端:编写触发式同步脚本

在另外一个终端编写触发式同步脚本(注意,脚本名不可包含 rsync 字符串,否则脚本可能不生效)。

vim /opt/inotify.sh 
#!/bin/bash

#定义inotifywait监控/data目录中文件事件的变量。attrib表示属性变化。
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /data"

#定义执行 rysnc 上行同步的变量。--delete保证两边目录内容一致,可以不加。
RSYNC_CMD="rsynC -azH --delete --password-file=/etc/server .pass /data backuper@192.168.41.46::backupdir/"

#使用while、read持续获取监控结果,根据结果可以作进一步判断是否读取到输出的监控记录
$INOTIFY_CMD | while read DIRECTORY EVENT FILE 
do
    #如果rsync未在执行,则立即启动
    if[ $(pgrep rsync | wc -l) -le 0 ];then
         $RSYNC_CMD
    fi
 done

chmod +8 /opt/inotify.sh

chmod +x /etc/rc.d/rc.local     #开机自启脚本文件
echo '/opt/inotify.sh' >> /etc/rc.d/rc.local  #加入开机自动执行

#之后运行脚本(后台运行)
cd /opt/
./inotify.sh &

#之后在发起端创建文件,查看源服务器中是否新增了

如果同步的文件比较大,同步时比较慢导致后面文件没来的及同步,则需要在脚本内添加消息队列或缓冲

#!/bin/bash
#定义inotifywait监控目录中文件事件的变量
INOTIEY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /data/"
#定义执行rsync上行同步的变量
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /data/ backuper@192.168.41.46::backupdir/"
#使用while、read持续获取监控结果,根据结果可以进一步判断是否读取到输出的监控记录
$INOTIEY_CMD | while read DIRECTORY EVENT FILE
do    
      #小于等于0,则等待它执行完再去同步其他文件
      until [ $(pgrep rsync | wc -l) -le 0 ] 
      
      do
         sleep 1
      done
      $RSYNC_CMD
done

6. 验证同步效果

上述脚本用来检测本机/data目录的变动情况,一旦有更新触发rsync 同步操作,上传备份至服务器192.168.100.10 的wwwroot共享目录下。

触发式上行同步的验证过程如下:

(1)在本机运行/opt/inotify.sh 脚本程序.

(2)切换到本机的 /data/ 目录,执行增加、删除、修改文件等操作。

(3)查看远端服务器中的wwwroot目录下的变化情况。

八、rsync实时同步(上行同步)的特点

定期同步的不足

  • 执行备份的时间固定,延迟明显、实时性差
  • 当同步源长期不变化时,密集的定期任务是不必要的

实时同步的优点

  • 一旦同步源出现变化,立即启动备份
  • 只要同步源无变化,则不执行备份

Linux内核的inotify机制

  • 从版本2.6.13开始提供
  • 可以监控文件系统的变动情况,并做出通知响应
  • 辅助软件:inotify-tools

九、使用rsync快速删除大量文件

假如要在linux下删除大量文件,比如100万、1000万,像/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf * 可能就不好用了,因为要等待很长一段时间。

在这种情况下我们可以使用rsync来巧妙处理。

rsync实际用的是替换原理。

#先建立一个空的文件夹:
mkdir /home/blank

#用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /home/blank/ /usr/local/nginx/proxy_temp
 
 #这样目标目录很快就被清空了

选项说明

选项作用
--delete-before接收者在传输进行删除操作
-a归档模式,表示以递归方式传输文件,并保持所有文件属性
-H保持硬连接的文件
-v详细输出模式
--progress在传输时显示传输过程
--stats给出某些文件的传输状态