Contents
rsync简介
rsync是Linux/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。除此之外,rsync可拷贝、显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。
rsync的常用参数包括:
-v, --verbose
:详细模式输出,显示更多的信息。-q, --quiet
:精简输出模式,显示更少的信息。-
-c, --checksum
:打开校验开关,强制对文件传输进行校验。 -
-a, --archive
归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive
:对子目录以递归模式处理。-l, --links
:保留软链结。-p, --perms
:保持文件权限。-t, --times
:保持文件时间信息。-g, --group
:保持文件属组信息。-o, --owner
:保持文件属主信息。-D, --devices
:保持设备文件信息。
-
-z, --compress
:对备份的文件在传输时进行压缩处理。 -
--delete
:删除那些DST中SRC没有的文件。 -
--force
:强制删除目录,即使不为空。 -
-e 'ssh -p 30022'
:指定ssh端口(默认是22)。 -
--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的几点原因:
- 安全性:
- rsyncd支持基于虚拟账号和虚拟密码的认证方式,这种方式相对于直接使用SSH(rsync的一种常见用法)进行加密传输来说,安全性更高。因为rsyncd的认证不是直接使用远程主机的真实系统账号,而是使用配置的虚拟账号和密码,这增加了访问控制的安全性。
- 通过配置rsyncd,可以限制对远程同步目录的访问,确保只有授权的客户端能够访问指定的数据。
- 灵活性:
- 使用rsyncd可以配置多个模块,每个模块可以指定不同的同步源、认证方式、访问权限等,从而满足不同的同步需求。
- rsyncd可以配置为监听特定的端口(默认为873),这使得在防火墙和网络策略配置时更加灵活。
- 性能优化:
- rsyncd作为守护进程持续运行,它可以在系统启动时自动加载,减少了启动rsync客户端时的额外开销。
- 在大量小文件同步的场景中,rsyncd可以更有效地管理同步过程,减少因为频繁建立连接和断开连接带来的性能损耗。
- 易用性:
- 通过配置rsyncd,可以实现无需手动输入密码的自动化同步,这简化了同步过程的操作复杂度。
- 客户端使用rsync命令时,只需要指定rsyncd服务器的主机名或IP地址以及模块名,即可进行同步操作,无需关心底层的连接和认证细节。
- 扩展性:
- rsyncd支持多用户并发访问和同步操作,这使得它能够满足高并发的同步需求。
- 结合inotify等实时监控工具,可以实现实时的文件变化同步,进一步提高数据同步的及时性和准确性。
- 监控和管理:
- 通过查看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