전체 zfs 풀을 다른 zfs 풀로 단방향 미러하는 방법 -R을 통해 로컬 고속 네트워크를 통한

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

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

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

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

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

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



답변

면책 조항 : 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의 새로운 기능인을 사용할 수 있습니다 . 그러면 스냅 샷 관리가 자유 로워집니다. 유일한 단점은 현재 재귀가 아닌 단일 데이터 세트에서만 작동한다는 것입니다. 모든 기존 데이터 세트와 새 데이터 세트의 목록을 저장 한 다음 반복하여 책갈피를 지정하고 전송하고 수신 한 다음 목록 (또는 원하는 경우 작은 데이터베이스)을 업데이트해야합니다.

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


답변

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

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

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

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

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


답변

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


답변

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

https://github.com/bolthole/zrep

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


답변