我必须去有大量数据的位置。这两个地点的互联网连接速度都很慢。因此不可能通过互联网在两个位置之间同步数据。所以我们的想法是使用运动鞋网络来同步数据。
当我在位置 A 时,我会将 NVME 驱动器插入服务器。当我离开时,我会开车。当我位于位置 B 时,我会将驱动器插入另一台服务器。
那么同步数据的最佳方式是什么?
我找到了 Sneakersync 项目:https://github.com/lamyj/sneakersync 但这个项目不适合我,因为缺少一些限制:
- 一开始我有大约 45TB 的数据需要同步。但 NVME 上的时间和空间有限。
- 同步必须以两种方式工作。从服务器 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}
.