Rsync 简介
最近,木子对 Rocky Linux 中文社区的官网执行了一次数据备份,将数据安全地转储至 NAS 设备。这一举措旨在确保一旦 Web 服务器遭遇故障,我们能迅速恢复服务。在备份过程中,木子利用了 rsync 工具,这也是本文诞生的契机。Rsync(Remote Synchronization)是一个非常强大的工具,它允许您进行快速的文件同步,通常用于备份和镜像。Rsync 服务器就是运行了 rsync 守护进程的服务器,使得其他机器可以通过 rsync 协议与之通信并同步文件。Rsync 的优势在于它使用了一种增量传输技术,这意味着当目标位置已经有一个较早版本的文件时,rsync 会仅传输改变了的部分。这种方法不仅速度快,而且节约带宽。Rsync 服务器配置灵活,您可以设置为匿名访问或者基于用户认证,还可以通过 SSH 进行加密传输,增加数据传输的安全性。它同时支持推(push)和拉(pull)两种同步模式,可以非常方便的从一个中心点同步数据到多个目的地,或者将数据从多个源头汇总到一个中心服务器。Rsync 的使用场景非常广泛,从普通的文件备份到网站的镜像,再到大规模的数据分发,其稳定性和高效性都得到了广泛的认可。在 Linux 和 Unix 系统中,rsync 几乎是标准配置,而在 Windows 系统中,也有多种方式可以使用 rsync。总之,如果您需要一个可靠、高效、易于配置的文件同步解决方案,Rsync 服务器无疑是一个值得考虑的选项。
Rsync Server 配置
在 docker-compose.yaml 文件中,会对重要的配置进行说明,因个人网络环境等不同,需要根据自身实际情况调整配置。
Docker 镜像相关配置说明参考: Docker Rsync Server
[root@demo rsync-server]# cat > docker-compose.yaml << \EOF
version: '3'
services:
rsync-server:
image: axiom/rsync-server
container_name: rsync-server
restart: always
ports:
- "1022:22" # 如果不使用SSH Key,可以不用配置
- "873:873"
volumes:
- /SSD/Demo/rsync-server/data/:/data # 将数据持久化至本地
environment:
- USERNAME=xxx # 认证用户
- PASSWORD=xxx # 认证密码
- VOLUME=/data # 数据容器中的存储目录
- ALLOW=xxx.xxx.xxx.xxx/32 # 允许访问 Rsync 服务器IP
EOF
# 启动服务
[root@demo rsync-server]# docker-compose up -d
# 查看服务是否启动正常
[root@demo rsync-server]# docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
rsync-server axiom/rsync-server "/entrypoint.sh rsyn…" rsync-server About an hour ago Up About an hour 0.0.0.0:873->873/tcp, :::873->873/tcp, 0.0.0.0:1022->22/tcp, :::1022->22/tcp
# 进入容器
[root@demo rsync-server]# docker-compose exec -it rsync-server bash
# rsync server 文件主要包含两个 /etc/rsyncd.conf 和 /etc/rsyncd.secrets,其中 /etc/rsyncd.conf 为配置文件,/etc/rsyncd.secrets 为密钥管理文件。
root@64d9869fa91e:/# cat /etc/rsyncd.conf
log file = /dev/stdout
timeout = 300
max connections = 10
port = 873 # 端口
[volume]
uid = root
gid = root
hosts deny = *
hosts allow = xxx.xxx.xxx.xxx/32 # 允许访问 Rsync 服务器IP(IP白名单)
read only = false
path = /data # 数据挂载目录
comment = /data directory
auth users = username # 认证用户
secrets file = /etc/rsyncd.secrets # 认证密码
root@64d9869fa91e:/# cat /etc/rsyncd.secrets # 密码文件
username:password # 密码文件格式
服务器端计划任务
因为我们不可能一直保存客户端备份过来的数据,一般会设置一个定时任务,删除多少天以前的数据,所以这里设置一个定时任务删除 90 天以前的数据。
# 创建清理 Rsync 备份脚本
cat > /root/del_rsync_backup.sh << \EOF
# 定义要清理 Rsync 备份目录
Rsync_DIR="/SSD/Demo/rsync-server/data/"
# 删除超过90天的备份
find "$Rsync_DIR" -type f -name "*.tar.bz2" -mtime +90 -exec rm -f {} \;
EOF
# 设置可执行权限
chmod +x /root/del_rsync_backup.sh
# 配置计划任务
crontab -l
0 7 * * * /root/del_rsync_backup.sh > /dev/null 2>&1 &
这里详细解释一下 find "$Rsync_DIR" -type f -name "*.tar.bz2" -mtime +90 -exec rm -f {} \;
命令,这条命令用于在 Unix 或类 Unix 系统中查找并删除特定目录下所有 90 天前的 .tar.bz2
压缩文件。下面是命令各部分的详细解释:
find
: 这是一个常用的命令行工具,用于在文件系统中搜索符合条件的文件和目录。"$Rsync_DIR"
: 这是一个变量,用于存储您要搜索的目录的路径。假设这个变量已经被定义并包含了正确的路径。-type f
: 这个选项告诉find
命令只搜索文件(file),而不是目录或其他类型的文件系统对象。-name "*.tar.bz2"
: 这个选项指定搜索的文件名模式。在这里,它会匹配所有以.tar.bz2
结尾的文件。-mtime +90
: 这个选项用于匹配文件修改时间。+90
表示搜索最后修改时间在 90 天之前的文件。-exec rm -f {} \;
: 这个选项告诉find
命令对每个匹配到的文件执行后续的命令。在这里,执行的命令是rm -f
,它用于强制删除文件而不提示确认。花括号是一个占位符,对于每个匹配的文件,
find
命令都会将这个占位符替换为文件的路径。\;
是一个终结符,用于告诉find
命令-exec
参数到此结束。
综上所述,整条命令的作用是:在 $Rsync_DIR
目录(以及其子目录)中查找所有 90 天前的 .tar.bz2
文件,并将它们删除。
Rsync Client 配置
客户端配置,因为我们这里是备份 wordpress 页面代码和数据库,所以需要在 Web 服务器端配置。涉及数据库备份,会引用到另外两个新命令 mysqldump
和 gzip
,在下面的 shell 脚本中会一一说明其作用。
cat > /root/backup_wordpress.sh << \EOF
#!/bin/bash
DBUSER="xxx"
DBPASS="xxx"
DBNAME="xxx"
# 备份数据库
DBFILE=${DBNAME}-`date +\%Y\%m\%d\%H\%M\%S`.sql.gz
# 因为我们的数据库部署在 Docker 中,所以这条命令通过 docker exec 进入容器备份,备份目录: /bitnami/mariadb/ 为单独挂载宿主机目录
docker exec <容器ID> bash -c "mysqldump -u${DBUSER} -p\"${DBPASS}\" ${DBNAME} | gzip > /bitnami/mariadb/${DBFILE}"
# 备份配置文件 Wordpress 代码
FILEBAK=DockerConfig-`date +\%Y\%m\%d\%H\%M\%S`.tar.bz2
tar -cjvf /root/${FILEBAK} /root/DockerConfig
# 备份同步
export RSYNC_PASSWORD='d8c4b9aadufyedf9cbd#5091830bf004'
rsync -av --progress /root/${FILEBAK} rsync://[email protected]:873/volume/
unset RSYNC_PASSWORD
# 删除服务器端数据库备份
rm -rf /root/DockerConfig/rockylinux/mariadb_data/*.tar.bz2
rm -rf /root/${FILEBAK}
EOF
# 设置可执行权限
chmod +x /root/backup_wordpress.sh
关于在使用 tar
命令进行备份时,选择哪种级别的压缩,这里我们详细说一下,因为我们会将数据同步至其它服务器,如果压缩包过大,可能同步的时候周期会比较长,如果压缩率过高,又有可能影响服务器本身性能,所以在进行压缩备份的时候,我们需要综合考虑自身实际情况。您可以启用高压缩选项以减少生成的备份文件大小。tar
命令通常与压缩工具结合使用,例如 gzip、bzip2、xz 等,每种工具都提供了不同级别的压缩效率。
- 使用 gzip 压缩(常规压缩),使用
tar -czvf
选项启用 gzip 压缩。 - 使用 bzip2 压缩(更高的压缩率),使用
tar -cjvf
选项启用 bzip2 压缩。 - 使用 xz 压缩(通常提供最高的压缩率),使用
tar -cJvf
选项启用 xz 压缩。
需要注意,高压缩率通常会导致更高的 CPU 使用率和更长的压缩时间。如果您备份的数据量很大,或者您的服务器资源有限,可能需要权衡压缩时间和文件大小。如果您想要在压缩过程中使用 xz 压缩且希望使用最高压缩率,您可以这样做:
tar -cJvf --options='xz:compression-level=9' backup.tar.xz /data
其中 --options='xz:compression-level=9'
告诉 tar
命令使用 xz 压缩的最高压缩级别(9)。这会花费更多的时间和 CPU 资源,但通常会得到更小的文件。选择哪种压缩工具以及压缩级别取决于您的具体需求,包括备份文件大小、压缩时间、CPU 使用率和存储成本。
客户端计划任务
将上述的脚本,配置成定时任务。
# crontab -l 查看
# crontab -e 编辑
crontab -l
0 6 * * * /root/backup_wordpress.sh > /dev/null 2>&1 &
刚好有群友提问到 > /dev/null 2>&1 &
作用,这里详细解释一下。/dev/null 2>&1 &
是一种重定向表达式,用来处理命令的输出。这个表达式通常添加在 cron 作业的命令行末尾,以确保命令的标准输出(stdout)和标准错误输出(stderr)不会发送邮件给用户或记录到日志中。下面是这个表达式各部分的详细解释:
- /dev/null:这是一个特殊的设备文件,用作数据的"黑洞"。写入到
/dev/null
的任何内容都会被丢弃,读取/dev/null
会立即返回文件结束(EOF)。当您不希望保留命令的输出时,可以将输出重定向到/dev/null
。 - 2>&1:这是 shell 的另一种重定向方式。
2
表示标准错误(Standard Error,简称 stderr),1
表示标准输出(Standard Output,简称 stdout),0
表示标准输入(Standard Input,简称 stdin)。2>&1
表示将标准错误重定向到标准输出的当前位置。由于标准输出已经被重定向到/dev/null
,这意味着标准错误也会被重定向到/dev/null
。将这两部分组合起来,> /dev/null 2>&1
的意思是将标准输出重定向到/dev/null
,然后将标准错误也重定向到与标准输出相同的位置(即/dev/null
)。这样,无论标准输出还是标准错误产生的任何内容都会被丢弃。 - &:放在命令末尾的单独的
&
字符是告诉 shell 在后台执行该命令。这意味着命令将会在一个子进程中运行,而不会阻塞当前的 shell 或终端。您可以继续在同一个 shell 中执行其他命令,而后台命令将独立运行。
在 crontab 作业中使用这种重定向通常是为了避免产生邮件通知。默认情况下,如果 cron 作业有输出,cron 守护进程会尝试将这些输出通过邮件发送给用户。通过将输出重定向到 /dev/null
,可以防止这种邮件发送行为。这种方式在编写脚本或设置 cron 作业时很常见,尤其是当您想要静默运行命令,不关心输出结果时。
参考文献
后述
随着我们对 rsync 的介绍画上句号,您可能已经注意到,最近木子的精力主要集中在撰写《Rocky Linux 9.3 从入门到精通》电子书上。因此,DIY NAS 系列文章的更新可能会更加随性,不过,我们始终欢迎群友的投稿,并承诺会持续发表这些内容。尽管更新的步伐可能会稍显缓慢,但我们依然期待和珍视每一位读者的理解和支持。感谢大家的关注和耐心,让我们共同期待每一篇精彩内容的到来。