두 위치 간의 데이터 동기화

두 위치 간의 데이터 동기화

데이터가 많은 곳으로 가야 해요. 두 위치 모두 인터넷 연결이 느렸습니다. 따라서 인터넷을 통해 두 위치 간에 데이터를 동기화하는 것은 불가능합니다. 그래서 아이디어는 운동화 네트워크를 사용하여 데이터를 동기화하는 것입니다.

A 위치에 있을 때 NVME 드라이브를 서버에 연결합니다. 떠날 때는 운전을 해요. B 위치에 있을 때 드라이브를 다른 서버에 연결합니다.

그렇다면 데이터를 동기화하는 가장 좋은 방법은 무엇입니까?

sneakerssync 프로젝트를 찾았습니다.https://github.com/lamyj/sneakersync 하지만 이 프로젝트는 몇 가지 제한 사항이 없기 때문에 나에게 적합하지 않습니다.

  1. 처음에는 동기화할 데이터가 약 45TB였습니다. 하지만 NVME의 시간과 공간은 제한되어 있습니다.
  2. 동기화는 두 가지 방식으로 작동해야 합니다. 슬레이브 서버 A => B 및 슬레이브 서버 B => A.

답변1

만약 너라면가지다인터넷 연결을 사용하면 몇 시간 안에 45TB의 약 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}"

NVMe에 복사하고 BforA-updates.archive.zst, 지하실에서 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}.

관련 정보