简介

Rsync(Remote Synchronization)是一个非常强大的工具,它允许您进行快速的文件同步,通常用于备份和镜像。Rsync 服务器就是运行了 rsync 守护进程的服务器,使得其他机器可以通过 rsync 协议与之通信并同步文件。

  • Rsync 的优势在于它使用了一种增量传输技术,这意味着当目标位置已经有一个较早版本的文件时,rsync 会仅传输改变了的部分。这种方法不仅速度快,而且节约带宽。
  • Rsync 服务器配置灵活,您可以设置为匿名访问或者基于用户认证,还可以通过 SSH 进行加密传输,增加数据传输的安全性。
  • 它同时支持推(push)和拉(pull)两种同步模式,可以非常方便的从一个中心点同步数据到多个目的地,或者将数据从多个源头汇总到一个中心服务器。
  • Rsync 的使用场景非常广泛,从普通的文件备份到网站的镜像,再到大规模的数据分发,其稳定性和高效性都得到了广泛的认可。
  • 在 Linux 和 Unix 系统中,rsync 几乎是标准配置,而在 Windows 系统中,也有多种方式可以使用 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 命令对每个匹配到的文件执行后续的命令。花括号 是一个占位符,对于每个匹配的文件,find 命令都会将这个占位符替换为文件的路径。\; 是一个终结符,用于告诉 find 命令 -exec 参数到此结束。 

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://superadminjia@sync.rockylinux.cn: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 & 是一种重定向表达式,用来处理命令的输出。这个表达式通常添加在 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,可以防止这种邮件发送行为。

  • 无标签
写评论...