rsync+inotifywait+自动同步详解

rsync简介

rsync是Linux/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。

rsync的常用参数包括:

  1. -v, --verbose:详细模式输出,显示更多的信息。

  2. -q, --quiet:精简输出模式,显示更少的信息。

  3. -c, --checksum:打开校验开关,强制对文件传输进行校验。

  4. -a, --archive
    

    归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。

  • -r, --recursive:对子目录以递归模式处理。
  • -l, --links:保留软链结。
  • -p, --perms:保持文件权限。
  • -t, --times:保持文件时间信息。
  • -g, --group:保持文件属组信息。
  • -o, --owner:保持文件属主信息。
  • -D, --devices:保持设备文件信息。
  1. -z, --compress:对备份的文件在传输时进行压缩处理。

  2. --delete:删除那些DST中SRC没有的文件。

  3. --force:强制删除目录,即使不为空。

  4. -e 'ssh -p 30022':指定ssh端口(默认是22)。

  5. --exclude=workspace:同步时排除某些文件或目录(如workspace)。

rsync+ssh

rsync+ssh实现远程的同步,分为上行和下行

rsync的上行和下行同步命令主要基于其同步的方向和数据传输的方式。

下行同步(客户端从服务器下载内容)

在下行同步中,远程系统的文件和目录被传输到本地系统,以保持两者之间的数据一致性。

命令格式

rsync -avz [选项] 用户名@主机地址:目标 本地位置

示例

要从远程服务器(IP地址为192.168.30.11,rsync用户名为backuper,目录为wwwroot)下载数据到本地的/opt/目录下,可以使用以下命令:

rsync -avz backuper@192.168.30.11:wwwroot /opt/
rsync -avz backuper@192.168.30.11:wwwroot/ /opt/
注意wwwroot/  会被同步到/opt/wwwroot

上行同步(客户端将内容上传到服务器)

上行同步涉及将本地系统的文件和目录传输到远程系统。这通常涉及到在rsync服务器上配置特定的目录,并允许客户端将数据推送到这些目录。

rsync -avz [选项] 源目录/文件 用户名@主机地址:目标

示例

要将本地的/home/user/documents目录上传到远程服务器的wwwroot模块(假设配置允许),可以使用以下命令:

rsync -avz /home/user/documents/ backuper@192.168.30.11::wwwroot/

inotify持续监控

yum install -y inotify-tools

inotifywait

inotifywait命令用于持续监视文件或目录的变化,并在发生指定事件时执行某些操作。以下是其主要参数:

  • -m 或 –monitor:持续监视指定的文件或目录。如果没有此选项,inotifywait将在第一次事件后退出。
  • -r 或 –recursive:递归监视指定目录及其子目录下的文件变化。
  • -e 或 –event :指定要监视的事件类型。可以是多个事件类型组合,如create(创建)、delete(删除)、modify(修改)、move(移动)等。
  • -t 或 –timeout :设置超时时间,超过指定时间后退出监视。
  • -q 或 –quiet:静默模式,不显示监视到的事件信息。
  • -f 或 –format :指定输出的格式,可以选择的格式包括%w(文件路径)、%f(文件名)、%e(事件类型)、%T(时间戳)等。
  • –exclude :排除指定的文件或目录,支持使用通配符进行匹配。
  • –include :只监视符合指定模式的文件或目录。

inotifywatch

inotifywatch命令用于收集关于被监视文件系统的统计数据。以下是其主要参数:

  • -r:监视一个目录下的所有子目录。
  • -t :设置超时时间。
  • -e :只监听指定的事件。
  • -fromfile:从文件中读取需要监控的文件或排除的文件。
  • -z:输出表格的行和列,即使元素为空。

两者的区别

inotifywait和inotifywatch的主要区别在于它们的功能和应用场景。inotifywait专注于实时监控文件或目录的变化,并在发生变化时触发相应的动作;而inotifywatch则用于收集关于被监视文件系统的统计数据,以便进行性能分析和安全审计。两者都是基于Linux内核的inotify机制,但各有侧重,可以根据实际需求选择使用。

inotifywait和inotifywatch是Linux系统中inotify工具的两个不同部分,它们各自具有不同的功能和用途。以下是两者之间的主要区别。

inotifywait

功能

  • 实时监控:inotifywait用于实时监控文件或目录的变化。
  • 事件触发:当指定的文件或目录发生变化时(如文件创建、删除、修改等),inotifywait会触发相应的动作或命令。

特点

  • 基于inotify机制:inotifywait基于Linux内核的inotify机制,因此可以高效、实时地监控文件系统的变化。
  • 持续监视:使用-m--monitor选项,inotifywait可以持续监视指定的文件或目录,直到用户手动停止。
  • 定制化配置:inotifywait提供了丰富的选项和参数,可以根据需要进行定制化配置,如指定要监视的事件类型、设置超时时间等。

应用场景

  • 文件同步:当检测到文件发生变化时,可以自动执行文件同步操作。
  • 备份任务:实时监控重要文件或目录的变化,并在发生变化时自动进行备份。
  • 自动化脚本:结合shell脚本,可以创建自动化任务,如监控日志文件的变化并自动发送通知。

inotifywatch

功能

  • 统计文件系统访问:inotifywatch用于收集关于被监视文件系统的统计数据,如文件访问次数、事件类型等。

特点

  • 统计信息:inotifywatch主要关注于收集文件系统的统计数据,而不是实时监控文件的变化。
  • 格式化输出:通过--format选项,可以指定输出的格式,以便更好地分析和处理收集到的数据。

应用场景

  • 性能监控:分析文件系统的访问模式和性能瓶颈。
  • 安全审计:监视特定目录或文件的访问情况,以进行安全审计和日志记录。

实时同步脚本

cat > rs.sh<<'EOF'
#!/bin/bash
#被同步的目录
DEST=root@192.168.126.22:/root/test/
#源目录,文件有变化的目录
SRC=/root/test/
#日志文件位置
LOG=/tmp/rsyncio.txt
#inotifywait持续监控文件变动
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w %f' -e create,delete,moved_to,close_write ${SRC} | while read DATE TIME DIR FILE
do
   # 当存在其他rsync任务时不执行,否则执行
    if [ $(pgrep rsync | wc -l) -eq 0 ] ; then
        FILEPATH=${DIR}${FILE}
    #    进行同步
        rsync -a --delete  $SRC $DEST &&
     #   输出日志内容到日志文件
        echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up to ${DEST} via rsync" >> $LOG
        fi
done
EOF
chmod +x rs.sh
nohup /root/script/rs.sh  &>/dev/null &

[root@k8s-master01 script]# cat /tmp/rsyncio.txt
At 22:02 on 2024-06-10, file /root/test/rsynddd was backuped up to root@192.168.126.22:/root/test/ via rsync
At 22:02 on 2024-06-10, file /root/test/rsynddd was backuped up to root@192.168.126.22:/root/test/ via rsync
当 inotifywait 检测到匹配的事件时,它会根据 --format 指定的格式输出一行文本。输出将类似于:
2023-10-23 14:30 /path/to/directory filename
然后,使用管道 | 将这个输出传递给 while 循环,并使用 read 命令来读取每一行并将其拆分为四个变量:DATE, TIME, DIR, 和 FILE。

rsyncd

使用rsyncd(rsync守护进程)而不是直接使用rsync命令,在某些场景下有其特定的优势和用途。以下是为什么在某些情况下选择使用rsyncd而不是直接使用rsync的几点原因:

  1. 安全性:
    • rsyncd支持基于虚拟账号和虚拟密码的认证方式,这种方式相对于直接使用SSH(rsync的一种常见用法)进行加密传输来说,安全性更高。因为rsyncd的认证不是直接使用远程主机的真实系统账号,而是使用配置的虚拟账号和密码,这增加了访问控制的安全性。
    • 通过配置rsyncd,可以限制对远程同步目录的访问,确保只有授权的客户端能够访问指定的数据。
  2. 灵活性:
    • 使用rsyncd可以配置多个模块,每个模块可以指定不同的同步源、认证方式、访问权限等,从而满足不同的同步需求。
    • rsyncd可以配置为监听特定的端口(默认为873),这使得在防火墙和网络策略配置时更加灵活。
  3. 性能优化:
    • rsyncd作为守护进程持续运行,它可以在系统启动时自动加载,减少了启动rsync客户端时的额外开销。
    • 在大量小文件同步的场景中,rsyncd可以更有效地管理同步过程,减少因为频繁建立连接和断开连接带来的性能损耗。
  4. 易用性:
    • 通过配置rsyncd,可以实现无需手动输入密码的自动化同步,这简化了同步过程的操作复杂度。
    • 客户端使用rsync命令时,只需要指定rsyncd服务器的主机名或IP地址以及模块名,即可进行同步操作,无需关心底层的连接和认证细节。
  5. 扩展性:
    • rsyncd支持多用户并发访问和同步操作,这使得它能够满足高并发的同步需求。
    • 结合inotify等实时监控工具,可以实现实时的文件变化同步,进一步提高数据同步的及时性和准确性。
  6. 监控和管理:
    • 通过查看rsyncd的日志文件(如/var/log/rsyncd.log),可以实时监控同步过程的状态和错误信息,方便进行故障排查和性能调优。
    • 使用专门的监控工具或自定义脚本,可以实现对rsyncd服务的运行状态、性能指标等进行实时监控和告警通知。

综上所述,虽然直接使用rsync命令在某些场景下也能满足数据同步的需求,但在安全性、灵活性、性能优化、易用性、扩展性和监控管理等方面,使用rsyncd作为守护进程进行数据同步具有更多的优势。因此,在实际应用中,根据具体的需求和场景选择合适的同步方式是非常重要的。

使用rsyncd

使用rsyncd时需要使用双引号和模块名的方法来同步远程

服务端需要启动rsyncd服务并配置

systemctl start rsyncd

编辑配置文件/etc/rsyncd.conf

cat >/etc/rsyncd.conf<<EOF
# 全局参数  
uid = root            # 运行RSYNC守护进程的用户  
gid = root            # 运行RSYNC守护进程的组  
use chroot = no       # 不使用chroot  
max connections = 4   # 最大连接数是4  
pid file = /var/run/rsyncd.pid # pid文件存放位置  
lock file = /var/run/rsync.lock # 锁文件存放位置  
log file = /var/log/rsyncd.log # 日志文件存放位置  

# 模块参数  
[test]  
path = /root/test # 要同步的目录  
#port= 873          #默认使用22
comment = Sync Logs    # 模块的注释信息  
ignore errors          # 忽略无关的IO错误  
read only = no       # 只读,不能上传  
use chroot = no        #默认为true ,修改为no,增加对目录软链接的备份
list = false           # 禁止查看文件列表  
timeout = 600             #设置超时时间
hosts allow = 192.168.126.0/24  # 允许访问服务的IP地址段  
hosts deny = 0.0.0.0/32     # 禁止访问服务的IP地址(此处为示例,通常不需要)  
auth users = root          #执行数据同步的用户名,系统必须存在的用户,可以设置多个,用英文逗号隔开
secrets file = /etc/rsyncd.secrets # 认证用户密码文件
EOF
systemctl restart rsyncd

对于secrets file(如/etc/rsyncd.secrets),你需要创建一个包含用户名和加密密码的文件。这个文件应该只有root用户可读。

用户必须为真,免密可以和真实密码不一致

echo "root:123456" > /etc/rsyncd.secrets  
chmod 600 /etc/rsyncd.secrets

客户端配置及测试

echo "123456" > /tmp/rsync.pass
chmod 600 /tmp/rsync.pass
上传到服务器
rsync -avz /root/test/ root@192.168.126.22::test --password-file=/tmp/rsync.pass
同步到本地
rsync -avz root@192.168.126.22::test /root/test/ --password-file=/tmp/rsync.pass

报错及解决

[root@k8s-master01 script]# rsync -avz /root/test/ root@192.168.126.22::test
Password:
@ERROR: auth failed on module test
rsync error: error starting client-server protocol (code 5) at main.c(1656) [sender=3.1.2]

注释的原因,删掉即可

# 全局参数
uid = root
gid = root
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

# 模块参数
[test]
path = /root/test/
#port= 873
comment = Sync Logs
ignore errors
read only = no
use chroot = no
list = false
timeout = 600
hosts allow = 192.168.126.0/24
hosts deny = 0.0.0.0/32
auth users = root
secrets file = /etc/rsyncd.secrets
点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注