약 1년 동안 저는 zfs(풀 이름 zdata) 아래의 dm-crypt/luks 암호화된 하드 드라이브, 미러 모드의 8개 하드 드라이브에서 데이터를 실행하는 데비안 서버를 사용했습니다. 따라서 각각 2개의 하드 드라이브가 있는 4개의 미러가 있습니다. 정상 기간 동안의 zpool 상태:
# zpool status
pool: zdata
state: ONLINE
scrub: scrub completed after (blahblah)
config:
NAME STATE READ WRITE CKSUM
zdata ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
dm-name-n8_2 ONLINE 0 0 0
dm-name-n8_3 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
dm-name-n8_0 ONLINE 0 0 0
dm-name-n8_1 ONLINE 0 0 0
mirror-2 ONLINE 0 0 0
dm-name-n8_4 ONLINE 0 0 0
dm-name-n8_5 ONLINE 0 0 0
mirror-3 ONLINE 0 0 0
dm-name-n8_7 ONLINE 0 0 0
dm-name-n8_6 ONLINE 0 0 0
errors: No known data errors
(물론 34TB의 원시 데이터는 백업하지 않았습니다. 거의 다 포기할 수도 있었지만, 나에게 소중하다고 생각한 파일이 몇 개 있었습니다.)
2주 전에 Stable로 업그레이드한 후, dm-name-n8_2에서 몇 가지 읽기, 쓰기 및 체크섬 오류가 발생하기 시작했습니다. zfs가 재동기화를 시작했기 때문에 정리가 수행되지 않았지만 계속해서 다시 시작되었기 때문에 종료되지 않았습니다. 미러에 있는 또 다른 하드 드라이브인 dm-name-n8_3에도 동일한 오류가 발생했고, 두 hhd의 각 컨트롤러가 모두 죽어가고 있다는 사실을 깨닫기 시작했습니다.
제가 했던 어리석은 짓들에 비하면 지금은 다 이해할 수 없는 것 같아요(마이닝 풀 역사아무것도 표시되지 않습니다). 무엇보다도 "더 나은" 디스크를 교체하기 시작했습니다. 동시에 나는 정전을 일으킨 결함이 있는 가전제품에 대해 작업하고 있었는데, 이로 인해 셀을 시작한 후 다시 프라이밍할 수 없었습니다. 이제 불량 디스크가 제거되고 교체되었습니다. 결국 풀을 다시 가져올 수 없습니다.
# zpool import -f
pool: zdata
id: 1343310357846896221
state: UNAVAIL
status: One or more devices were being resilvered.
action: The pool cannot be imported due to damaged devices or data.
config:
zdata UNAVAIL missing device
mirror-0 DEGRADED
dm-name-n8_2 UNAVAIL
dm-name-n8_3 ONLINE
mirror-1 ONLINE
n8_0 ONLINE
n8_1 ONLINE
mirror-2 DEGRADED
dm-name-n8_4 ONLINE
dm-name-n8_5 UNAVAIL
mirror-3 ONLINE
n8_7 ONLINE
dm-name-n8_6 ONLINE
# zpool import zdata -f
cannot import 'zdata': one or more devices is currently unavailable
와 동일zpool import zdata -fnF
변경된 장치 이름을 기록해 두십시오.
수영장은 최소한하나모든 미러의 장치가 온라인 상태인데 왜 장치 누락에 대해 불평합니까?
어떤 장치가 누락되었는지 어떻게 알 수 있나요? 풀을 다시 온라인으로 전환할 수 있는 방법이 있습니까? 어떻게 해야 합니까?
(저는 oracle 문서와 freebsd 매뉴얼에서 zfs에 관한 장을 읽고 몇 가지를 배웠지만 제 질문에 대한 답을 찾지 못했습니다.)
보시다시피 zdb의 출력은 약간 깁니다.여기.
답변1
마침내 나는 이 혼란스러운 문제에 대한 해결책을 찾았습니다. status
풀을 다시 시작하는 데 사용한 디스크에 따라 다른 메시지가 표시되었습니다. 4개의 해당 디스크를 다양한 조합으로 사용하여 성능이 저하된 상태의 풀을 가져오려고 여러 번 시도했고 마침내 다음과 같은 결과를 얻었습니다.
NAME STATE READ WRITE CKSUM
zdata DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
dm-name-n8_2 ONLINE 0 0 0 (resilvering)
11141007683912581709 UNAVAIL 0 0 0 was /dev/disk/by-id/dm-name-n8_3
mirror-1 DEGRADED 0 0 0
16620393607066428577 FAULTED 0 0 0 was /dev/disk/by-id/dm-name-n8_0
dm-name-n8_0 ONLINE 0 0 0
mirror-2 DEGRADED 0 0 0
replacing-0 DEGRADED 85 0 0
1051730541091272780 FAULTED 0 0 0 was /dev/disk/by-id/dm-name-n8_4
dm-name-n8_6 ONLINE 0 0 85 (resilvering)
dm-name-n8_4 ONLINE 0 0 0 (resilvering)
mirror-3 DEGRADED 0 0 0
dm-name-n8_5 ONLINE 0 0 0
13833275275194605312 FAULTED 0 0 0 was /dev/disk/by-id/dm-name-n8_6
이를 통해 손상된 디스크에서 거의 모든 데이터를 긁어낼 수 있었습니다. 손실은 약 0.1%입니다(70000개 파일 중 >134개).
내가 이해한 바로는 zfs는 풀의 각 장치에 구성 데이터를 저장하고 동기화를 유지합니다. 정전으로 인해 이것이 손상되었거나 디스크가 손상되었을 수 있습니까?
아무튼 또 기쁘네요. 읽고 도와주셔서 감사합니다!
답변2
향후 참조용으로만 사용하세요. 다른 I/O 버퍼(하드웨어 RAID 컨트롤러) 위에 I/O 버퍼(zfs) 배치언제나나쁜 생각입니다. 이 둘은 서로를 무시하고 온갖 문제를 일으킬 수 있습니다. 이를 방지하는 현명한 방법은 네트워크 저장 장치를 사용하는 것입니다.