전체 zfs 풀을 다른 zfs 풀로 단방향 미러하는 방법


16

여러 zvol과 데이터 세트가 포함 된 하나의 zfs 풀이 있으며 일부는 중첩되어 있습니다. 모든 데이터 세트 및 zvol은 zfs-auto-snapshot에 의해 주기적으로 스냅 샷됩니다. 모든 데이터 세트 및 zvol에는 수동으로 생성 된 스냅 샷도 있습니다.

시간 부족으로 인해 zfs send -R을 통해 로컬 고속 네트워크를 통한 초기 복사가 완료되지 않은 원격 풀을 설정했습니다 (일부 데이터 세트가 누락되었거나 일부 데이터 세트가 오래되었거나 누락 된 스냅 샷).

이제 풀은 저속 연결을 통해 물리적으로 원격 상태이며 주기적으로 원격 풀을 로컬 풀과 동기화해야합니다. 즉, 로컬 풀에있는 데이터를 원격 풀에 복사하고 로컬 풀에서 사라진 데이터를 원격 풀에서 삭제해야합니다. 원격 풀에는 있지만 로컬 풀에는 없지만 'zvols', 'datasets'또는 'snapshots'를 의미하는 데이터로 원격 풀에서 삭제해야합니다.

rsync를 사용하여 두 일반 파일 시스템간에이 작업을 수행 한 경우 "-axPHAX --delete"(실제로 일부 시스템을 백업하기 위해 수행하는 작업)가됩니다.

원격 풀 zvol 및 데이터 세트 (스냅 샷 포함)를 로컬 zvol, 데이터 세트 및 스냅 샷과 동기화 할 수 있도록 동기화 작업을 어떻게 설정합니까?

ssh의 처리량 성능이 낮기 때문에 ssh를 통한 전송을 피하고 싶습니다. 대신 mbuffer 또는 iscsi를 선호합니다.


초기는 어떻게 했 zfs send -R ...습니까? 를 통해 출력을 파이프 한 경우 ?로 ssh이스케이프 문자를 비활성화 했 zfs send -R ... | ssh -e none ...습니까?
Andrew Henle

또한 원격 연결을 최신 상태로 유지하기 위해 느린 연결의 대역폭이 충분한 지 확인해야합니다. 원격 시스템에 보낼 수있는 것보다 로컬 시스템에 더 많은 변경 사항이있는 경우 원격 사본을 최신 상태로 유지할 수 없습니다. 증분 zfs 복제 스트림을 가져 와서 파일로 저장하십시오. 파일이 스냅 샷 사이의 시간 동안 원격 사이트에 보낼 수있는 데이터 양보다 큰 경우 계속 유지하지 않습니다. zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Andrew Henle

이 스크립트를 사용하여 자동으로 수행 할 수도 있습니다. github.com/psy0rz/zfs_autobackup/blob/master/README.md
edwin eefting

답변:


12

면책 조항 : zvols를 사용한 적이 없으므로 일반적인 파일 시스템이나 스냅 샷과 다른 복제인지 말할 수 없습니다. 나는 그들이 있다고 가정하지만 내 말을 받아들이지 않습니다.


귀하의 질문은 실제로 여러 개의 질문입니다. 별도로 답변하려고합니다.

풀을 원격 위치로 복제 / 미러링하는 방법

작업을 두 부분으로 분할해야합니다. 첫째, 초기 복제가 완료된 후 복제 스냅 샷을 망칠 수 없다면 증분 복제가 가능합니다 . 증분 복제를 활성화하려면 마지막 복제 스냅 샷을 보존해야합니다. 그 전에 모든 것을 삭제할 수 있습니다. 이전 스냅 샷을 삭제 zfs recv하면 불만이 제기되고 복제가 중단됩니다. 이 경우 다시 시작해야하므로이 작업을 수행하지 마십시오.

올바른 옵션이 필요한 경우 다음과 같습니다.

  • zfs send:
    • -R: 지정된 풀 또는 데이터 세트 아래에있는 모든 것을 보냅니다 (반복적으로 필요한 재귀 복제 포함 -p). 또한 수신시 삭제 된 모든 소스 스냅 샷이 대상에서 삭제됩니다.
    • -I: 마지막 복제 스냅 샷과 현재 복제 스냅 샷 사이의 모든 중간 스냅 샷 포함 (증분 전송에만 필요)
  • zfs recv:
    • -F: 소스에서 삭제 된 기존 데이터 세트 삭제를 포함하여 대상 풀 확장
    • -d: 소스 풀의 이름을 버리고 대상 풀 이름으로 바꿉니다 (나머지 파일 시스템 경로는 그대로 유지되며 필요한 경우 작성 됨)
    • -u: 대상에 파일 시스템을 마운트하지 않습니다

완전한 예제를 선호한다면 다음은 작은 스크립트입니다.

#!/bin/sh

# Setup/variables:

# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname

# Initial send:

# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"

# Incremental sends:

# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
    zfs destroy "$snap"
done

SSH보다 빠른 것을 사용하십시오

충분히 안전한 연결 (예 : IPSec 또는 OpenVPN 터널)과 발신자와 수신자 사이에만 존재하는 별도의 VLAN이있는 경우 여기설명 된대로 SSH에서 mbuffer 같은 암호화되지 않은 대안으로 전환 하거나 암호화가 약하거나없는 SSH를 사용할 수 있습니다 및 비활성화 된 압축 은 여기에 자세히 설명되어 있습니다 . SSH를 훨씬 빠르게 재 컴파일하는 방법에 대한 웹 사이트도 있었지만 불행히도 URL을 기억하지 못합니다. 나중에 찾으면 나중에 편집하겠습니다.

매우 큰 데이터 세트 및 느린 연결의 경우 하드 디스크를 통한 첫 번째 전송에도 유용 할 수 있습니다 (암호화 된 디스크를 사용하여 zpool을 저장하고 택배, 우편 또는 직접 직접 패키지로 전송). 전송 방법은 send / recv에 중요하지 않으므로 모든 것을 디스크로 파이프하고, 풀을 내보내고, 디스크를 대상으로 보내고, 풀을 가져온 다음 SSH를 통해 모든 증분 전송을 전송할 수 있습니다.

엉망인 스냅 샷 문제

앞에서 언급했듯이 복제 스냅 샷을 삭제 / 수정하면 오류 메시지가 나타납니다.

cannot send 'pool/fs@name': not an earlier snapshot from the same fs

즉, 명령이 잘못되었거나 스냅 샷을 제거하고 처음부터 다시 시작해야하는 불일치 상태에있는 것입니다.

여기에는 몇 가지 부정적인 의미가 있습니다.

  1. 새 복제 스냅 샷이 성공적으로 전송 될 때까지 복제 스냅 샷을 삭제할 수 없습니다. 이러한 복제 스냅 샷에는 다른 모든 (이전) 스냅 샷의 상태가 포함되므로 삭제 된 파일과 스냅 샷의 빈 공간은 복제가 완료된 경우에만 회수됩니다. 이로 인해 풀에서 임시 또는 영구 공간 문제가 발생할 수 있으며 전체 복제 절차를 다시 시작하거나 완료해야만 해결할 수 있습니다.
  2. 추가 스냅 샷이 많으므로 list 명령이 느려집니다 (이 문제가 수정 된 Oracle Solaris 11 제외).
  3. 스크립트 자체를 제외하고 스냅 샷을 실수로 제거하지 않도록 보호해야 할 수도 있습니다.

이러한 문제에 대한 가능한 해결책이 있지만 직접 시도하지는 않았습니다. zfs bookmark이 작업을 위해 특별히 작성된 OpenSolaris / illumos의 새로운 기능인을 사용할 수 있습니다 . 그러면 스냅 샷 관리가 자유 로워집니다. 유일한 단점은 현재 재귀가 아닌 단일 데이터 세트에서만 작동한다는 것입니다. 모든 기존 데이터 세트와 새 데이터 세트의 목록을 저장 한 다음 반복하여 책갈피를 지정하고 전송하고 수신 한 다음 목록 (또는 원하는 경우 작은 데이터베이스)을 업데이트해야합니다.

북마크 경로를 사용하면 어떻게 작동하는지 듣고 싶습니다.


이 자세한 답변에 감사드립니다. 방금 보내드립니다 zpool.
지터

1
좋은 스크립트. 검색 깊이를 제한 -d 1하기 위해 두 zfs list명령 모두에 추가 했습니다 (풀 이름 아래에서 검색 할 필요가 없습니다). 이렇게하면 스냅 샷이 많은 풀에서 오랜 지연이 발생하지 않습니다 (예 : "백업"풀에는 320000 개의 스냅 샷이 있으며 zfs list -r -t snapshot backup실행하는 데 13 분이 걸립니다 -d 1. zfs destroyfor 루프 의 명령 -r에는 동일한 스냅 이름을 가진 모든 스냅 샷을 반복적으로 삭제 하는 옵션이 필요합니다 .
cas

5

개인적으로, 나는 최신 스냅 샷 이없는 원격 서버의 zvols, 데이터 세트 등을 목록으로 만든 다음 zfs send시간이 많이 걸리고 많이 사용하더라도 스냅 샷을 최신 상태로 가져옵니다. 대역폭

그런 다음 계속 사용할 수 있었고 zfs send자체 동기화 코드를 작성하여 휠을 다시 만들 필요가 없습니다. rsync오래된 파일 시스템에 대한 좋은 그러나 zfs sendZFS에 대한 훨씬 더 - 그것은 알고 정확히 블록이 스냅 샷에 변경하는 보냅니다 rsync를 로컬 및 원격 서버간에 개별 파일 및 / 또는 타임 스탬프를 비교하는 동안, 그들을. btrfs sendbtrfs 풀 에도 동일하게 적용됩니다 .

최신 상태로 가져와야하는 스냅 샷 수가 적은 경우 수동으로 수행 할 수 있습니다. 그렇지 않으면 자동으로 수행하려면 최신 로컬 스냅 샷과 원격 스냅 샷의 목록 및 zfs sendrmeote 서버에서 오래된 버전과 로컬 스냅 샷 을 비교하는 스크립트가 필요 합니다.

각 데이터 세트의 최신 스냅 샷 만 신경 쓰면 충분합니다. 이전의 모든 스냅 샷에 관심이 있다면 분명히 스크립트도 스냅 샷을 처리해야 할 것입니다. 경우에 따라 원격 서버에서 롤백해야 중간 / 결측 스냅 샷을 다시 보낼 수 있습니다.

원격 서버에 안전하게 연결하려면 거의 선택의 여지가 없지만 ssh터널 을 사용 하거나 다른 것으로 설정 openvpn하고 사용하십시오 netcat.


Zrep을 사용하는 것은 어떻습니까? bolthole.com/solaris/zrep
XDG

dunno, 절대 사용하지 않았습니다. 누군가가 약간의 연구와 테스트를 거쳐 그것을 작성해야한다면 좋은 대답을하는 것처럼 보입니다 (힌트입니다).
cas

우분투 (Linux의 ZFS)에서 테스트했으며 더 깊은 데이터 세트 (탱크 / 무언가 / 다른 것)에서는 작동하지 않았습니다. 이 포트를 사용하여 쉘 링크했습니다 . 재귀 플래그 export ZREP_R=-R가 전혀 작동하지 않았습니다. :(
Xdg

1

FreeBSD에서`zrepl '을 보시면 여러분의 삶과 그 문제에 대한 누군가를 훨씬 쉽게 만들 수 있습니다. 며칠 전에 오타와에서 BSDCan2018 동안 발표되었습니다. 유망 해 보이며 문제에 대한 해결책 일 수 있습니다.



질문의 질문은 "원격 풀 zvols 및 데이터 세트 (스냅 샷 포함)를 로컬 zvols, 데이터 세트 및 스냅 샷과 동기화 할 수 있도록 동기화 작업을 어떻게 설정합니까?"입니다.
Jeff Schaller

0

zrep은 훌륭한 올인원 솔루션이며 일반 SSH 전송보다 더 빠른 전송 방법에 대한 문서 및 후크를 제공합니다.

https://github.com/bolthole/zrep

또한 크로스 플랫폼입니다 : Linux, freebsd 및 solaris / illumos에서 지원됩니다.



1
질문의 질문은 "원격 풀 zvols 및 데이터 세트 (스냅 샷 포함)를 로컬 zvols, 데이터 세트 및 스냅 샷과 동기화 할 수 있도록 동기화 작업을 어떻게 설정합니까?"입니다.
Jeff Schaller

Jeff, 최고의 "답변"은 zrep에 대한 참조를 제공하는 것이 아니라 zrep 설명서에서 비트를 잘라내어 붙여 넣는 것입니다.
Philip Brown

1
최선의 답변이 무엇인지 모르겠지만 소프트웨어 링크는 해결책이 아닙니다. 사실 이미 언급되었습니다. "원격 풀 zvol 및 데이터 세트 (스냅 샷 포함)를 로컬 zvol, 데이터 세트 및 스냅 샷과 동기화 할 수 있도록 동기화 작업을 어떻게 설정합니까?"
Jeff Schaller

네, 그게 문제입니다. 그러나 WELL 작업을 수행하려면 여기 웹 페이지에 약간의 글쓰기가 필요합니다. 이것이 zrep이 2000 라인 쉘 스크립트 인 이유입니다. 원래 문제가 전혀 필요하지 않은 모든 부분을 제거하더라도 여전히 수백 줄의 스크립트가 필요합니다.
Philip Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.