본문 바로가기

CS

RAID

질문으로 시작하겠다. 대용량이면서 빠르고 신뢰할 수 있는 디스크를 어떻게 만들까?? 그래서 나온 게 RAID다. Redundant Array of Inexpensive Disk라고 하는데, 간단히 말해서 여러 개의 디스크를 조화롭게 사용하여 고속이면서  대용량의 신뢰할 수 있는 디스크 시스템을 만든다. RAID는 하나의 디스크처럼 행동한다. 용량이 많아지고 신뢰성도 올라간다. 그 이유는 여러 디스크에 중복된 것을 쓸 수 있으니까. 또한 이러한 장점을 transparently 하게 제공한다. 즉 소프트웨어의 변경 없이 디스크를 RAID로 변경 가능하다. 이제 인터페이스와 결함 모델을 살펴보고, 그 후 용량과 신뢰성 그리고 성능을 살펴보자.

파일 시스템이 RAID에 논리적 I/O를 요청하면 RAID는 내부에서 어떤 디스크를 접근해야 요청을 완료할 수 있는지 계산한 후에 하나 또는 그 이상의 물리적 I/O를 발생시킨다. RAID는  특수한 목적을 가진 컴퓨터라고 봐도 좋다. 대신 설계된 전용 소프트웨어를 실행한다. 

RAID를 비교해서 이해하기 위해서는 결함 모델이 있어야 한다. 지금은 디스크 섹터내용이 망가지는 것과 같은 고장들에 대해서는 고려하지 않는다. 

RAID의 평가 방법으로 용량과 신뢰성 그리고 성능을 본다. 이제 RAID를 레벨별로 살펴보자. 

RAID 레벨 0 은 스트라이핑이라는 방식으로 블럭들을블록들을 여러 디스크에 걸쳐서 줄을 긋는 것처럼 저장한다. 디스크 배열의 블록들을 라운드 로빈 방식으로 디스크를 가로질러 펼치는 것이다. 연속적인 청크에 대해 요청받았을 때 병렬성을 가장 잘 활용할 수 있도록 설계되었다. 같은 행에 있는 블록들을 스트라이프라 부른다.

4KB 블럭 1개가 청크

꼭 이렇게 청크를 할 필요 없고 밑에처럼 청크사이즈를 주어도 된다. 스트라이프는 4개의 청크 또는 32KB 크기의 데이터를 저장한다.

2블럭이 청크 크기

작은 청크 크기가 의미하는 것은 많은 파일들이 여러 디스크에 걸쳐서 스트라이프 된다는 말이여 그 결과로 하나의 파일을 읽고 쓰는 데 병렬성이 증가하게 된다. 하지만 블록의 위치를 여러 디스크에서 찾아야 하므로 위치 찾기 시간이 늘어난다. 요청 시간은 여러 디스크에 걸친 요청들 중에 가장 오래 걸린 찾기 시간에 의해 결정된다.

반면 큰 청크는 파일 내의 병렬성은 줄어들고 높은 처리 성능을 얻으려면 여러 요청을 병행하게 실행해야 함. 하지만 큰 청크 사이즈의 경우 위치 찾기 시간은 줄어든다.

스트라이프는 N*B개의 디스크 용량을 갖는다. 하지만 신뢰성 측면에서 하나의 디스크라도 고장나면 데이터 전체가 손실된다. 성능은 병렬로 I/O를 처리할 수 있기 때문에 좋다.

RAID 성능을 분석하기 위해서는 두 가지 다른 성능 척도를 고려해야 한다. 하나는 단일 요청 지연 시간이다. 두 번째는 정상 상태에서의 처리 성능이다. 병행 요청의 전체적인 대역폭을 말한다. 또한 워크로드도 2가지로 순차와 랜덤으로 평가한다. 그럼 RAID-0에서의 평가를 해보자. 요청의 지연 시간은 하나의 디스크에 대한 요청의 지연 시간과 거의 동일하다. 정상 상태에서의 대역폭 측면에서 시스템의 최대 대역폭을 기대할 수 있다.  랜덤 I/O 경우에도 모든 디스크를 다 사용할 수 있기 때문에 N*R MB/s 를 얻을 수 있다.

다음은 RAID 1: 미러링에 대해서 알아보자.  이건 각 논리 블럭에 대해 두 개의 물리적 사본을 둔다고 가정한다.

이 방식은 RAID-10 이라 불린다 미러링 한 것을 스트라이프 했기 때문이다. 반대로 스트라이핑 한 후에 미러링 하는 방식은 RAID-01이라고 한다. 미러링 된 배열에서 블록을 읽을 때 RAID는 원본을 읽을 건지 사본을 읽을건지 선택할 수 있다. 반면에 블록을 쓰는 경우에는 둘 다 써야 한다. 성능을 분석해 보자. 용량 측면에서는 유효 용량이 (N*B) /2 가 된다. 신뢰성 측면에서는 RAID-1 좋다. 디스크 중 어느 것에서 고장 발생해도 감내할 수 있다. 2곳에서 고장 나도 상관없지만 일반적으로 한 개의 디스크 고장은 확실히 감내할 수 있다고 볼 수 있다. 성능을 보면 쓰기 연산이 병렬적으로 실행되어도 물리적으로 두 개의 쓰기 연산이 종료될 때까지 대기해야 하므로, 그 지연시간은 두 개의 요청 중 최악의 탐색과 회전 지연 시간에 의해 결정됨. 성능을 한번 보자 순차 읽기 쓰기의 경우에 둘 다 전체 대역폭을 얻을 수 없다.  (N/2 *S) MB/s 가 된다. 랜덤 읽기가 미러링 된 RAID에서는 최고의 워크로드이다. 모든 디스크를 다 사용함. 랜덤 쓰기는 N/2*R MB/s 를가진다.

RAID-4 , RAID-5 여기서는 패리티를 사용하는데 4 랑 5랑 다른 점은 패리티로 쓰이는 디스크가 순환하기 때문에 랜덤 쓰기 요청을 병렬적으로  처리할 수 있다. 패리티란 각 디스크의 비트들을 xor 연산하여 스트라이프 내에 중복 정보를 알 수 있다.  미러링 방식보다 공간을 더 효율적으로 사용 가능. 밑의 예시를 보면 이해가 빠르다.

디스크에 값 경신할 때 2가지 방법 가산적 감산적 방법이 있는데, 디스크에 따라 다르게 사용하면 된다. 감산적 방법은 새로운 값과 이전 값을 비교하여 같다면 당연히 패리티 값 그대로이고 다르다면 패리티 비트를 반전시켜줘야 한다. 반면  가산적 방법은 그냥 새로 들어온 애랑 다른 디스크 값들 다 읽어서 XOR 연산한다. 디스크를 더 읽어야 돼서 비용 더 든다. 위에서 말한 small write 문제, RAID-4의 경우 패리티 디스크를 둘 다 읽어야 하니 병렬적인 처리를 해도 순서대로 처리하기를 기다려야 하는 문제를 RAID-5에서 바꾼 거 말고는 다 비슷하다. 성능 가장 좋다.

'CS' 카테고리의 다른 글

크래시 일관성 : FSCK와 저널링  (0) 2021.10.28
파일 시스템 구현  (0) 2021.10.26
하드 디스크 드라이브  (0) 2021.10.25
입/출력 장치 개념  (2) 2021.10.25
Threads  (0) 2021.10.22