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