服务器上数据定时同步到网络磁盘

背景:由于权限问题无法将网络磁盘直接挂载到HPC上,但是可以挂载到本地,解决思路是通过rsyncd进行同步,每次同步的时候都将网络磁盘挂载到本地。我想把服务器上/home/s222552331/LUTO2_XH/Custom_runs/下的文件同步到网络磁盘的z/LUF-Modelling/LUTO2_XH/LUTO2/output

一、Window本地操作

1. 下载并安装cwRsyncServer

下载地址:https://github.com/foxuc/Windows/releases/
安装到:C:\Program Files (x86)\ICW可任意更改

2. 配置本地Rsync

a.编写配置文件

rsyncd.conf内容

port = 端口号
use chroot = false
strict modes = false
hosts allow = *
log file = C:/Program Files (x86)/ICW/rsyncd.log
uid = 0
gid = 0

[luto]
path = /cygdrive/z/LUF-Modelling/LUTO2_XH/LUTO2/output
read only = false
transfer logging = yes
auth users = ruser
secrets file = C:/Program Files (x86)/ICW/rsyncd.secrets

说明:

  • port = Rsync服务使用的端口号。
  • use chroot = false:是否使用chroot,设置为false表示不使用chroot。
  • strict modes = false:严格模式设置,设置为false表示不检查文件权限。
  • hosts allow = :允许连接的主机,可以使用IP地址或主机名,表示允许所有主机。
  • log file = C:/Program Files (x86)/ICW/rsyncd.log:日志文件路径。
  • uid = 0:运行Rsync服务的用户ID,0表示root用户。
  • gid = 0:运行Rsync服务的组ID,0表示root组。
  • [luto]:共享模块名称。
  • path = /cygdrive/z/LUF-Modelling/LUTO2_XH/LUTO2/output:共享目录路径。
  • read only = false:设置为false表示允许写操作。
  • transfer logging = yes:是否记录传输日志。
  • auth users = ruser:授权用户列表,多个用户用逗号分隔。
  • secrets file = C:/Program Files (x86)/ICW/rsyncd.secrets:认证用户的密码文件路径。内容为ruser:密码

b. 编写挂载磁盘并启动Rsync的脚本并开启端口

start_rsync.bat内容:

net use 网络磁盘ip /user:用户名 密码
"C:\Program Files (x86)\ICW\bin\rsync.exe" --daemon --config="C:\Program Files (x86)\ICW\rsyncd.conf"
netsh advfirewall firewall add rule name="Open Port 端口号" dir=in action=allow protocol=TCP localport=端口号
echo

说明:

  • net use z: \网络磁盘ip\共享文件夹 /user:用户名 密码:挂载网络磁盘到本地Z盘。
  • "C:\Program Files (x86)\ICW\bin\rsync.exe" --daemon --config="C:\Program Files (x86)\ICW\rsyncd.conf":启动Rsync服务。
  • 可以将该脚本设置为开机自动运行

二、HPC服务器上操作

0. 安装rsync

一般HPC上都带的有,如果没有需要自己安装,无安装权限需联系管理员
(安装方法)

sudo apt-get install rsync  # 对于Ubuntu
# 或
sudo yum install rsync  # 对于CentOS

1. 创建同步脚本

sync_files.sh内容:

#!/bin/bash

# 定义日志文件及其备份目录
LOG_FILE="/home/s222552331/rsync/rsync_log.txt"
BACKUP_DIR="/home/s222552331/rsync/backup_logs"
MAX_LOG_DAYS=7

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR

# 检查日志文件是否存在并且超过 MAX_LOG_DAYS 天
if [ -f $LOG_FILE ]; then
    LOG_FILE_AGE=$(find $LOG_FILE -mtime +$MAX_LOG_DAYS)
    if [ ! -z "$LOG_FILE_AGE" ]; then
        TIMESTAMP=$(date +%Y%m%d%H%M%S)
        mv $LOG_FILE $BACKUP_DIR/rsync_log_$TIMESTAMP.txt
    fi
fi

# 使用 flock 确保脚本的唯一实例
exec 200>/var/lock/sync_files.lock || exit 1
flock -n 200 || exit 1

# 定义上次同步的时间标记文件
LAST_SYNC_FILE="/home/s222552331/rsync/last_sync_time.txt"

# 如果上次同步时间标记文件不存在,创建它并设置为一个很早的时间
if [ ! -f $LAST_SYNC_FILE ]; then
    echo "1970-01-01 00:00:00" > $LAST_SYNC_FILE
fi

# 读取上次同步时间
LAST_SYNC_TIME=$(cat $LAST_SYNC_FILE)

# 日志开始时间
echo "Sync started at: $(date)" >> $LOG_FILE

# 查找自上次同步以来修改或新增的文件,并生成相对路径的文件列表
find /home/s222552331/LUTO2_XH/Custom_runs/ -type f -newermt "$LAST_SYNC_TIME" | sed 's|^/home/s222552331/LUTO2_XH/Custom_runs/||' > /home/s222552331/rsync/file_list.txt

# 同步文件,日志中只记录传输的文件
rsync -av --files-from=/home/s222552331/rsync/file_list.txt --relative --progress --port=8873 --password-file=/home/s222552331/rsync/rsync_password --log-file=$LOG_FILE /home/s222552331/LUTO2_XH/Custom_runs/ ruser@10.148.155.15::luto

# 检查 rsync 命令的退出状态
if [ $? -eq 0 ]; then
    # 如果 rsync 成功,更新上次同步时间到当前时间
    date '+%Y-%m-%d %H:%M:%S' > $LAST_SYNC_FILE
    echo "Sync finished at: $(date)" >> $LOG_FILE
else
    # 如果 rsync 失败,记录错误信息但不更新上次同步时间
    echo "Sync failed at: $(date)" >> $LOG_FILE
fi

说明:
sync_files.sh脚本首先定义了日志文件及其备份目录,然后创建备份目录(如果不存在)。接下来,检查日志文件是否存在且超过最大保存天数(7天),如果是,则将其备份。使用 flock 命令确保脚本的唯一实例运行,防止多个同步进程同时运行导致冲突。定义并读取上次同步的时间标记文件,如果文件不存在,则创建并设置为一个很早的时间(1970年)。记录同步开始时间,查找自上次同步以来修改或新增的文件,并生成相对路径的文件列表。使用 rsync 命令同步文件,记录传输的文件到日志文件。最后,检查 rsync 命令的退出状态,如果成功,更新上次同步时间到当前时间;如果失败,记录错误信息但不更新上次同步时间。

  • LOG_FILE="/home/s222552331/rsync/rsync_log.txt":定义日志文件路径。
  • BACKUP_DIR="/home/s222552331/rsync/backup_logs":定义日志文件备份目录。
  • MAX_LOG_DAYS=7:日志文件保存的最大天数。
  • mkdir -p $BACKUP_DIR:创建备份目录(如果不存在)。
  • 检查日志文件是否存在并且超过 MAX_LOG_DAYS 天。
  • 使用 flock 确保脚本的唯一实例。(定时运行可能会上一次同步位完成下一次同步开始)
  • 定义上次同步的时间标记文件 LAST_SYNC_FILE。
  • 如果上次同步时间标记文件不存在,创建它并设置为一个很早的时间。
  • 读取上次同步时间 LAST_SYNC_TIME。
  • 查找自上次同步以来修改或新增的文件,并生成相对路径的文件列表。
  • 同步文件,日志中只记录传输的文件。
  • rsync_password文件自己创建,内写windoew上rsyncd.secrets中的密码
  • 检查 rsync 命令的退出状态,如果成功,更新上次同步时间到当前时间;如果失败,记录错误信息但不更新上次同步时间。

2.定期运行脚本

编辑crontab文件:
crontab -e
添加以下内容以每小时运行一次同步脚本:
0 * * * * /home/s222552331/rsync/sync_files.sh

posted @ 2024-07-16 18:15  skypanxh  阅读(12)  评论(0编辑  收藏  举报