使用 rsync 定时同步数据

首先我们需要知道 rsync 的基本使用方法，可以通过 man rsync 简单的了解一下。

本地：rsync [选项...] 源... [目标]

通过 SSH 远程连接:

Copy
拉取: rsync [选项...] [用户@]地址:源... [目标]

推送: rsync [选项...] 源... [用户@]地址:目标

通过 rsync 监听服务:

Copy
拉取:

rsync [选项...] [用户@]地址::源... [目标]
rsync [选项...] rsync://[用户@]地址[:端口]/源... [目标]

推送:

rsync [选项...] 源... [用户@]地址::目标
rsync [选项...] 源... rsync://[用户@]地址[:端口]/目标

只有提供 SRC 参数，而没有 DEST 参数将列出源文件而不是复制。

快速开始

使用平台：ubuntu 20

如何实现：通过在服务端配置 rsync 监听服务，并在客户端主动推送，并设置 crontab 定时任务。

配置 rsync 监听

在远程服务器，也就是希望同步文件保存的服务器中，依次执行命令进行判断：

Copy
root@ubuntu:~# sudo apt update
root@ubuntu:~# sudo apt install rsync

检查 rsync 环境是否已安装。

Copy
root@ubuntu:~# service rsync status

查看 rsync 服务信息。

Copy
● rsync.service - fast remote file copy program daemon
Loaded: loaded (/lib/systemd/system/rsync.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-05-09 00:19:13 MSK; 29min ago
Docs: man:rsync(1)
man:rsyncd.conf(5)
Main PID: 6216 (rsync)
Tasks: 1 (limit: 2279)
Memory: 13.0M
CGroup: /system.slice/rsync.service
└─6216 /usr/bin/rsync --daemon --no-detach

使用任意编辑器，或者 cat 打开 rsync.service 服务文件。

Copy
[Unit]
Description=fast remote file copy program daemon
Documentation=man:rsync(1) man:rsyncd.conf(5)
ConditionPathExists=/etc/rsyncd.conf
After=network.target

[Service]
ExecStart=/usr/bin/rsync --daemon --no-detach

[Install]
WantedBy=multi-user.target

通过 ConditionPathExists=/etc/rsyncd.conf 我们可以得知 rsync 读取 rsyncd.conf 读取配置文件。

Copy
root@ubuntu:~# vim /etc/rsyncd.conf

使用任意编辑器打开配置文件，如果不存在就创建一个，别问怎么创建，建议自行百度。

配置选项

Copy
[custom1]
pid file = /var/run/rsyncd1.pid
...

[custom2]
pid file = /var/run/rsyncd2.pid
...

[custom3]
pid file = /var/run/rsyncd3.pid
...

必须：创建自定义模块，之后连接时会用到。

Copy
uid = user1
gid = group1

必须：rsync 模块的用户，不推荐 root，建议使用 adduser --disabled-login [username] 创建一个。

Copy
path = /path/to/backup
use chroot = yes

必须：使用 path 定义这个模块的路径，并使用 use chroot 加强安全性。

Copy
read only = no
write only = no

可选：是否启用读取或写入，可自行按需求配置。

Copy
hosts allow = 154.53.59.237

# 最大连接数
max connections = 4

# 启用传输日志
transfer logging = yes

# 指定日志格式
log format = %t %a %m %f %b

list = no

额外：通过 hosts allow 限制 IP 访问，以及 list 隐藏使用的模块。

客户端连接

在客户端，同样下载 rsync，使用以下指令测试是否配置成功。

Copy
root@vmi819506:~# rsync -avzrn /tmp/test/ rsync://[用户]@[地址][:端口]/[模块]

排错方案

Q1：无法连接到服务端。
A1：可能是服务端的端口未开放，rsync 默认使用 873 端口监听。

设置定时

使用 crontab，时间到后自动运行，下面是一个例子（每 5 分钟运行一次 rsync）：

Copy
5 * * * * [指令]

总结

那么这篇文章到这里就结束了，之后可能会对本文的一些内容进行补充或修改。

rsync 的配置写起来总感觉不够优雅，也没有 md 的高亮支持，寄