Linux中rsync使用与inotify实时同步配置指南
一、rsync 简介
rsync
(Remote Sync)是 Linux 系统下的一款高效数据镜像和备份工具,用于在本地或远程同步文件和目录。
支持本地复制、基于 SSH 的远程同步,以及使用自有 rsync 协议的同步方式。且仅传输文件中发生变化的部分,极大提高了备份效率。
二、rsync 特性
- 支持整个目录树和文件系统的镜像备份
- 保留文件权限、时间戳、软硬链接等属性
- 无需特殊权限即可安装和使用
- 高效:首次全量备份,后续仅传输修改部分,支持压缩传输
- 安全:支持 SSH、SCP 等加密传输方式,也可直接使用 socket
- 支持匿名传输,适用于网站镜像等场景
三、rsync 的认证协议
rsync 同步系统文件之前要先登录 remote
主机认证,支持两种认证协议:
- SSH 协议
- rsync 协议(需启动
rsyncd
服务)
若使用 SSH 协议,无需在服务端配置文件/etc/rsyncd.conf
,只需具备远程主机的登录权限即可。
示例:使用 SSH 认证
rsync -avz /SRC root@192.168.100.20:/DEST
# 默认使用 SSHrsync -avz /SRC -e ssh root@192.168.100.20:/DEST
# 指定 SSHrsync -avz /SRC -e "ssh -p2222" root@192.168.100.20:/DEST
# 指定非默认 SSH 端口,默认端口为22
四、rsync 常用选项
选项 | 说明 |
---|---|
-a, --archive | 归档模式,保留所有属性,递归同步 |
-v, --verbose | 显示详细信息 |
-q, --quiet | 不输出信息 |
-r, --recursive | 递归同步目录 |
-p, --perms | 保留权限 |
-z, --compress | 压缩传输 |
--delete | 删除目标服务中源服务器没有的文件,在源服务器上做的删除操作同理 |
五、rsync 命令格式与工作模式
1、本地复制
rsync [OPTION]... SRC DEST
# 例:rsync -a a afile
2、推送到远程(本地 → 远程)
rsync [OPTION]... SRC [USER@]HOST:DEST
# 例:rsync -avz a root@192.168.100.20:/tmp/b
3、从远程拉取(远程 → 本地)
rsync [OPTION]... [USER@]HOST:SRC DEST
# 例:rsync -avz root@192.168.100.20:/tmp/file1 /tmp/
六、rsync + inotify 实现实时同步
1、环境说明
服务器类型 | IP地址 | 角色 | 系统 |
---|---|---|---|
源服务器 | 192.168.100.20 | rsync + inotify | CentOS 7 |
目标服务器 | 192.168.100.30 | rsync 服务端 | CentOS 7 |
2、配置步骤
前提:
关闭防火墙和seLinux
systemctl stop firewalld.service systemctl disable firewalld.servicesetenforce 0 vim /etc/selinux/configSELINUX=disabled
到阿里源复制并下载CentOS 7 的镜像
通过自动安装
epel-release
软件包,启用 EPEL 软件仓库的命令、curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum -y install epel-release
-
配置时钟同步,将源服务器当作时钟服务器
在源服务器
vim /etc/chrony.conflocal stratum 10systemctl restart chronyd systemctl enable chronyd hwclock -w
在目标服务器
vim /etc/chrony.confserver 192.168.100.20 iburstsystemctl restart chronyd systemctl enable chronyd hwclock -w chronyc sources
-
在目标服务器上配置rsync服务
安装rsync服务端软件
yum -y install rsync rpm -q rsync
设置rsyncd.conf配置文件
vim /etc/rsyncd.confEOFlog file = /var/log/rsyncd.log# 指定 rsync 守护进程的日志文件路径pidfile = /var/run/rsyncd.pid# 指定存储 rsync 守护进程 PID (进程ID) 的文件路径lock file = /var/run/rsync.lock# 指定锁文件路径,用于防止多个 rsync 守护进程实例同时运行,确保数据一致性secrets file = /etc/rsync.pass# 指定包含用户名和密码的认证文件路径[etc_from_client]# 定义一个模块(或称为共享),连接时需要指定此模块名path = /tmp/# 此模块对应的目标服务器端实际目录路径comment = sync etc from client# 模块的注释描述uid = root# 指定用户IDgid = root# 指定组IDport = 873# 指定端口号,873 是 rsync 的默认端口ignore errors# 指示 rsync 在传输过程中忽略 I/O 错误use chroot = no# rsync 在传输前是否会将根目录切换到 'path' 指定的目录,增强安全性read only = no# 是否为只读list = no# 当客户端请求列出可用模块时,是否显示此模块max connections = 200# 设置允许同时连接到此模块的最大客户端数量timeout = 600# 设置空闲连接超时时间,超过这个时间没有数据传输,连接将被断开auth users = admin# 指定允许连接到此模块的用户名hosts allow = 192.168.100.20# 设置允许连接的白名单hosts deny = 192.168.1.1# 设置拒绝连接的黑名单EOF
创建用户认证文件
vim /etc/rsync.passadmin:wiltjercat /etc/rsync.pass
设置文件权限
chmod 600 /etc/rsync* ll /etc/rsync*
启动rsync服务并设置开机自启动
rsync --daemon # 在本地或通过网络在不同主机之间同步文件和目录,让 rsync 以守护进程(daemon)模式运行 vim /etc/rc.d/rc.local # 这是一个传统的系统启动脚本文件rsync --daemon --config=/etc/rsyncd.conf# 以守护进程模式启动 rsync ,配置文件路径为 /etc/rsyncd.conf(默认路径)netstat -tulnp | grep 873
-
在源服务器上配置rsync服务
安装rsync服务端软件,只需要安装,不要启动,不需要配置
yum -y install rsync rpm -q rsync
创建认证密码文件
echo 'wiltjer' > /etc/rsync.pass cat /etc/rsync.pass
设置文件权限,只设置文件所有者具有读取、写入权限即可
chmod 600 /etc/rsync.pass ll -d /etc/rsync.pass
在源服务器上创建测试目录,然后在源服务器运行以下命令
mkdir -pv /root/etc/test rsync -avH --port 873 \ # 端口号为 873 --progress \ # 显示同步进度 --delete \ # 删除目标服务器上那些在源服务器不再存在的文件 /root/etc admin@192.168.100.30::etc_from_client \ # 本地源目录的路径 指定远程目标 --password-file=/etc/rsync.pass # 包含 rsync 认证密码的文件路径
在目标服务器上查看,在/tmp目录下有/etc/test目录,说明数据同步成功
-
安装inotify-tools,进行实时同步
查看服务器内核是否支持inotify
有这三个max开头的文件则表示服务器内核支持inotify
ll /proc/sys/fs/inotify/
安装inotify-tools
yum -y install make gcc gcc-c++ yum -y install inotify-tools
写同步脚本
让脚本自动去检测我们制定的目录下文件发生的变化
然后再执行rsync的命令把它同步到我们的服务器端去
mkdir /jiaoben touch /jiaoben/inotify.sh chmod +x /jiaoben/inotify.sh vim /jiaoben/inotify.shhost=192.168.100.30# 目标服务器的ipsrc=/root/etc# 在源服务器上所要监控的备份目录(此处可以自定义,但是要保证存在)des=etc_from_client# 自定义的模块名,需要与目标服务器上定义的同步名称一致password=/etc/rsync.pass# 执行数据同步的密码文件user=admin# 执行数据同步的用户名inotifywait=/usr/bin/inotifywait$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files;dorsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$desecho "${files} was rsynced" >>/tmp/rsync.log 2>&1done
启动脚本
nohup bash /jiaoben/inotify.sh & ps -ef | grep inotify
-
测试
在源服务器上生成一个新文件
touch /root/etc/luoqi123
去目标服务器验证
查看inotify生成的日志
tail /tmp/rsync.log
-
设置脚本开机自启
chmod +x /etc/rc.d/rc.local ll /etc/rc.d/rc.local vim /etc/rc.d/rc.localnohup /bin/bash /chenyu/inotify.sh &tail /etc/rc.d/rc.local