DIY NAS系列30 — 数据同步备份服务之 Rsync Server
本文最后更新于 287 天前,其中的信息可能已经有所发展或是发生改变。

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 服务器端配置。涉及数据库备份,会引用到另外两个新命令 mysqldumpgzip,在下面的 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 等,每种工具都提供了不同级别的压缩效率。

  1. 使用 gzip 压缩(常规压缩),使用 tar -czvf 选项启用 gzip 压缩。
  2. 使用 bzip2 压缩(更高的压缩率),使用 tar -cjvf 选项启用 bzip2 压缩。
  3. 使用 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)不会发送邮件给用户或记录到日志中。下面是这个表达式各部分的详细解释:

  1. /dev/null:这是一个特殊的设备文件,用作数据的"黑洞"。写入到 /dev/null 的任何内容都会被丢弃,读取 /dev/null 会立即返回文件结束(EOF)。当您不希望保留命令的输出时,可以将输出重定向到 /dev/null
  2. 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)。这样,无论标准输出还是标准错误产生的任何内容都会被丢弃。
  3. &:放在命令末尾的单独的 & 字符是告诉 shell 在后台执行该命令。这意味着命令将会在一个子进程中运行,而不会阻塞当前的 shell 或终端。您可以继续在同一个 shell 中执行其他命令,而后台命令将独立运行。

在 crontab 作业中使用这种重定向通常是为了避免产生邮件通知。默认情况下,如果 cron 作业有输出,cron 守护进程会尝试将这些输出通过邮件发送给用户。通过将输出重定向到 /dev/null,可以防止这种邮件发送行为。这种方式在编写脚本或设置 cron 作业时很常见,尤其是当您想要静默运行命令,不关心输出结果时。

参考文献

[1] Docker Rsync Server

后述

随着我们对 rsync 的介绍画上句号,您可能已经注意到,最近木子的精力主要集中在撰写《Rocky Linux 9.3 从入门到精通》电子书上。因此,DIY NAS 系列文章的更新可能会更加随性,不过,我们始终欢迎群友的投稿,并承诺会持续发表这些内容。尽管更新的步伐可能会稍显缓慢,但我们依然期待和珍视每一位读者的理解和支持。感谢大家的关注和耐心,让我们共同期待每一篇精彩内容的到来。

Avatar photo

关于 木子

Founder of the Rocky Linux Chinese community, MVP、VMware vExpert、TVP, advocate for cloud native technologies, with over ten years of experience in site reliability engineering (SRE) and the DevOps field. Passionate about Cloud Computing、Microservices、CI&CD、DevOps、Kubernetes, currently dedicated to promoting and implementing Rocky Linux in Chinese-speaking regions.
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇