Rsync同步(旧Nas数据传输至新Nas数据)

本文为博主独立完成的原创技术文档,首发于个人博客。
转载须知:
✅ 欢迎分享本文链接至技术群、朋友圈
✅ 个人收藏、学习使用不限
❌ 严禁洗稿、抄袭,或未经授权的商业转载/汇编
📩 如需转载至其他平台,请私信联系博主获取授权

作者:赵俊杰

一.概述介绍

采用rsync工具对源NFS目录和目标NFS目录进行同步操作。日志中将详细记录rsync的执行结果、同步时间以及同步的文件数量等信息。同时,我们将编写rsync同步脚本,并将其配置在系统的定时任务中,确保每日凌晨1:20自动执行同步操作,以实现数据同步的自动化管理。
源目录:

/data/bizservicefile
/data/exchange/ftpsrv/bizconn/BIZ01
/data/secops
/data/formconf
/data/workfile/svc-a
/data/workfile/svc-calc/calcresult/output/2025
/data/workfile/svc-gateway/from_unifiedgate
/data/workfile/svc-userorg
/data/workfile/web/bizsubmitfiles
/data/workfile/web/commonbizfile
/data/workfile/web/proc-hold01
/data/workfile/web/proc-hold02
/data/workfile/web/proc-hold03
/data/workfile/web/svc-fin
/data/workfile/web/notifyfiles
/data/workfile/web/extern-channel
/data/workfile/web/proc-arch-sh
/data/workfile/web/node-szbranch

注意:以上目录为业务站点相关存储目录,已完成目录名称脱敏转换,对原始路径业务语义进行了屏蔽处理,无法通过目录名直接识别出业务核心含义。如果用到rsync技术,可以将目录替换为自己的需求目录即可。
目标目录:

/newdata/bizservicefile
/newdata/exchange/ftpsrv/bizconn/BIZ01
/newdata/secops
/newdata/formconf
/newdata/workfile/svc-a
/newdata/workfile/svc-calc/calcresult/output/2025
/newdata/workfile/svc-gateway/from_unifiedgate
/newdata/workfile/svc-userorg
/newdata/workfile/web/bizsubmitfiles
/newdata/workfile/web/commonbizfile
/newdata/workfile/web/proc-hold01
/newdata/workfile/web/proc-hold02
/newdata/workfile/web/proc-hold03
/newdata/workfile/web/svc-fin
/newdata/workfile/web/notifyfiles
/newdata/workfile/web/extern-channel
/newdata/workfile/web/proc-arch-sh
/newdata/workfile/web/node-szbranch

二.脚本撰写

创建目标目录,命名为:setup_directory_permissions_goal_dir.sh,内容如下:

#!/bin/bash
# 功能说明:批量创建业务脱敏后的存储目录并配置权限及属主属组。预先通过数组定义每一个目录的路径、数字权限、所有者:用户组;遍历数组配置项,使用mkdir -p递归创建多级目录,目录创建失败脚本直接退出;拆分解析所有者与用户组信息,执行chown修改目录归属,再执行chmod配置目录权限;全部目录处理完毕后输出完成提示。
# 定义目录权限配置(格式:路径 权限 所有者:组)
directories=(
"/newdata/bizservicefile 755 root:root"
"/newdata 777 root:root"
"/newdata/exchange 755 root:root"
"/newdata/exchange/ftpsrv 755 514:511"
"/newdata/exchange/ftpsrv/bizconn/BIZ01 755 514:511"
"/newdata/secops 777 root:root"
"/newdata/formconf 755 root:root"
"/newdata/workfile 777 root:root"
"/newdata/workfile/svc-a 755 root:root"
"/newdata/workfile/svc-calc 755 root:root"
"/newdata/workfile/svc-calc/calcresult 755 root:root"
"/newdata/workfile/svc-calc/calcresult/output 2755 pop:root"
"/newdata/workfile/svc-calc/calcresult/output/2025 2755 pop:root"
"/newdata/workfile/svc-gateway/from_unifiedgate 2770 uapftpuser:pop"
"/newdata/workfile/svc-gateway 775 uapftpuser:ftpuser"
"/newdata/workfile/svc-userorg 755 root:root"
"/newdata/workfile/web/bizsubmitfiles 755 root:root"
"/newdata/workfile/web 755 root:root"
"/newdata/workfile/web/commonbizfile 755 root:root"
"/newdata/workfile/web/proc-hold01 2770 519:pop"
"/newdata/workfile/web/proc-hold02 770 519:ftpuser"
"/newdata/workfile/web/proc-hold03 770 519:ftpuser"
"/newdata/workfile/web/svc-fin 755 root:root"
"/newdata/workfile/web/notifyfiles 755 root:root"
"/newdata/workfile/web/extern-channel 777 root:root"
"/newdata/workfile/web/proc-arch-sh 2770 shftpuser:pop"
"/newdata/workfile/web/node-szbranch 777 root:root"
)
# 执行创建和权限设置
for conf in "${directories[@]}"; do
    IFS=' ' read -r path perm owner_group <<< "$conf"
    mkdir -p "$path" || { echo "错误:创建目录 $path 失败" && exit 1; }
    # 解析所有者和组
    owner=$(echo "$owner_group" | cut -d: -f1)
    group=$(echo "$owner_group" | cut -d: -f2)
    chown "$owner:$group" "$path"
    # 设置权限(支持数字和符号模式)
    chmod "$perm" "$path"
done
echo "所有目录创建及权限设置完成"

运行创建目录脚本:

chmod +x  setup_directory_permissions_goal_dir.sh
sh setup_directory_permissions_goal_dir.sh

编写同步脚本:

#脚本功能:读取目录清单文件,循环使用 rsync 批量将旧业务存储目录同步至新业务存储目录;脚本记录起止时间、同步文件统计信息,输出控制台与日志文件;同步完成后将本次同步汇总信息调用 API 推送告警通知。
#!/bin/bash
# 定义脚本开始时间戳,用于记录整体执行时间
START_TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
START_TIME=$(date +%s)
# 获取当前日期,用于生成日志文件名
CURRENT_DATE=$(date +"%Y-%m-%d")
# 配置源目录列表文件路径,需根据实际情况修改
SOURCE_LIST_FILE="/opt/NAS_Rsync/copy-directory.txt"
# 配置目标基础目录,需根据实际情况修改
DEST_BASE_DIR="/newdata"
# 配置日志文件路径,需根据实际情况修改
LOG_FILE="/opt/nfs_rsync/rsync_${CURRENT_DATE}.logs"
# 日志记录函数,用于将信息写入日志文件并输出到控制台
log() {
    local message="$1"
    local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp - $message" | tee -a "$LOG_FILE"
}
# 检查源目录列表文件是否存在
if [ ! -f "$SOURCE_LIST_FILE" ]; then
    log "源目录列表文件 $SOURCE_LIST_FILE 不存在,请检查路径。"
    exit 1
fi
# 初始化总文件数、成功同步文件数和失败同步文件数
TOTAL_FILES=0
SUCCESS_FILES=0
FAILED_FILES=0
# 逐行读取源目录列表文件
while IFS= read -r source_dir; do
    # 构建目标目录
    relative_path="${source_dir#/data}"
    dest_dir="$DEST_BASE_DIR$relative_path"
    # 创建目标目录(如果不存在)
    #mkdir -p "$dest_dir"
    log "开始同步 $source_dir 到 $dest_dir"
    # 执行 rsync 同步并将输出记录到日志
RSYNC_OUTPUT=$(rsync -avzc --delete "$source_dir/" "$dest_dir/")
# -a , --archive: 归档模式,表示递归传输并保持文件属性(如权限、时间戳等)。相当于 -rlptgoD
#,但不保留硬链接 (-H)。
# -v,-verbose: 详细输出模式,显示同步过程中的详细信息
# -z--compress: 在传输过程中压缩文件数据,减少传输量,适用于带宽有限的情况
# -c--checksum: 使用校验和来检测文件变化,而不是依赖文件大小和时间戳。这会增加计算开销,但
#能更准确地判断文件是否更改
    RSYNC_STATUS=$?
    if [ $RSYNC_STATUS -eq 0 ]; then
        log "成功同步 $source_dir 到 $dest_dir"
        log "$RSYNC_OUTPUT"
        # 统计同步的文件数量
        FILE_COUNT=$(find "$source_dir" -type f | wc -l)
        TOTAL_FILES=$((TOTAL_FILES + FILE_COUNT))
        SUCCESS_FILES=$((SUCCESS_FILES + FILE_COUNT))
    else
        log "同步 $source_dir 到 $dest_dir 失败,错误信息:$RSYNC_OUTPUT"
        # 统计失败的文件数量
        FILE_COUNT=$(find "$source_dir" -type f | wc -l)
        TOTAL_FILES=$((TOTAL_FILES + FILE_COUNT))
        FAILED_FILES=$((FAILED_FILES + FILE_COUNT))
    fi
done < "$SOURCE_LIST_FILE"
# 记录脚本结束时间戳
END_TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
END_TIME=$(date +%s)
# 计算执行时间
EXECUTION_TIME=$((END_TIME - START_TIME))
# 记录总执行信息到日志
log "脚本开始时间: $START_TIMESTAMP"
log "脚本结束时间: $END_TIMESTAMP"
log "总同步文件数量: $TOTAL_FILES"
log "同步成功文件数量: $SUCCESS_FILES"
log "同步失败文件数量: $FAILED_FILES"
log "总执行时间: $EXECUTION_TIME 秒"
# 格式化开始时间和结束时间为 ISO 8601 格式
START_TIME_ISO=$(date -d "$START_TIMESTAMP" +"%Y-%m-%dT%H:%M:%S.%3NZ")
END_TIME_ISO="0001-01-01T00:00:00Z"
# 发送同步信息到 API
API_RESPONSE=$(curl -X POST "http://10.0.0.99:8800/pop-alert-webhook/general/send/hg6g3JA6uxB3WnZe3c8cAtFzkGYHJKHdajlsahu8tvTsaLbZ47aaangf" -H "accept: */*" -H "Content-Type: application/json" -d "{
    \"systemName\": \"WZ_UUMS\",
    \"host\": \"pop-dbs-ftp\",
    \"label\": \"NAS_SYNC\",
    \"alerts\": [
        {
            \"id\": \"20221024140000\",
            \"status\": \"firing\",
            \"alertName\": \"NAS_SYNC_REPORT\",
            \"instance\": \"10.129.67.207\",
            \"severity\": \"info\",
            \"message\": \"数据已经同步完毕。开始时间: $START_TIMESTAMP, 结束时间: $END_TIMESTAMP, 总同步文件数量: $TOTAL_FILES, 同步成功文件数量: $SUCCESS_FILES, 同步失败文件数量: $FAILED_FILES, 总执行时间: $EXECUTION_TIME 秒\",
            \"startsAt\": \"$START_TIME_ISO\",
            \"endsAt\": \"$END_TIME_ISO\"
        }
    ]
}")
log "API 响应: $API_RESPONSE"

编写拷贝目录的文件内容,名称为copy-directory.txt,内容如下:

/data/bizservicefile
/data/exchange/ftpsrv/bizconn/BIZ01
/data/secops
/data/formconf
/data/workfile/svc-a
/data/workfile/svc-calc/calcresult/output/2025
/data/workfile/svc-gateway/from_unifiedgate
/data/workfile/svc-userorg
/data/workfile/web/bizsubmitfiles
/data/workfile/web/commonbizfile
/data/workfile/web/proc-hold01
/data/workfile/web/proc-hold02
/data/workfile/web/proc-hold03
/data/workfile/web/svc-fin
/data/workfile/web/notifyfiles
/data/workfile/web/extern-channel
/data/workfile/web/proc-arch-sh
/data/workfile/web/node-szbranch

三.将脚本加入定时任务

root用户在/etc/crontab最后一行加上以下内容:

20 01 * * * root sh /opt/NAS_Rsync/rsync.sh  &>/dev/null

内容含义:
该配置为系统 crontab 定时任务,每日凌晨 01:20 以 root 用户执行目录同步脚本 rsync.sh,将脚本控制台输出与错误全部重定向至空设备,丢弃任务运行的屏幕输出,脚本内部业务日志仍正常落盘。

慢慢来,不必急于活成别人期待的模样,你按自己的节奏走,就已经很好。

posted @ 2026-09-21 15:57  超级喜欢下雨天  阅读(6)  评论(0)    收藏  举报