一、关于

Rsync 是一个常用的 Linux 应用程序,用于文件同步。

它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。

它名称里面的r指的是 remote,rsync 其实就是”远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。

官网:https://rsync.samba.org/

二、使用

2.1 安装
yum install rsync
2.2 命令

格式:rsync 【选项】 源文件 目标文件

常见的选项:
-a,–archive 归档模式,以递归的方式传输文件,并且保持文件属性,等同于-rlptgoD
-r,–recursive 对子目录以递归模式处理
-l,–links 表示拷贝链接文件
-p , –perms 表示保持文件原有权限
-t , –times 表示保持文件原有时间
-g , –group 表示保持文件原有属用户组
-o , –owner 表示保持文件原有属主
-D , –devices 表示块设备文件信息
-z , –compress 表示压缩传输
-H 表示硬连接文件
-A 保留ACL属性信息
-P 显示传输进度
–delete 删除那些目标位置有而原始位置没有的文件
-v 将结果输出到终端

2.3 远程同步

rsync 默认使用 SSH 进行远程登录和数据传输,如下:

rsync -av ./ root@192.168.18.54:/opt/rsync
rsync -av root@192.168.18.54:/opt/rsync /opt/rsync/

同时也支持rsync协议,可参考3.1中配置。

三、实时同步

rsync与crontab inotify等工具一起使用,可实现定时或实时同步。

3.1 备份节点(192.168.18.54)

修改配置文件:

vim /etc/rsyncd.conf

添加以下配置:

uid = nobody
gid = nobody
use chroot = yes
max connections = 10
strict mode=yes
pid file = /var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/var/log/rsyncd.log
[backup]
path = /opt/rsync/
comment = backup file
ignore errrors
read only=no
write only=no
hosts allow=192.168.18.53
hosts deny=*
list=false
uid=root
gid=root
auth users=rabb
secrets file=/etc/rsync.password

编辑密码文件,并授予权限:

echo "rabb:123456" > /etc/rsync.password
chmod 600 /etc/rsync.password

启动 rsync 守护进程:

/usr/local/bin/rsync --daemon

rsync 默认端口为873,所以开放873端口(或者直接关闭防火墙):

firewall-cmd --add-port=873/tcp --permanent --zone=public
firewall-cmd --reload
3.2 主节点(192.168.18.53)

编辑密码文件:

echo "123456" > /etc/rsync.password

给与权限:

chmod 600 /etc/rsync.password
3.3 测试手动同步
rsync -avH --port 873 --delete /opt/rsync/data/ rabb@192.168.18.54::backup --password-file=/etc/rsync.password
3.4 主节点配置notify

安装inofity-tools,我这里是通过rpm包安装的,rmp包下载地址:https://centos.pkgs.org/7/epel-x86_64/inotify-tools-3.14-9.el7.x86_64.rpm.html

创建shell脚本,内容如下:

#!/bin/bash
host1=192.168.18.54
src=/opt/rsync/data/
dst1=backup
user1=rabb
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib $src \
| while read files
do
        rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src $user1@$host1::$dst1 > /dev/null 2>&1
        echo "${files} was rsynced." >> /opt/rsync.log 2>&1
done

启动脚本,然后就可以自动同步文件了。

四、参考

https://www.ruanyifeng.com/blog/2020/08/rsync.html

https://www.jianshu.com/p/fc2f3ec661c0