Rsync与Inotify监控与同步

Posted 魅Lemon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rsync与Inotify监控与同步相关的知识,希望对你有一定的参考价值。

文章目录

一、Rsync远程同步

1、概述

1.1 介绍

rsync官方文档:https://www.samba.org/ftp/rsync/rsync.html

Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快;Rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试;此外,它在windows平台下也有相应的版本,如cwRsync和Sync2NAS等工具

1.2 原理

rsync 是一个常用的 Linux 应用程序,用于文件同步,是用于替代rcp的一个工具,目前由rsync.samba.org维护,所以rsync.conf文件的格式类似于samba的主配 置文件;它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cpmv命令。它名称里面的r指的是 remote,rsync 其实就是"远程同步"(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)

Rsync可以通过rsh或ssh使用,也能以daemon模式去运行 ,在以daemon方式运行时Rsync server会打开一个873 端口,等待客户端去连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。

1.3 特点

  • 可以镜像保存整个目录树和文件系统;
  • 可以很容易做到保持原来文件的权限、时间、软硬链接等;
  • 无须特殊权限即可安装;
  • 优化的流程,文件传输效率高;
  • 可以使用rsh、ssh等方式来传输文件,当然也可以通过直接的socket连接;
  • 支持匿名传输

1.4 安装

# 注意该软件传输的两台机器都需要安装
# ubuntu的安装,但是一般都自带了
sudo apt-get install rsync
# Centos安装
yum install -y rsync

Rsync有两种模式:

  • SSH模式:包括本地模式(类似于cp命令)远程模式(类似于scp命令)
  • daemon模式:守护进程(socket进程:是rsync的重要功能)

2、Rsync基本用法

2.1 基本参数

# -r 参数
# 本机使用 rsync 命令时,可以作为cp和mv命令的替代方法,将源目录同步到目标目录
rsync -r source destination
# -r表示递归,即包含子目录。注意,-r是必须的,否则 rsync 运行不会成功。source目录表示源目录,destination表示目标目录。
# 如果有多个文件或目录需要同步,可以写成下面这样;source1、source2都会被同步到destination目录
rsync -r source1 source2 destination

# -a 参数,equals -rlptgoD
# -a参数可以替代-r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以-a比-r更有用
rsync -a source destination
# 目标目录destination如果不存在,rsync 会自动创建。执行上面的命令后,源目录source被完整地复制到了目标目录destination下面,即形成了destination/source的目录结构。
# 如果只想同步源目录source里面的内容到目标目录destination,则需要在源目录后面加上斜杠。
# source目录里面的内容,就都被复制到了destination目录里面,并不会在destination下面创建一个source子目
rsync -a source/ destination


# -n 参数
# 如果不确定 rsync 执行后会产生什么结果,可以先用-n或--dry-run参数模拟执行的结果
# -n参数模拟命令执行的结果,并不真的执行命令。-v参数则是将结果输出到终端,这样就可以看到哪些内容会被同步
rsync -anv source/ destination

# --delete 参数
# 默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用--delete参数,这将删除只存在于目标目录、不存在于源目录的文件
# --delete参数会使得destination成为source的一个镜像
rsync -av --delete source/ destination

# --exclude 参数
# 有时,我们希望同步时排除某些文件或目录,这时可以用--exclude参数指定排除模式
# 命令排除了所有 TXT 文件
rsync -av --exclude='*.txt' source/ destination
# 或者
rsync -av --exclude '*.txt' source/ destination
# 注意,rsync 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"
# 如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样
rsync -av --exclude 'dir1/*' source/ destination
# 多个排除模式,可以用多个--exclude参数
rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
# 多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个--exclude参数。
rsync -av --exclude='file1.txt','dir1/*' source/ destination
# 如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件
rsync -av --exclude-from='exclude-file.txt' source/ destination

# --include 参数
# --include参数用来指定必须同步的文件模式,往往与--exclude结合使用
# 排除所有文件,但是会包括 TXT 文件
rsync -av --include="*.txt" --exclude='*' source/ destination

2.2 远程同步

首先介绍SSH协议

# rsync 除了支持本地两个目录之间的同步,也支持远程同步。它可以将本地内容,同步到远程服务器
rsync -av source/ username@remote_host:destination
# 也可以将远程内容同步到本地
rsync -av username@remote_host:source/ destination
# rsync 默认使用 SSH 进行远程登录和数据传输,由于早期 rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略
rsync -av -e ssh source/ user@remote_host:/destination
# 如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令
# -e参数指定 SSH 使用2234端口
rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination

rsync 协议

# 除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::
rsync -av source/ 192.168.122.32::module/destination
# 上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配
# 如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令
# rsync rsync://192.168.122.32
# rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址
rsync -av source/ rsync://192.168.122.32/module/destination

2.3 增量备份

rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。

具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。

# --link-dest参数用来指定同步时的基准目录
rsync -a --delete --link-dest /compare/path /source/path /target/path
# 上面命令中,--link-dest参数指定基准目录/compare/path,然后源目录/source/path跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。



# 每一次同步都会生成一个新目录$BACKUP_DIR/$DATETIME,并将软链接$BACKUP_DIR/latest指向这个目录。
# 下一次备份时,就将$BACKUP_DIR/latest作为基准目录,生成新的备份目录。最后,再将软链接$BACKUP_DIR/latest指向新的备份目录
# 下面是一个脚本示例,备份用户的主目录
#!/bin/bash
# A script to perform incremental backups using rsync
set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="$HOME"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="$BACKUP_DIR/$DATETIME"
readonly LATEST_LINK="$BACKUP_DIR/latest"

mkdir -p "$BACKUP_DIR"

rsync -av --delete \\
  "$SOURCE_DIR/" \\
  --link-dest "$LATEST_LINK" \\
  --exclude=".cache" \\
  "$BACKUP_PATH"

rm -rf "$LATEST_LINK"
ln -s "$BACKUP_PATH" "$LATEST_LINK"

2.4 其他配置项

  • -a--archive参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去
  • --append参数指定文件接着上次中断的地方,继续传输
  • --append-verify参数跟--append参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件
  • -b--backup参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix参数指定的文件后缀名,默认是~
  • --backup-dir参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups
  • --bwlimit参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100
  • -c--checksum参数改变rsync的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输
  • --delete参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像
  • -e参数指定使用 SSH 协议传输数据--exclude参数指定排除不进行同步的文件,比如--exclude="*.iso"
  • --exclude-from参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行
  • --existing--ignore-non-existing参数表示不同步目标目录中不存在的文件和目录
  • -h参数表示以人类可读的格式输出
  • -h--help参数返回帮助信息
  • -i参数表示输出源目录与目标目录之间文件差异的详细情况
  • --ignore-existing参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件
  • --include参数指定同步时要包括的文件,一般与--exclude结合使用
  • --link-dest参数指定增量备份的基准目录
  • -m参数指定不同步空目录
  • --max-size参数设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k'
  • --min-size参数设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k
  • -n参数或--dry-run参数模拟将要执行的操作,而并不真的执行。配合-v参数使用,可以看到哪些内容会被同步过去
  • -P参数是--progress--partial这两个参数的结合
  • --partial参数允许恢复中断的传输。不使用该参数时,rsync会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append--append-verify配合使用
  • --partial-dir参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial。一般需要与--append--append-verify配合使用
  • --progress参数表示显示进展
  • -r参数表示递归,即包含子目录
  • --remove-source-files参数表示传输成功后,删除发送方的文件
  • --size-only参数表示只同步大小有变化的文件,不考虑文件修改时间的差异
  • --suffix参数指定文件名备份时,对文件名添加的后缀,默认是~
  • -u--update参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件
  • -v参数表示输出细节。-vv表示输出更详细的信息,-vvv表示输出最详细的信息
  • --version参数返回 rsync 的版本
  • -z参数指定同步时压缩数据

3、rsync服务器搭建

3.1 daemon模式启动

# Ubuntu已经默认安装rsync的,只是不是默认启动而已,需要修改/etc/default/rsync
RSYNC_ENABLE=true   #false改true
# 然后将配置文件拷贝到rsync的配置目录下
sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc

# 根据自己的需求修改配置后,启动服务
sudo systemctl start rsync
# 开放防火墙,rsync服务使用的端口是873,如果开了防火墙需要开放
sudo ufw allow 873


# 对于Centos来说,可以采取以下措施(未验证,只能进行参考)
# 对于负荷较重的 rsync 服务器应该使用独立运行方式
yum install rsync xinetd #服务安装
/usr/bin/rsync --daemon
# 对于负荷较轻的 rsync 服务器可以使用 xinetd 运行方式
yum install rsync xinetd #服务安装
# vim /etc/xinetd.d/rsync --配置托管服务,将下项改为 no
disable = no
/etc/init.d/xinetd start #启动托管服务 xinetd
# chkconfig rsync on
netstat -ntpl | grep 873 #查看服务是否启动

3.2 配置文件详解

全局参数

  • 在全局参数部分也可以定义模块参数,这时该参数的值就是所有模块的默认值
  • address —在独立运行时,用于指定的服务器运行的 IP 地址;由 xinetd 运行时将忽略此参数,使用命令行上的 –address 选项替代。默认本地所有IP
  • port —指定 rsync 守护进程监听的端口号。由 xinetd 运行时将忽略此参数,使用命令行上的 –port 选项替代。默认 873
  • motd file —指定一个消息文件,当客户连接服务器时该文件的内容显示给客户
  • pid file —rsync 的守护进程将其 PID 写入指定的文件
  • log file —指定 rsync 守护进程的日志文件,而不将日志发送给 syslog
  • syslog facility —指定 rsync 发送日志消息给 syslog 时的消息级别
  • socket options —指定自定义 TCP 选项
  • lockfile —指定rsync的锁文件存放路径
  • timeout = 600 —超时时间

模块参数

模块参数主要用于定义 rsync 服务器哪个目录要被同步。模块声明的格式必须为 [module] 形式,这个名字就是在 rsync 客户端看到的名字,类似于 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的

基本模块参数

  • path —指定当前模块在 rsync 服务器上的同步路径,该参数是必须指定的
  • comment —给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户

模块控制参数

  • use chroot = —默认为 true,在传输文件之前首先 chroot 到 path 参数所指定的目录下;优点,安全;缺点,需要 root 权限,不能备份指向 path 外部的符号连接所指向的目录文件
  • uid = —指定该模块以指定的 UID 传输文件;默认nobody
  • gid = —指定该模块以指定的 GID 传输文件;默认nobody
  • max connections —最大并发连接数,0为不限制
  • lock file —指定支持 max connections 参数的锁文件。默认 /var/run/rsyncd.lock
  • list —指定当客户请求列出可以使用的模块列表时,该模块是否应该被列出。默认为 true,显示
  • read only = —只读选择,也就是说,不让客户端上传文件到服务器上。默认true
  • write only = —只写选择,也就是说,不让客户端从服务器上下载文件。默认false
  • ignore errors —忽略IO错误。默认true
  • ignore nonreadable —指定 rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些不应该被备份者获得的文件时是有意义的。false
  • timeout = —该选项可以覆盖客户指定的 IP 超时时间。从而确保 rsync 服务器不会永远等待一个崩溃的客户端。对于匿名 rsync 服务器来说,理想的数字是 600(单位为秒)。0 (未限制)
  • dont compress —用来指定那些在传输之前不进行压缩处理的文件。该选项可以定义一些不允许客户对该模块使用的命令选项列表。必须使用选项全名,而不能是简称。当发生拒绝某个选项的情况时,服务器将报告错误信息然后退出。例如,要防止使用压缩,应该是:"dont compress = " .gz .tgz .zip .z .rpm .deb .iso .bz2 .tbz

模块文件筛选参数

  • exclude —指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 –exclude 来指定模式
  • exclude from —指定一个包含 exclude 规则定义的文件名,服务器从该文件中读取 exclude 列表定义
  • include —指定多个由空格隔开的多个文件或目录(相对路径),并将其添加到 include 列表中。这等同于在客户端命令中使用 –include 来指定模式
  • include from —指定一个包含 include 规则定义的文件名,服务器从该文件中读取 include 列表定义

模块用户认证参数

  • auth users —指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块(和系统用户没有任何关系)。用户名和口令以明文方式存放在 secrets file 参数指定的文件中。默认为匿名方式
  • secrets file —指定一个 rsync 认证口令文件。只有在 auth users 被定义时,该文件才起作用。文件权限必须是 600
  • strict modes —指定是否监测口令文件的权限。为 true 则口令文件只能被 rsync 服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认为true

模块访问控制参数

  • hosts allow —用一个主机列表指定哪些主机客户允许连接该模块。不匹配主机列表的主机将被拒绝。默认值为
  • hosts deny —用一个主机列表指定哪些主机客户不允许连接该模块

模块日志参数

  • transfer logging —使 rsync 服务器将传输操作记录到传输日志文件。默认值为false

  • log format —指定传输日志文件的字段。默认为:“%o %h [%a] %m (%u) %f %l”

    设置了"log file"参数时,在日志每行的开始会添加"%t [%p]";可以使用的日志格式定义符如下所示:

    %o —操作类型:"send"或 “recv”

    %h —远程主机名

    %a —远程IP地址

    %m —模块名

    %u —证的用户名(匿名时是 null)

    %f —文件名

    %l —文件长度字符数

    %p —该次 rsync 会话的 PID

    %P —模块路径

    %t —当前时间

    %b —实际传输的字节数

    %c —当发送文件时,记录该文件的校验码

3.3 配置文件举例

例子一

# sample rsyncd.conf configuration file

# GLOBAL OPTIONS

#motd file=/etc/motd #登录欢迎信息
#log file=/var/log/rsyncd #日志文件
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
pid file=/var/run/rsyncd.pid

#指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。
#syslog facility=daemon

#自定义tcp选项,默认是关闭的
#socket options=

#以下是模块信息,我们可以创建多个模块
# MODULE OPTIONS

[ftp]
        comment = public archive #模块描述
        path = /var/www/pub #需要同步的路径
        use chroot = yes #默认是yes|true,如果为true,那么在rsync在传输文件以前首先chroot到path参数指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要root权限,并且不能备份指向外部的符号连接指向的目录文件。
#       max connections=10 #最大连接数
        lock file = /var/lock/rsyncd #指定支持max connections参数的锁文件。
# the default for read only is yes...
        read only = yes #只读选项
        list = yes #客户请求时可用模块时是否列出该模块
        uid = nobody #设定该模块传输文件时守护进程应该具有的uid
        gid = nogroup #设定该模块传输文件时守护进程应具有的gid,此项与uid配合可以确定文件的访问权限
#       exclude = #用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include    #这个我的理解是排除目录中不需同步的文件
#       exclude from = #可以指定一个包含exclude模式定义的文件名
#       include = #与exclude相似
#       include from = #可以指定一个包含include模式定义的文件名
#       auth users = #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的 challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)
#       secrets file = /etc/rsyncd.secrets #该文件每行包含一个username:password对,以明文方式存储,只有在auth users被定义时,此选项才生效。同时我们需要将此文件权限设置为0600
        strict modes = yes #该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true
#       hosts allow = #允许的主机
#       hosts deny = #拒绝访问的主机
        ignore errors = no #设定rsync服务器在运行delete操作时是否忽略I/O错误
        ignore nonreadable = yes #设定rysnc服务器忽略那些没有访问文件权限的用户
        transfer logging = no #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中
#       log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes. #设定日志格式
        timeout = 600 #超时设置(秒)
        refuse options = checksum dry-run #定义一些不允许客户对该模块使用的命令选项列表
        dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz #告诉rysnc那些文件在传输前不用压缩,默认已设定压缩包不再进行压缩

例子二

#rsync_config
#created by HQ at 2017
##rsyncd.conf start##

uid = rsync            #指定rsync服务运行时向磁盘读取和写入的用户
gid = rsync            #指定rsync服务运行时向磁盘读取和写入的用户组
port = 873             #服务默认端口号873
fake super = yes       #伪装管理员功能开启 便于可以执行chgrp命令
use chroot = false     #安全配置 !!!
max connections = 200  #最大连接数 同时支持200个客户端连接
timeout = 300          #连接超时时间300秒
incoming  chmod  = Du=rwx,Dg=rwx,Fu=rwx,Fgo=rwx
pid file = /var/run/rsyncd.pid
#进程信息文件,便于获取进程号停止进程,便于判断服务是否启动,避免反复启动 
lock file = /var/run/rsync.lock   #锁文件 
log file = /var/log/rsyncd.log    #服务运行时日志文件
transfer logging = yes            #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
#用来指定那些不进行压缩处理再传输的文件
ignore errors     #忽略传输过程一些小错误 
read only = false #指定备份目录的权限为可读可写 
list = false      #是否可以列表
hosts allow = 172.16.1.0/24        #允许访问rsync服务器的客户端白名单 
hosts deny = 0.0.0.0/32            #禁止访问rsync服务器的客户端黑名单 
auth users = rsyncuser             #定义认证用户,实际并不存在 
secrets file = /etc/rsync.passwd 
#密码文件,包含客户机使用定义认证用户连接服务器需要的用户和密码信息 
ignore nonreadable = yes           #忽略错误程序

[home]                             #模块名称,可以多个模块 
    path = /home                   #模块对应的文件同步的路径
    comment = home dir by oldboy   #模块信息

例子三

###全局配置
address = 192.168.3.52           #指定服务器IP地址
port = 873                       #指定运行端口,默认是873,您可以自己指定;
uid = root                       #rsync使用的用户,默认nobody
gid = root                       #rsync使用的gid 默认nobody
#注:服务器端传输文件时,要发哪个用户和用户组来执行,默认是nobody。 如果用nobody 用户和用户组,可能遇到权限问题,有些
#文件从服务器上拉不下来。所以我就偷懒,为了方便,用了root 。不过您可以在定义要同步的目录时定义的模块中指定用户来解决权限的问题。
use chroot = no                     #是否限定在该目录下,默认为true
#当有软连接时,需要改为fasle,如果为true就限定为模块默认目录,通常都在内网使用rsync所以不配也可以
pid file = /var/run/rsyncd.pid       #pid文件位置
lock file = /var/run/rsync.lock     #指定lock文件用来支持"max connections"参数使总连接不会超过限制
log file = /var/log/rsyncd.log      #日志文件路径
max connections = 200           #设置最大连接数,默认0,意思无限制,负值为关闭这个模块
timeout = 300                   #默认为0,表示no timeout,建议300-600(5-10分钟)
transfer logging = yes           #使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。
log format = %t %a %m %f %b         #通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是
#一个包含格式定义符的字符串,可以使用的格式定义符如下所示:
#%h 远程主机名  #%a 远程IP地址  #%l 文件长度字符数  #%p 该次rsync会话的进程id  #%o 操作类型:"send"或"recv"
#%f 文件名      #%P 模块路径    #%m 模块名          #%t 当前时间               #%u 认证的用户名(匿名时是null)  
#%b 实际传输的字节数            #%c 当发送文件时,该字段记录该文件的校验码
#默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫
#rsyncstats的perl脚本程序来统计这种格式的日志文件。
ignore nonreadable = yes      
#指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。    
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2  
#用来指定那些不进行压缩处理再传输的文件,默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz。

###目录配置
[rsync]
  comment= "测试"
  path = /data/rsync
  ignore errors = yes          #是否忽略IO错误
  read only = no            #read only 是只读选择,也就是说,不让客户端上传文件到服务器上
  write only = no            #write only指只可以上传文件不可以下载
  hosts allow = 192.168.3.55    
  #可以指定单个IP,也可以指定整个网段,能提高安全性。格式是ip 与ip 之间、#ip和网段之间、网段和网段之间要用空格隔开;
  hosts deny = *
  list = yes      #list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes。
          #如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。
  exclude = file1/ file2/    #exclude是排除的意思,也就是说,要把/data/rsync目录下的file1和
          #file2排除在外; beinan/和samba/目录之间有空格分开
  auth user = tytt    #该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户
          #和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接
          #请求以后会被rsync请求challenged进行验证身份,这里使用的challenge/response
          #认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。
          #默认情况下无需密码就可以连接模块(也就是匿名方式)。
  secrets file = /etc/rsync.passwd #该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"
           #被定义时,该文件才有作用。文件每行包含一个username:passwd对。
           #一般来说密码最好不要超过8个字符。没有默认的secures file名,
           #需要限式指定一个。(例如:/etc/rsyncd.secrets)

3.4 实战demo

本次测试样例,首先配置服务端,vim /etc/rsyncd.conf,注意一行后面不能有注释否则会出错

#rsync运行权限为root
uid = root
#rsync运行权限为root
gid = root
#是否让进程离开工作目录
use chroot = no
#最大并发连接数,0为不限制
max connections = 5 
#超时时间
timeout = 600 
#指定rsync的pid存放路径
pid file = /var/run/rsyncd.pid 
#指定rsync的锁文件存放路径
lockfile = /var/run/rsyncd.lock 
#指定rsync的日志存放路径
log file = /var/log/rsyncd.log 
#模块名称
[web1] 
  #该模块存放文件的基础路径
  path = /data/test/src 
  #忽略一些无关的I/O错误
  ignore errors = yes 
  #客户端可以上传
  read only = no 
  #客户端可以下载
  write only = no 
  #允许连接的客户端主机ip
  hosts allow = 
  #黑名单,表示任何主机
  hosts deny = 
  list = yes
  #认证此模块的用户名
  auth users = web 
  #指定存放"用户名:密码"格式的文件
  secrets file = /etc/web.passwd 

创建好服务端相关配置

# 创建基础目录
mkdir -p /data/test/src
# 再创建一个目录
mkdir -p /data/test/src/george
touch /data/test/src/1,2,3
# 创建密码文件
echo "web:123" > /etc/web.passwd
chmod 600 /etc/web.passwd
systemctl start rsync.service

然后进行客户端的配置和测试

# 创建需要同步的文件夹
mkdir /data/test
# 密码123,将服务器 web1 模块里的文件同步至 /data/test
rsync -avzP web@192.168.22.11::web1 /data/test/
# 访问查看
rsync --list-only  web@192.168.31.73::web1 /data/test/
# -a —参数,相当于-rlptgoD,
# -r —是递归
# -l —是链接文件,意思是拷贝链接文件
# -i —列出 rsync 服务器中的文件
# -p —表示保持文件原有权限
# -t —保持文件原有时间
# -g —保持文件原有用户组
# -o —保持文件原有属主
# -D —相当于块设备文件
# -z —传输时压缩
# -P —传输进度
# -v —传输时的进度等信息,和-P有点关系

# 让客户端与服务器保持完全一致, --delete
rsync -avzP --delete web@192.168.22.11::web1 /data/test/
# 上传客户端文件至服务端
rsync -avzP --delete /data/test/ web@192.168.22.11::web1
# 上传客户端文件至服务端的 george 目录
rsync -avzP --delete /data/test/ web@192.168.22.11::web1/george
# 递归列出服务端 web1 模块的文件
rsync -ir --password-file=/tmp/rsync.password web@192.168.22.11::web1
# 同步除了路径以及文件名中包含 “3” *的所有文件
rsync -avzP --exclude="*3*" --password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/

# 通过密码文件同步
echo "123"> /tmp/rsync.password
chmod 600 /tmp/rsync.password
# 调用密码文件
rsync -avzP --delete --password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/

# 客户端自动同步,定时计划
crontab -e
10 0 * rsync -avzP —delete —password-file=/tmp/rsync.password web@192.168.22.11::web1 /data/test/
crontab -l

二、Rsync+Notify实时同步

1、概述

rsync与传统的cptar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这样的一个第三方软件。在前面有讲到,rsync可以实现触发式的文件同步,但是通过crontab守护进程方式进行触发,同步的数据和实际数据会有差异,而inotify可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync同步,这样刚好解决了同步数据的实时性问题。

2、Notify配置与运行

2.1 环境配置

# 自行下载最新版本
wget https://github.com/inotify-tools/inotify-tools/releases/download/3.20.2.2/inotify-tools-3.20.2.2.tar.gz

# 安装依赖
apt install -y gcc
mkdir /usr/local/inotify
tar -zxvf inotify-tools-3.20.2.2.tar.gz
cd inotify-tools-3.20.2.2
./configure --prefix=/usr/local/inotify/
make && make install


# 设置环境变量,也可以不配置,这样就需要带前缀/usr/local/inotify/bin运行了
vim /root/.bash_profile
export PATH=/usr/local/inotify/bin/:$PATH

source /root/.bash_profile
# 加载库文件
echo '/usr/local/inotify/lib' >> /etc/ld.so.conf
ldconfig
ln -s /usr/local/inotify/include /usr/include/inotify

2.2 常用参数介绍

  • -m —始终保持监听状态,默认触发事件即退出
  • -r —递归查询目录
  • -q —打印出监控事件
  • -e —定义监控的事件,可用参数:
    • access —访问文件
    • modify —修改文件
    • attrib —属性变更
    • open —打开文件
    • delete —删除文件
    • create —新建文件
    • move —文件移动
  • —fromfile —从文件读取需要监视的文件或者排除的文件,一个文件一行,排除的文件以@开头
  • —timefmt —时间格式
  • —format —输出格式
  • —exclude —正则匹配需要排除的文件,大小写敏感
  • —exclude —正则匹配需要排除的文件,忽略大小写
  • %y%m%d %H%M —年月日时钟
  • %T%w%f%e —时间路径文件名状态

3、测试运行

# 运行,当监控的目录发送改变时,会发生变化
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' -e close_write,modify,delete,create,attrib,move /home/test/src/

编写脚本自动同步,两台机器需要做好 ssh 免密登录

# dest机器
mdkir /data/test/dest/

rsync远程同步与inotify监控

一、关于rsync——一款快速增量备份工具

remote sync ,远程同步,它是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树
支持本地复制,或者与其他ssh、rsync主机同步
官方网站:http://rsync.samba.org
支持增量备份、保持连接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用

1、配置rsync源的基本思路

设置rsync.conf配置文件>建立独立账户>启动rsync-daemon模式

2、 应用示例

用户gsybk,允许下行同步
操作的目录为/var/www/html

3、 配置文件rsyncd.conf

需要手动建立,语法类似samba配置
认证配置auth users、secrets file ,不加则默认为匿名

4、rsync账号文件

采用“用户名:密码”的格式记录,每行一个用户记录
独立的账号数据,不依赖系统账号

5、启动rsync服务

通过–daemon独自提供服务
执行 kill $(cat /var/run/rsyncd.pid)关闭rsync服务

6、rsync 常用选项

-a:归档模式,递归并保留对象属性,等同于 -rlptgoD
-v:显示同步过程的详细(verbose)信息
-z:在传输文件时进行压缩(compress)
-H:保留硬连接文件
-A:保留ACL属性信息
–delete:删除目标位置有而原始位置没有的文件
–checksum:根据对象的校验和来决定是否跳过文件

二、实验

服务端IP: 192.168.100.8

客户端IP: 192.168.100.7

1、安装rsync

[root@localhost ~]# hostnamectl set-hostname rsyncd
[root@localhost ~]# su
[root@rsyncd ~]# systemctl stop firewalld
[root@rsyncd ~]# systemctl disable firewalld
[root@rsyncd ~]# setenforce 0
[root@rsyncd ~]# yum install -y httpd
[root@rsyncd ~]# yum -y install rsync

2、修改配置文件

vim /etc/rsyncd.conf
删除输入输入一下内容

 uid = nobody
 gid = nobody
 use chroot = yes
 address = 192.168.100.8
 port 873
 log file = /var/log/rsyncd.log
 pid file = /var/run/rsyncd.pid
 hosts allow = 192.168.100.0/24
[wwwroot]
 path = /var/www/html
 comment = Document Root of www.lvlq.com
 read only = yes
 dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
 auth users = lvlq
 secrets file = /etc/rsyncd_users.db


脚本解释

uid = nobody
gid = nobody
use chroot = yes ####禁锢在源目录
address = 192.168.100.8 ####监听地址
port 873 ####监听端口号
log file = /var/log/rsyncd.log ####日志文件位置
pid file = /var/run/rsyncd.pid ####存放进程ID的文件位置
hosts allow = 192.168.100.0/24 ####允许访问的客户机地址
[wwwroot] ####共享模块名称
path = /var/www/html ####源目录的实际路径
comment = Document Root of www.lvlq.com
read only =yes #####是否只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z ####同步时不再压缩的文件类型
auth users =lvlq #####授权账户
secrets file = /etc/rsyncd_users.db ####存放账户信息的数据文件

3、修改用户文件

vim etc/rsyncd_users.db

lvlq:123123

chmod 600 /etc/rsyncd_users.db #赋予权限

4、开启服务

通过–daemon独自提供服务

如果要停止这个服务 kill $(cat /var/run/rsyncd.pid)

[root@rsyncd ~]# rsync --daemon
[root@rsyncd ~]# netstat -anpt |grep rsync
tcp        0      0 192.168.100.8:873       0.0.0.0:*               LISTEN      77400/rsync

5、创建文件

在配置文件规定的源目录/var/www/html/下,创建文件

[root@rsyncd ~]#  cd /var/www/html/
[root@rsyncd html]# ls
[root@rsyncd html]# echo "this is goodgoodstudy" > ggd.html
[root@rsyncd html]# echo "happy day" > ggd1.html
[root@rsyncd html]# ls
ggd1.html  ggd.html

6、在另一台机子使用rsync进行远程操作

[root@rsyncd html]# hostnamectl set-hostname client
[root@rsyncd html]# su
[root@client html]# yum install -y rsync

7、rsync的用法

可以作为本地复制命令使用

rsync [选项] 原始位置 目标位置

###常用选项###
-a:归档模式,递归并保留对象属性,等同于 -rlptgoD
-v:显示同步过程的详细(verbose)信息
-z:在传输文件时进行压缩(compress)
-H:保留硬连接文件
-A:保留ACL属性信息
–delete:删除目标位置有而原始位置没有的文件
–checksum:根据对象的校验和来决定是否跳过文件

[root@client html]# cd /opt/
[root@client opt]# ls
 rh
[root@client opt]#
[root@client opt]#
[root@client opt]#
[root@client opt]# rsync /etc/passwd /opt/
[root@client opt]# ls
 passwd                     rh

8、配置源

格式1:rsync [选项] 用户名@主机地址::共享模块名 目标路径
格式2: rsync [选项] rsync://用户名@主机地址/共享模块名 目标路径
在客户端上

[root@client ~]#  rsync -avz lvlq@192.168.100.8::wwwroot /opt
Password:    #密码是之前设置的123123
receiving incremental file list
./
ggd.html
ggd1.html

sent 65 bytes  received 204 bytes  59.78 bytes/sec
total size is 32  speedup is 0.12
[root@client opt]# ls
ggd1.html  ggd.html  nginx-1.12.2  nginx-1.12.2.tar.gz  rh
[root@client opt]#


9、测试-delete模式

可以发现,原先存在的fstab文件被删除掉了

[root@client opt]# rm -rf nginx-1.12.2.tar.gz  rh
[root@client opt]# ls
ggd1.html  ggd.html  nginx-1.12.2
[root@kehuduan opt]# rsync -avzH --delete lvlq@192.168.100.8::wwwroot /opt
Password: 
receiving incremental file list
deleting fstab
./
gsy.html
gsy1.html
sent 69 bytes  received 213 bytes  112.80 bytes/sec
total size is 37  speedup is 0.13
[root@client opt]# ls
ggd1.html  ggd.html  nginx-1.12.2

10、设置免交互

rsync的免交互处理
设置好一个文件,里面输入对应的密码
在输入命令时添加–password-file=密码文件路径

[root@client opt]# vim mima
123123
[root@client opt]# chmod  600 mima
[root@client opt]# rsync -avzH --password-file=/opt/mima lvlq@192.168.100.8::wwwroot /opt
receiving incremental file list
./

sent 27 bytes  received 110 bytes  274.00 bytes/sec
total size is 32  speedup is 0.23

11、设置周期任务

mkdir /webbak
vim /opt/rysnccrond.sh

#!/bim/bash
rsync -avz --delete --password-file=/opt/mima lvlq@192.168.100.8::wwwroot /webbak

每天晚上10点半对服务器网站目录更新一次

30 22 * * * 
soure /opt/rysnccrond.sh

12、rsync实时同步

1 周期性计划任务的不足之处:

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

2 实时同步的优点:

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

3 实时同步需要在配置文件中,只读设为no

[root@rsyncd ~]# vi /etc/rsyncd.conf
read only = no 

二、inotify

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

1、查看监控文件的大小

在客户端上

[root@client opt]# cat /proc/sys/fs/inotify/max_queued_events
16384   #/监控队列大小
[root@client opt]# cat /proc/sys/fs/inotify/max_user_instances
128    #/最多监控实例数
[root@client opt]# cat /proc/sys/fs/inotify/max_user_watches
8192   #每个实例最多监控文件数

2、 修改inotify内核参数

[root@client opt]# vim /etc/sysctl.conf
#追加
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@client opt]# sysctl -p    #生效
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576

3、client安装 inotify-tools

上传inotify-tools-3.14.tar.gz到/opt

[root@client opt]# yum -y install gcc gcc-c++
[root@client opt]# tar zxvf inotify-tools-3.14.tar.gz -C /opt
[root@client opt]# cd /opt/inotify-tools-3.14/
[root@client inotify-tools-3.14]# ./configure
[root@client inotify-tools-3.14]# make && make install

inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果

 inotifywait -mrq -e modify,create,move,delete /webbak/

这时再开一个client的终端,实行创建、移动文件

[root@client webbak]# mkdir file
[root@client webbak]# touch hao{1..10}

[root@client webbak]# mv hao1 /
[root@client webbak]#
[root@client webbak]# ls
1     ggd1.html  hao10  hao3  hao5  hao7  hao9
file  ggd.html   hao2   hao4  hao6  hao8


4、利用脚本触发同步

[root@client opt]# vim inotify.sh

#!/bin/bash
#这是一个监控到共享目录下文件被删除时,自动同步的源目录的脚本
dd=/webbak
#注意,写/webbak会将这个目录也同步上去,/webbak/则只会同步目录内的文件
user=lvlq
passfile=/opt/mima
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib $dd"
RSYNC_CMD="rsync -azH --delete --password-file=$passfile $dd $user@192.168.100.8::wwwroot"

$NOTIFY_CMD | while read DIRECTORY EVENT FILE
##持续监控过程中一旦读到了目录指定事件的发生。执行do...done里面的操作。
do

    if [ $(pgrep rsync | wc -l) -le 0 ] ; then

        $RSYNC_CMD

#       echo "${FILE} was rsynced" >>/opt/inotify_rsync.log


    fi

done

bash inotify.sh&
#持续后台进行

5、添加权限

[root@rsync html]# chmod 777 /var/www/html/

[root@client opt]#  chmod 777 /webbak

6、创建测试文件

以上是关于Rsync与Inotify监控与同步的主要内容,如果未能解决你的问题,请参考以下文章

配置rsync+inotify实时同步

rsync远程同步与inotify监控

rsync+inotify实时同步

rsync+inotify实时同步

INOTIFY监控服务与RSYNC服务实现CLIENT与SERVER之间的实时同步

配置rsync+inotify实时同步