同步两个位置之间的数据

同步两个位置之间的数据

我必须去有大量数据的位置。这两个地点的互联网连接速度都很慢。因此不可能通过互联网在两个位置之间同步数据。所以我们的想法是使用运动鞋网络来同步数据。

当我在位置 A 时,我会将 NVME 驱动器插入服务器。当我离开时,我会开车。当我位于位置 B 时,我会将驱动器插入另一台服务器。

那么同步数据的最佳方式是什么?

我找到了 Sneakersync 项目:https://github.com/lamyj/sneakersync 但这个项目不适合我,因为缺少一些限制:

  1. 一开始我有大约 45TB 的数据需要同步。但 NVME 上的时间和空间有限。
  2. 同步必须以两种方式工作。从服务器 A => B 和从服务器 B => A。

答案1

如果你一个互联网连接,您可以在几个小时内传输大约 45 TB 的 1/2000,这rsync是您的朋友,它可以进行“半离线”更新!这意味着互联网连接仅用于交换文件名、属性和校验和,然后将必要的更改写入可以以不同方式传输的文件中:

从A,

#     Only update files that are newer on A than on B
#     |  archive mode: keep times, owners, permissions
#     |  |     Don't actually send data over network, but write to file "batch-updates.archive"
#     |  |     |                                        Go through subdirectories
#     |  |     |                                        |           Show progress
#     |  |     |                                        |           |          |----copy from here----| |----copy to here on B----|
rsync -u -a    --only-write-batch=AforB-updates.archive --recursive --progress "${path_to_Alocalfiles}" "B:${path_to_Blocalfiles}"
# If batch update file is large: compress strongly if necessary
# Lower levels than -15 are much faster than typical SSD write speed (try -4),
# so compression is a pure win-win situation here.
zstd -T0 -15 AforB-updates.archive

将一只强壮的信鸽安置在 B 处,将其驱赶到 A 处,将包含的 NVMe 装订AforB-updates.archive.zst到其中,然后将其返回 NVMe 至 B 处。同时,在 B 处,执行与上述 A 处相同的操作以获取 B ->更新:

rsync --update -a --only-write-batch=BforA-updates.archive --recursive --progress "${path_to_Blocalfiles}" "A:${path_to_Alocalfiles}"
zstd -T0 -15 BforA-updates.archive

喂鸽子。

完成后,在B上,

zstd -T0 --stdout -d AforB-updates.archive.zstd | rsync --read-batch=- -a "${path_to_Blocalfiles}"

复制BforA-updates.archive.zst到你的NVMe上,从地窖里拿出ole SSD弹射器,用三层毛巾把NVMe包起来,从B到A再发射回来,最后zstd -T0 --stdout -d BforA-updates.archive.zstd | rsync --read-batch=- -a "${path_to_Alocalfiles}"


如果你的互联网连接速度太慢,事情就会变得……更多手动:

听起来像是一份工作rdiff! (它基本上是rsync,但分为单独的“制作文件签名”、“计算增量”、“用增量进行修补”步骤)

它生成本地文件(例如,服务器 A 上)的校验和列表。然后,您可以将该列表传送到服务器 B(甚至可以在线,它不会是大量数据)。获取这些签名,找到 B 上文件的不同部分,并将这些差异保存到您的便携式 SSD 中。返回 A,然后您可以应用更改。

所以,对我来说它看起来像这样(未经测试,从头到尾写的,没有保证,但我希望它有帮助)!

写签名:

#!/usr/bin/zsh
## Signature tree storage script
## Goes through the current directory, writes a file signature for every file
## into an identically named file under $sigs,
## and creates an archive ~/signatures-(current datetime).squash in the home
## directory

sigs="/path/to/signatures"

# Let's assume we only sync regular files, not empty directories, nor sockets, nor symlinks, nor device nodes,…

for f in **/*(.) ; do
  # remove trailing path component, i.e. file name from $f and use that to
  # create directory under sigs prefix
  mkdir -p "${sigs}/${f:h}" 

  # write signature to file in prefix
  rdiff signature -- "${f}" "${sigs}/${f}"
done

# Assuming quite a few files are similar on a 1.4 TB thing, let's spend some
# time when archiving the signature prefix on minimizing the store needed for
# these.
# We use squashfs as archive format, as mksquashfs deduplicates, and allows us
# to compress on the fly – and also, because on the reading end, we can just
# mount the archive without unpacking it.
mksquashfs "${sigs}" "~/signatures-$(date -Is).squash" -comp zstd

在接收端,您将执行相反的操作:安装签名….squash 文件,遍历树,并rdiff delta -- ${signature_file} ${actual_file} deltas/${actual_file}写入增量。将整个$deltas目录存档,带回家,然后rdiff path -- ${actual_file} ${delta_file} updated/${actual_file}.

相关内容