使用 rsync 定时自动备份数据

Author Avatar
青枫 2023年12月12日
  • 在其它设备中阅读本文章

使用场景:防止 VPS 商家跑路丢失数据,使用 rsync 备份数据到多台 VPS 做异地备份

不要把数据放在同一个服务器上 —— 我说的 :)

1. 安装 rsync

在进行 rsync 备份之前,首先需要确保所有存储备份的服务器系统上都安装了 rsync。

如果未安装,可以使用以下命令进行安装:

apt update && apt install rsync

2. 设置 SSH 密钥认证

设置 SSH 密钥认证,确保脚本可以在没有手动输入密码的情况下连接到目标服务器

在本地机器上生成 SSH 密钥对:

ssh-keygen -t rsa -b 2048

将公钥复制到目标服务器 (存储备份的服务器都要复制):

ssh-copy-id [user]@[hostname]

注意:ssh-copy-id 默认使用 SSH 的默认端口 22,但如果你的 SSH 服务器监听在不同的端口上(例如 50722),你需要明确指定端口号。

ssh-copy-id -p 50722 [user]@[hostname]

[user] 是目标服务器上的用户名,[hostname] 是服务器的主机名或 IP 地址。这将在目标服务器上的 ~/.ssh/authorized_keys 文件中添加你的公钥,从而实现无密码连接。

3. 创建备份脚本

vim /root/data_backup.sh

填入下面的脚本并根据实际情况修改

#!/bin/bash

set -e  # 在发生错误时立即退出

SOURCE_DIR="/www/data"
LOG_DIR="/root/backup_logs"

# 目标服务器列表,包括用户名、主机、端口和目标路径
DESTINATION_SERVERS=(
    "root@1.1.1.1:22:/root/my_backup"
    "root@2.2.2.2:50666:/root/my_backup"
    "root@3.3.3.3:50767:/root/my_backup"
)

TIMESTAMP=$(date +"%Y%m%d%H%M%S")

# 备份函数,接受目标服务器信息作为参数
backup_to_destination() {
    local DESTINATION_SERVER="$1"
    local USER=$(echo "$DESTINATION_SERVER" | awk -F'[@:]' '{print $1}')
    local HOST=$(echo "$DESTINATION_SERVER" | awk -F'[@:]' '{print $2}')
    local PORT=$(echo "$DESTINATION_SERVER" | awk -F'[@:]' '{print $3}')
    local DEST_PATH=$(echo "$DESTINATION_SERVER" | awk -F':' '{print $NF}')
    
    local LOG_FILE="$LOG_DIR/backup_${HOST}_$TIMESTAMP.log"

    echo "处理目标服务器: $DESTINATION_SERVER"

    # 使用rsync命令进行备份,通过ssh连接到目标服务器
    rsync -avz --delete -e "ssh -p $PORT" "$SOURCE_DIR" "$USER@$HOST:$DEST_PATH" >> "$LOG_FILE" 2>&1

    # 检查 rsync 命令的退出状态
    if [ $? -eq 0 ]; then
        echo "向 $HOST 备份成功。日志文件: $LOG_FILE"
    else
        echo "向 $HOST 备份失败。查看 $LOG_FILE 获取详细信息。"
        # 添加通知机制(例如发送电子邮件)在这里
    fi
}

# 遍历目标服务器列表,并执行备份函数
for DESTINATION_SERVER in "${DESTINATION_SERVERS[@]}"; do
    backup_to_destination "$DESTINATION_SERVER"
done

SOURCE_DIR 是要备份的文件夹也就是源目录

DESTINATION_SERVER 是一个包含多个目标服务器的数组,数据将会备份到所有目标服务器的 /root/my_backup

LOG_FILE 是脚本记录日志文件的路径

关于 rsync 命令的 --delete 参数

在 rsync 命令中,--delete 参数用于删除目标目录中不存在于源目录中的文件。这是为了确保目标目录是源目录的精确镜像。使用此参数时要小心,以免误删除文件。在脚本中的示例中,--delete 用于确保备份目标与源保持同步,即删除目标目录中没有的文件。

4. 定时自动备份

编辑 crontab 文件,添加一行来定期运行你的备份脚本。运行以下命令编辑 crontab:

crontab -e

在打开的编辑器中,添加类似于以下内容的行:

0 4 * * * /root/data_backup.sh

上述行表示每天凌晨 4 点执行一次脚本。你可以根据需求调整时间。保存并退出编辑器。