在远程服务器和本地同步数据的指南

在远程服务器和本地同步数据的指南

在现代软件开发和数据管理中,保持本地和远程服务器之间的数据同步是至关重要的。无论是代码、配置文件还是其他数据,确保它们在不同环境中的一致性都是高效工作的关键。本文将介绍如何使用 Bash 脚本和 rsync 工具在本地和远程服务器之间同步数据,重点讲解两种同步方式:直接同步和通过跳板机同步。

背景

在许多开发和运维场景中,数据的同步是常见需求。不同的同步方式适用于不同的环境和安全要求。选择合适的同步方式可以提高效率并确保数据安全。

  • 直接同步:适用于可以直接访问目标服务器的情况,通常在同一局域网内或目标服务器的网络配置允许直接连接时使用。
  • 通过跳板机同步:适用于需要通过中间服务器(跳板机)访问目标服务器的情况。这种方式通常用于安全性较高的环境,能够限制对内部网络的直接访问。
    我们定义了两个同步目录:
LOCAL_DIR_DEEPNS="/path/to/local/deepns/"
REMOTE_DIR_DEEPNS="user@192.168.1.10:~/path/to/remote/deepns/"

LOCAL_DIR_MRAUTOINSPECT="/path/to/local/MR-autoinspect/"
REMOTE_DIR_MRAUTOINSPECT="user@192.168.1.20:/path/to/remote/MR-autoinspect/"

在这个网络环境中,存在以下互通关系:

  • 本地机器与 192.168.1.10 互通:这意味着本地机器可以直接访问 192.168.1.10,并与其进行数据传输。
  • 192.168.1.10192.168.1.20 互通:这表示 192.168.1.10 可以访问 192.168.1.20,并与其进行数据交换。
  • 本地机器无法直接访问 192.168.1.20:这意味着本地机器不能直接与 192.168.1.20 进行通信,无法直接同步数据。
    因此,在同步操作中,我们使用直接同步的方式将本地的 deepns 目录与 192.168.1.10 进行同步,而对于 MR-autoinspect 目录的同步,则需要通过 192.168.1.10 作为跳板机来访问 192.168.1.20。这种设置确保了数据的安全性和网络的合理配置,同时也提供了灵活的同步方式。

使用 rsync 工具进行数据同步

rsync 是一个强大的文件传输和同步工具,能够高效地将文件和目录从一个位置复制到另一个位置。它支持增量备份,只传输变化的部分,从而节省带宽和时间。

完整脚本示意

以下是一个用于同步数据的 Bash 脚本示例。该脚本定义了多个目录,并提供了两种同步方式:直接同步和通过跳板机进行同步。

#!/bin/bash

# 定义源目录和目标目录
#!/bin/bash

# 定义源目录和目标目录
LOCAL_DIR_DEEPNS="/path/to/local/deepns/"
REMOTE_DIR_DEEPNS="user@192.168.1.10:~/path/to/remote/deepns/"

LOCAL_DIR_MRAUTOINSPECT="/path/to/local/MR-autoinspect/"
REMOTE_DIR_MRAUTOINSPECT="user@192.168.1.20:/path/to/remote/MR-autoinspect/"

# 定义rsync命令选项
RSYNC_OPTS="-avzhP --delete --stats"

# 忽略的文件夹
EXCLUDE_OPTS="--exclude='__pycache__' --exclude='.git' --exclude='.idea'"

# 日志文件
LOG_FILE="/Users/bytedance/priv_tools/sync_devices.log"

# 日志记录函数
function log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}

# 通用同步函数
function sync_directories() {
    local source_dir=$1
    local target_dir=$2
    local ssh_jump=$3
    local direction=$4

    log "Checking differences between $direction directories:"
    rsync $RSYNC_OPTS $EXCLUDE_OPTS -e "ssh $ssh_jump" --dry-run $source_dir $target_dir | tee -a $LOG_FILE

    # 提示用户具体的同步信息,换行显示
    read -p "Do you want to synchronize
from   --------   $source_dir 
to     --------   $target_dir? 
(y/n) " answer
    if [ "$answer" != "${answer#[Yy]}" ] ;then
        log "Starting synchronization from $source_dir to $target_dir..."
        rsync $RSYNC_OPTS $EXCLUDE_OPTS -e "ssh $ssh_jump" $source_dir $target_dir | tee -a $LOG_FILE
        log "Synchronization from $source_dir to $target_dir completed."
    else
        log "Synchronization from $source_dir to $target_dir aborted."
    fi
}

# 主程序逻辑
if [ "$1" == "local_to_remote_deepns" ] ;then
    sync_directories $LOCAL_DIR_DEEPNS $REMOTE_DIR_DEEPNS "" "$LOCAL_DIR_DEEPNS to $REMOTE_DIR_DEEPNS"
elif [ "$1" == "remote_to_local_deepns" ] ;then
    sync_directories $REMOTE_DIR_DEEPNS $LOCAL_DIR_DEEPNS "" "$REMOTE_DIR_DEEPNS to $LOCAL_DIR_DEEPNS"
elif [ "$1" == "local_to_remote_mr" ] ;then
    sync_directories $LOCAL_DIR_MRAUTOINSPECT $REMOTE_DIR_MRAUTOINSPECT "-J user@192.168.1.10" "$LOCAL_DIR_MRAUTOINSPECT to $REMOTE_DIR_MRAUTOINSPECT"
elif [ "$1" == "remote_to_local_mr" ] ;then
    sync_directories $REMOTE_DIR_MRAUTOINSPECT $LOCAL_DIR_MRAUTOINSPECT "-J user@192.168.1.10" "$REMOTE_DIR_MRAUTOINSPECT to $LOCAL_DIR_MRAUTOINSPECT"
else
    printf "Usage: $0 {\nlocal_to_remote_deepns\nremote_to_local_deepns\nlocal_to_remote_mr\nremote_to_local_mr\nlocal_to_remote_deepaec\nremote_to_local_deepaec\n}\n"
fi

脚本功能

  • 定义目录:脚本中定义了多个本地和远程目录,用于存储需要同步的文件。
  • rsync 选项:使用 -avzhP --delete --stats 选项,确保文件以归档模式传输,保持文件权限和时间戳,并显示传输进度和统计信息。
  • 日志记录:通过 log 函数记录同步过程中的重要信息和时间戳。
  • 同步函数:定义了同步函数,用于本地到远程和远程到本地的同步。
  • 用户确认:在执行实际同步之前,脚本会进行干运行(dry-run),并提示用户确认是否继续同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值