일부 배경:
두 개의 RAID0 어레이(각 DRBD 클러스터 이전 노드)에 구축된 LVM 논리 볼륨에 구축된 단일 마스터 DRBD 장치에 VM 이미지, 홈 디렉터리, 메일 및 미디어 컬렉션을 저장합니다. RAID0은 액세스 시간을 향상시키는 것입니다. DBRD 클러스터의 두 노드는 중복성을 제공합니다. 나는 집과 이메일을 매시간 백업하고, VM 운영 체제와 미디어 컬렉션을 매주 오프사이트에 백업합니다. 가끔 가동 중단이 발생하지만 복구는 항상 간단하고 데이터 손실이 없습니다. 중재를 제공하기 위해 세 번째 노드의 복잡성이 필요하지 않습니다. 이 설정은 오랫동안 잘 작동했습니다.
그러나 나는 내가 다루지 않은 영역 중 하나가 비트롯이라는 것을 알고 있습니다. 10년 동안 보지 못한 영화를 계속 볼 수 있는지 어떻게 알 수 있나요? 손상된 데이터를 백업하지 않았는지 어떻게 알 수 있나요?
그래서 모든 파일의 체크섬을 저장하고 이를 마지막 실행과 비교하여 차이점을 보고하는 스크립트가 있습니다. 분명히 동일한 작업을 수행하려면 운영 체제에서 제공하는 일부 도구를 사용하는 것이 더 나을 것입니다. 가장 먼저 떠오르는 것은 Btrfs와 ZFS입니다. 내 Google 검색에 따르면 Btrfs는 이 분야에서 미성숙한 반면 ZFS는 미성숙합니다. 또한 저는 ZFS에 더 익숙하므로 ZFS가 제가 선호하는 솔루션입니다.
다음은 제가 대답하고 싶은 주요 질문입니다. ZFS가 백업 저장소의 손상을 감지할 수 있습니까?
주변에 여분의 물리적 머신이 없기 때문에 자체 "디스크"에 할당되지 않은 공간이 있는 가상 머신을 사용하여 물리적 디스크를 에뮬레이션하는 논리 볼륨을 생성하고 이를 ZFS에 공급하고 zvol을 생성할 계획입니다. , 임의의 데이터가 논리 볼륨에 기록되고 확인됩니다.
- zvol 내용의 체크섬이 어떻게든 실패했거나(ZFS가 zvol을 오프라인으로 전환할 수도 있음) 체크섬이 변경되었습니다.
- ZFS는 손상된 백업 저장소에 플래그를 지정합니다. 아마도 정리하는 경우에만 가능합니다.
이 테스트가 작동하지 않는다는 점을 고려하면(자세한 내용은 아래 참조) 내 실험이나 기대에 이미 결함이 있는 것일까요?
어쨌든, 내가 한 일은 다음과 같다.
볼륨 그룹에 충분한 공간이 있으므로 ZFS의 백업 저장소로 사용할 LV를 만들 수 있습니다.
penne# vgs
VG #PV #LV #SN Attr VSize VFree
vg0 1 3 0 wz--n- <40.46g <6.46g
penne# lvcreate --name=lvtest --size=1g vg0
Logical volume "lvtest" created.
penne#
LV를 새 ZFS 풀에 할당하고 여기에서 zvol을 생성합니다.
penne# zpool create zpooltest /dev/vg0/lvtest
penne# zfs create -V 800M zpooltest/zvoltest
penne#
말하자면, 백업 저장소의 "ZFS 뒤" 중간쯤에 1MB의 손상을 기록했을 것입니다. 뒷가게는 얼마나 큽니까?
penne# dd if=/dev/vg0/lvtest of=/dev/null bs=1M
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.24444 s, 331 MB/s
penne#
따라서 그 사이에는 약 500000000바이트가 있습니다.
zvol의 체크섬은 제가 관심을 갖는 부분입니다. raidz를 사용하는 경우 ZFS가 손상을 처리할 수 있으므로 손상이 체크섬에 영향을 미치지 않기를 원하지만 단일 디스크 백업 저장소를 사용할 때는 디스크 오류를 보고하기 위해 체크섬을 변경하고 정리하기를 원합니다. 그래서 먼저 zvol의 체크섬을 살펴봅니다.
penne# dd if=/dev/zvol/zpooltest/zvoltest bs=1M 2>/dev/null | md5sum
ebbcd350dfe34f526c0d80b3bf2d07dd -
penne#
이제 백업 저장소의 중간 1MB가 손상되었습니다.
penne# dd if=/dev/urandom of=/dev/vg0/lvtest seek=500000000 bs=1 count=1000000 conv=notrunc
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB, 977 KiB) copied, 1.27545 s, 784 kB/s
penne#
그리고 zvol의 체크섬을 다시 확인하세요.
penne# dd if=/dev/zvol/zpooltest/zvoltest bs=1M 2>/dev/null | md5sum
ebbcd350dfe34f526c0d80b3bf2d07dd -
penne#
왜 변하지 않았나요?
zvol의 내용이 변경되지 않은 것 같다는 점을 고려하면 스크럽이 아무 작업도 수행하지 않는 것은 놀라운 일이 아닙니다.
penne# zpool scrub zpooltest
penne# zpool status
pool: zpooltest
state: ONLINE
scan: scrub repaired 0B in 00:00:00 with 0 errors on Fri Mar 17 14:08:29 2023
config:
NAME STATE READ WRITE CKSUM
zpooltest ONLINE 0 0 0
lvtest ONLINE 0 0 0
errors: No known data errors
penne#
청크가 모든 곳에 캐시되어 있다는 것을 깨달았으므로 재부팅하여 모든 것을 플러시한 다음 zvol의 체크섬을 다시 확인했습니다.
penne# reboot
...
penne# dd if=/dev/zvol/zpooltest/zvoltest bs=1M 2>/dev/null | md5sum
ebbcd350dfe34f526c0d80b3bf2d07dd -
penne#
아직도 똑같아! 왜?
다시 말하지만, zvol의 내용이 변경되지 않은 것으로 나타나면 다른 스크럽이 아무 작업도 수행하지 않는 것은 놀라운 일이 아닙니다.
penne# zpool scrub zpooltest
penne# zpool status
pool: zpooltest
state: ONLINE
scan: scrub repaired 0B in 00:00:00 with 0 errors on Fri Mar 17 14:09:27 2023
config:
NAME STATE READ WRITE CKSUM
zpooltest ONLINE 0 0 0
lvtest ONLINE 0 0 0
errors: No known data errors
penne#
나는 보았다이것손상이 게시되었지만 감지되지 않는 이유는 손상이 백업 저장소의 시작 부분과 매우 가깝기 때문입니다. 그런데 제 경우에는 백킹스토어 중간에 슬랩뱅을 쓰고 있어요.
마지막으로 제가 드릴 질문은 이렇습니다. 무슨 일이 일어났나요?
운영 체제는 Debian 11이고 ZFS는 OpenZFS 2.0.3입니다.
감사해요!
알렉시스