raid6에서 4개의 디스크중 2곳이 부분적으로 오류난것도 복구가 가능할까요?

Tae_Wook의 이미지

raid6에서 4개의 디스크중 2곳이 부분적으로 오류난것도 복구가 가능할까요?

-
0. 4개의 디스크를 raid6으로 구성했을때 질문이 있는대요.

1. 디스크 에서 블록중 어느 평행선에 구성되는 블록 4개가 있을때. [더 자세히는 표현이 안되요.]
2개의 블록이 부분적으로 오류가 난 경우에도 해당 블록들을 복구가 가능할까요?

2. 디스크가 2개가 완전히 고장나게 되면 (raid{0+1} 같이 )복구가 불가능한 경우가 있나요?

chanik의 이미지

1. 같은 stripe 안에서 두 개의 디스크의 블록에 오류가 난 경우까지는 복구할 수 있습니다.
원칙적으로 RAID5는 한 개의 블록 오류까지 복구 가능하고 RAID6는 두 블록 오류까지 복구 가능하니까요.

2. 위와 마찬가지 맥락에서 RAID6 볼륨에서는 디스크 두 개까지는 완전히 고장나도 복구할 수 있습니다.
단, 나머지 두 개 디스크의 모든 블록들이 다 깨끗이 살아있어야 한다는 전제가 붙습니다.





이 전제의 의미를 잘 새겨야 합니다. 하드디스크의 특정 위치에 물리적오류(즉, 배드섹터)가 생긴 경우 이 사건은 발생즉시 인지되는 것이 아닙니다. 배드섹터는 조용히 발생하여 숨어 있게 되고, 언젠가 그 위치에 접근할 일이 생겼을 때에야 비로소 인지되는 것이죠.

예를 들어, 4개의 디스크를 이용해 RAID6 볼륨을 만들어 쓰고 있는데 4개의 디스크 가운데 3개에서 서로 다른 stripe 위치에 각각 배드섹터들이 생겼다고 가정해 보겠습니다. 운좋게도(?) 각 배드섹터 위치를 피해가며 한동안 잘 쓰고 있었는데, 어느날 이중 한 개의 디스크의 배드섹터 위치에 접근하게 되어 사건을 인지하게 되었다면 해당 디스크는 faulty로 표시되고 RAID6 볼륨은 degraded 상태로 빠지게 될 겁니다. 전형적인 복구절차는 이 디스크를 새 것으로 교체하고 볼륨을 복구하는 것이겠죠. 볼륨 복구과정에는 필연적으로 디스크 전체영역을 읽게 되고 이 과정에서 또 하나의 디스크에 생긴 배드섹터에 접근하게 될테니 곧 두 번째 사건을 인지하게 됩니다. 여기서 더이상 복구가 진행이 안 되므로 디스크를 또 하나 교체해야겠죠. 이후 복구과정에서 마지막으로 숨어있던 배드섹터를 만나게 되면 RAID6 볼륨은 복구불능 상태에 빠지게 됩니다.

물론 수작업으로, 또는 복구업체를 통해 데이터를 대부분(또는 전부) 살릴 수 있는 가능성은 있습니다. 피해규모는 숨어있던 배드섹터의 위치와 규모에 의해 좌우될 것입니다. 비용도 꽤 들어가게 될 것이고요.

이런 문제들을 피하거나 줄이려면 ZFS에서 제공하는 RAID-Z2 볼륨 등을 쓰는 방법이 있겠습니다.

Tae_Wook의 이미지

- - -
raid6 으로 묶인 4개의 하드디스크 에서 정보작성중 순간적인 오류로
같은 stripe에 있는 블록중 {1 ~ 2}개 가 잘못된 정보가 저장된 경우에
(raid 시스템이 원리적으로) 해당 블록의 오류를 감지후 복구가 가능할까요?

- - -
raid6 으로 묶인 4개의 하드디스크 에서 정보작성중 순간적인 오류로
같은 stripe에 있는 블록중 {1 ~ 2}개 가 전부 0으로 작성된 경우에
[문제의 블록은 하드웨어 적으로 정상.]
2개의 블록이 연속 적이지 않은 형태로 오류가 난 경우에도 오류복구가 가능하나요?
[ex) 같은 stripe에 있는 블록중 디스크 {2,4}에 속하는 블록이 잘못 작성됨. ]

- - -

chanik의 이미지

[1] 물리적인 오류

HDD의 경우엔 약간의 여유분섹터가 있어서 내부의 플래터에서 배드섹터가 감지되면 이를 여유섹터로 재배치하고 외부에는 그 사실을 감추는 것으로 압니다. 여유섹터를 다 쓰고 나면 재배치가 안 될테니 그냥 외부에 배드섹터를 노출하게 되겠죠. SSD에서도 이런 내부의 대응조치가 있는지는 모르겠습니다. 하지만 뭔가 내부조치가 있다 하더라도 그 한계를 넘게 되면 어차피 외부로 배드섹터가 노출될 수밖에 없겠죠. RAID 콘트롤러가 이를 인식하면 해당 디스크는 faulty 상태로 지정될 것이고요.

[2] 일시적인 오동작 - 데이터 오염

하드웨어적으로는 정상인데 읽기/쓰기 순간에 일시적인 오동작이 생기면 오염된 데이터가 기록될 수 있을 것입니다. 통상의 RAID는 이런 현상에 대해 보호장치가 없는 것으로 압니다. 그냥 오염된 데이터 그대로 소비자(파일시스템 및 그 위에서 동작하는 사용자 어플리케이션이 되겠죠)에게 볼륨을 서비스하겠죠.

오염때문에 생기는 위험은 파일시스템과 어플리케이션이 고스란히 감당하거나 대비해야 합니다. 파일시스템의 메타데이터가 오염되어 있다면 금방 티가 날 것이고 fsck 등으로 조치해야겠죠. 파일 내부의 데이터가 오염되어 있다면 데이터의 쓰임에 따라 영원히(?) 드러나지 않기도 하고 특정 어플리케이션의 오동작으로 이어지기도 할 것입니다. 어플리케이션은 이런 상황을 피하기 위해 스스로 체크섬을 관리할 수도 있겠죠.

이런 조용하고 투명한 오염에 대비하여 가끔 볼륨 전체에 대해 패리티를 재계산해볼 수 있겠는데, 이때 오류가 발견되면 어느정도까지 복구가 가능한지 모르겠습니다. 즉, 데이터와 패리티가 서로 맞지 않는 stripe가 발견되었을 때 RAID 콘트롤러가 어떤 데이터가 잘못된 것인지 특정하여 이를 고치는 것이 가능한지 의문입니다.

이런 면에서 통상의 RAID6에만 의지하는 것보다는 ZFS/RAID-Z2 등에 의지하는 것이 훨씬 나은 것으로 압니다.