ZFS에서 암소 복사본을 만드는 방법이 있습니까?


14

일부 파일 / 디렉토리의 암소 사본을 만들려고 노력하고 있지만 내가 아는 여러 가지 방법 중 모두 최적이 아닌 것 같습니다.

예를 들어, btrfs는 cp --reflink=auto파일의 카피 사본을 빠르게 생성 하여 사용할 수 있습니다.

내가 시도한 것 :

  1. Symlinks : 좋지 않습니다. 파일 이름이 바뀌고 링크가 끊어졌습니다.
  2. 하드 링크 : 더 좋지만 여전히 좋지 않습니다. 한 파일을 변경하면 다른 파일이 변경되므로 반드시 다른 파일을 변경하고 싶지는 않습니다.
  3. 데이터 세트의 스냅 샷을 생성 한 다음 스냅 샷을 복제하십시오. 종종 전체 데이터 세트의 사본을 찾지 않거나 사본이 다른 데이터 세트처럼 작동하지 않습니다. 그런 다음 복제 / 스냅 샷 / 원본 사이에 부모 / 자식 관계가 있습니다. 이해하기 어렵지만 깨는 것이 불가능하지는 않습니다.
  4. 을 사용 zfs send/receive하고 중복 제거를 사용 하여 데이터 세트를 새 데이터 세트에 복제합니다. 이렇게하면 복제를 사용하는 부모 / 자식 관계를 피할 수 있지만 여전히 다른 데이터 세트를 작성해야하며 파일을 100 % 읽어야하는 속도가 느려집니다. 쓰지 않고 다시 참조 된 블록.
  5. 파일을 복사하고 dedup이 작업을 수행하도록합니다.이 방법은 효과적이지만 파일을 100 % 읽은 다음 쓰기 대신 블록을 다시 참조해야하기 때문에 속도가 느립니다.

zfs 전송 / 수신 속도가 느리고 물리적으로 복사 또는 재 동기화되는 속도가 더욱 악화됩니다. 대부분의 항목은 압축 된 상태로 저장되어 있으며 읽기 중에 압축을 풀고 중복 제거 블록을 참조하기 위해 중복 제거가 시작되기 전에 압축해야하기 때문입니다.

모든 연구에서 btrfs에서 --reflink의 단순성과 유사한 것을 원격으로 찾을 수 없었습니다.

그렇다면 ZFS에서 암소 사본을 만드는 방법이 있습니까? 아니면 "물리적으로"복사하고 dedup이 유일한 작업 옵션이되게 하는가?

답변:


4

위에서 설명한 옵션 3이 아마도 가장 좋은 방법이라고 생각합니다. ZFS는 실제로 데이터 세트 / 스냅 샷 수준에서이 기록 중 복사 만 처리한다는 점이 가장 큰 문제입니다.

정확한 환경에서 잘 작동하는지 확인하지 않으면 dedup을 사용하지 않는 것이 좋습니다. 하나 이상의 사용자 또는 VM 저장소로 이동할 때까지 dedup이 훌륭하게 작동하는 개인적인 경험이 있으며 성능 절벽에서 떨어져 많은 문제가 발생합니다. 처음 10 명의 사용자와 잘 작동하는 것처럼 보이기 때문에 11 번째 (12 번째, 13 번째 또는 기타)를 추가하면 컴퓨터가 넘어 질 수 있습니다. 이 경로를 사용하려면 프로덕션 환경을 정확하게 모방 한 테스트 환경이 있고 해당 환경에서 제대로 작동하는지 반드시 확인하십시오.

옵션 3으로 돌아가서 이러한 방식으로 관리하려는 각 파일 시스템 트리를 보유하도록 특정 데이터 세트를 설정해야합니다. 일단 설정하고 처음에 채우면 스냅 샷 (데이터 세트당 하나씩 약간 씩 다름)을 가져 와서 복제본으로 승격하십시오. 원래 데이터 세트를 다시 만지지 마십시오.

예,이 솔루션에는 문제가 있습니다. 나는 그것이 아니라고 말하지는 않지만 ZFS의 제한을 감안할 때 여전히 최고의 것입니다. 클론을 효과적으로 사용하는 사람에 대한이 참조를 찾았습니다 : http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

btrfs에 익숙하지 않지만 원하는 옵션을 지원하는 경우 해당 서버에서 Linux 및 btrfs를 사용하여 이러한 데이터 세트를 지원하기 위해 별도의 서버를 설정하는 것을 고려 했습니까?


이것은 생각하기에 좋은 음식입니다. "마스터"(및 하위)가 충분히 큰 변화를 필요로하는 경우, 마스터의 클론을 만들고, 개선하고, 새로운 마스터 위치로 승격시킬 수 있으며, 충분히 다른 보조 클론은 rsync 결정된 변형을 가질 수 있습니다. 옆으로, 클론들은 새로운 마스터로부터 파괴되고 재건되었으며, 변경 사항은 보류 된 재료에서 철회되었습니다. 이것은 훌륭한 솔루션처럼 보이지는 않지만 좋은 솔루션처럼 보이기 시작하고 중복 제거를 사용하도록 설정하는 오버 헤드를 줄여줍니다. 이것에 대해 더 생각해야합니다.
킬러 미스트

예, 그것은 훌륭한 해결책은 아니지만 설명 한 것 중에서 가장 고통스럽고 다른 것을 생각할 수 없었습니다.
jlp

요점 요약은 github.com/zfsonlinux/zfs/issues/405에 설명되어 있습니다. 기본적으로 ZFS는 파일 기반 COW를 지원하지 않고 데이터 세트 COW 만 지원하므로 BTRFS와 동일하지 않습니다 cp --reflink=auto.
mtalexan

1

옵션 5가 가장 좋습니다.

옵션 3의 상위 / 하위 데이터 세트와 관련하여 복제를 승격시킬 수 있으며 더 이상 복제 된 데이터 세트의 하위가되지 않습니다. 여전히 추가 블록을 사용하지 않습니다. 편집 : 이것은 부모 / 자식 관계 만 역전시키고 파괴하지는 않습니다.

압축 / 암호화 및 복사 속도 저하와 관련하여 이는 완전히 잘못된 것입니다. 프로세서는 블록 장치보다 훨씬 빠릅니다 (SSD를 사용하더라도). 일부 예제 번호의 경우 블록을 읽는 데 10 초가 걸리지 만 블록을 압축 해제하는 데 1 초, 해독하는 데 2 ​​초만 걸립니다. 블록 1은 10 초 안에 읽혀지고 CPU로 전송됩니다. 디스크가 블록 2를 읽기 시작하면 CPU는 압축 해제 및 암호 해독을 시작합니다. CPU는 3 초 안에 작업을 완료 한 후 다음 7 초 동안 디스크를 대기합니다. 한편 디스크는 블록 압축 여부에 관계없이 두 블록 (20 초)을 읽는 데 정확히 동일한 시간을 소비했습니다.

쓰는 동안 마찬가지로 첫 번째 블록 만 지연됩니다. CPU는 블록 1을 압축 / 암호화하여 디스크로 보냅니다. 디스크가 블록 1을 쓰는 동안 CPU는 후속 블록을 압축 / 암호화하기 시작합니다. CPU는 디스크가 쓸 수있는 것보다 훨씬 빠르게 블록을 통과하므로 문제가되지 않습니다. (예, 이것보다 복잡하지만 이것이 요점입니다.)

귀하의 질문에 대한 사소한 점에 대한 지나치게 긴 설명에 대해 죄송하지만 그 오해를 정리하고 싶었습니다.


1
복제를 승격하면 상위로 간주되고 하위로 간주되는 스위치 만 전환됩니다. 원래 상위는 이제 승격 된 복제의 하위 인 스냅 샷의 하위이므로 스냅 샷을 삭제할 수 없습니다. 게다가, 여전히 데이터 세트 내에서 파일을 복제하려고하는 데이터 세트와 같은 구문을 불필요하게 작성하고 있습니다.
킬러 미스트

또한 중복 제거가 활성화 된 풀에서 압축 속도 저하에 대한 결론에 동의하지 않아야합니다. 압축이 활성화 된 데이터 세트에서 압축이 활성화 된 데이터 세트로 복사 할 때 속도가 5Mb / sec를 초과하는 경우는 거의 없습니다. 한 데이터 세트 또는 다른 데이터 세트에서 압축이 비활성화 된 경우 속도는 평균 10-15Mb / sec로 이동합니다. 양면 압축을 사용하지 않으면 20Mb / sec가 그보다 높은 스파이크로 쉽게 보입니다 (아마도 느린 미디어에서 당기는 대신 부분이 램의 중복 제거 테이블에 닿기 때문일 수 있습니다).
킬러 미스트

1
복제와 관련하여 답변을 업데이트했습니다. 압축 / 암호화 / 중첩의 경우 압축 또는 암호화보다 DDT를 업데이트하면 속도 저하가 더 많이 발생합니다. 내 경험상 압축 및 암호화의 영향은 항상 무시할 수있었습니다. 나는 YMMV를 추측한다.
bahamat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.