当前位置: 首页 > article >正文

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

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

在现代软件开发和数据管理中,保持本地和远程服务器之间的数据同步是至关重要的。无论是代码、配置文件还是其他数据,确保它们在不同环境中的一致性都是高效工作的关键。本文将介绍如何使用 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),并提示用户确认是否继续同步。

http://www.kler.cn/a/416979.html

相关文章:

  • Spring Cloud 程序读取 nacos 中的配置信息
  • 【Redis】Redis介绍
  • RuoYi排序
  • 【LeetCode: 145. 二叉树的后序遍历 + 栈】
  • 跨平台应用开发框架(4)----Qt(系统篇)
  • Fantasy业务代码执行之Run方法分析
  • Java基于SSM框架的跑腿平台小程序【附源码、文档】
  • 【多线程-第一天-NSThread-线程的属性-线程的名称-线程的优先级 Objective-C语言】
  • LLM学习笔记(11)pipeline() 函数的幕后工作
  • 【娱乐项目】基于批处理脚本与JavaScript渲染视频列表的Web页面
  • MySQL 中 COUNT(1)、COUNT(*) 和 COUNT(列名) 的区别
  • Spring Boot 项目——分层架构
  • C++设计模式:装饰器模式 (Decorator) (咖啡订单系统)
  • c++哈希(开散列原理及实现)
  • BUUCTF—Reverse—Java逆向解密(10)
  • 警钟长鸣,防微杜渐,遨游防爆手机如何护航安全生产?
  • Flink 离线计算
  • 【kafka02】消息队列与微服务之Kafka部署
  • 如何bug是前端还是后端
  • (即插即用模块-Attention部分) 二十、(2021) GAA 门控轴向注意力
  • 【Spring框架 二】
  • DimensionX 学习部署笔记
  • 大小写转换
  • Ubuntu 常用解压与压缩命令
  • 如何将WSL的虚拟机安装到任意目录中
  • Nginx和Apache有什么异同?