면책 조항 : 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
즉, 명령이 잘못되었거나 스냅 샷을 제거하고 처음부터 다시 시작해야하는 불일치 상태에있는 것입니다.
여기에는 몇 가지 부정적인 의미가 있습니다.
- 새 복제 스냅 샷이 성공적으로 전송 될 때까지 복제 스냅 샷을 삭제할 수 없습니다. 이러한 복제 스냅 샷에는 다른 모든 (이전) 스냅 샷의 상태가 포함되므로 삭제 된 파일과 스냅 샷의 빈 공간은 복제가 완료된 경우에만 회수됩니다. 이로 인해 풀에서 임시 또는 영구 공간 문제가 발생할 수 있으며 전체 복제 절차를 다시 시작하거나 완료해야만 해결할 수 있습니다.
- 추가 스냅 샷이 많으므로 list 명령이 느려집니다 (이 문제가 수정 된 Oracle Solaris 11 제외).
- 스크립트 자체를 제외하고 스냅 샷을 실수로 제거하지 않도록 보호해야 할 수도 있습니다.
이러한 문제에 대한 가능한 해결책이 있지만 직접 시도하지는 않았습니다. zfs bookmark
이 작업을 위해 특별히 작성된 OpenSolaris / illumos의 새로운 기능인을 사용할 수 있습니다 . 그러면 스냅 샷 관리가 자유 로워집니다. 유일한 단점은 현재 재귀가 아닌 단일 데이터 세트에서만 작동한다는 것입니다. 모든 기존 데이터 세트와 새 데이터 세트의 목록을 저장 한 다음 반복하여 책갈피를 지정하고 전송하고 수신 한 다음 목록 (또는 원하는 경우 작은 데이터베이스)을 업데이트해야합니다.
북마크 경로를 사용하면 어떻게 작동하는지 듣고 싶습니다.
zfs send -R ...
습니까? 를 통해 출력을 파이프 한 경우 ?로ssh
이스케이프 문자를 비활성화 했zfs send -R ... | ssh -e none ...
습니까?