[운영체제/OS] 레이드(RAID; Redundant Array of Independent Disks)
kindof
·2021. 10. 6. 15:39
[이전 포스팅]
🤔 레이드(RAID)?
레이드(RAID)는 쉽게 말해서 값싼 디스크를 여러 개 사용해서 대용량으로 쓴다는 개념입니다.
이 방식은 여러 개의 디스크에 데이터를 나눠서 저장하기 때문에 데이터를 읽고 쓸 때 병렬 처리가 가능합니다. 그러면 I/O 작업에 대한 Throughput이 높아질 수 있고, 하나의 디스크가 터져도 다른 디스크에 백업을 해둠으로써 데이터의 다중성(Redundancy)을 확보할 수 있죠.
한편 Redundancy를 확보하는 방법에는 Mirroring, Parity라는 두 가지 방법이 존재하는데요. 레이드를 어떻게 구축하는지 레이드 레벨에 따른 방법을 살펴보면서 같이 이야기해보겠습니다.
📖 1. RAID 0(Striped Disks)
RAID 0 방식은 디스크 여러 개에 데이터를 나눠서 저장하는 방식입니다. 다만 여러 디스크에는 서로 다른 데이터만을 저장하기 때문에 하나의 디스크가 터지면 데이터를 복구할 방법이 없습니다.
결국 병렬 처리를 통한 Throughput은 올라가지만 Redundancy는 없는 방법이죠.
📒 2) RAID 1(Disk Mirroring)
RAID 1 방식은 디스크 여러 개에 똑같은 데이터를 집어넣습니다. 이렇게 하면 Read를 할 때 여러 디스크에 동시 접근해서 읽을 수 있기 때문에 퍼포먼스가 향상되고, 데이터를 백업해두었기 때문에 Redundancy도 확보할 수 있죠.
하지만 데이터를 쓸 때에는 매 번 여러 디스크에 다 Write해줘야하기 때문에 이에 드는 오버헤드가 좀 큽니다. 그럼에도 불구하고 기업의 서버같은 경우 Redundancy를 확보하기 위해 사용하는 방법이기도 합니다.
📊 3) RAID 3(Striped set with dedicated parity)
RAID 3 방식은 여러 개 디스크에 Striped한 방식으로 각기 다른 데이터들을 저장해놓고, 하나의 패리티 디스크(Parity disk)에 백업용으로 다른 데이터들을 모두 저장해놓는 방식입니다.
패리티(Parity)는 어떤 오류가 발생했을 때 데이터를 재구축하는 데 사용되는 계산된 값인데요. 그림에서 알 수 있듯이 다른 디스크 배열(Disk Array)의 자리에 있는 "1"의 개수를 기준으로 합니다. 1이 짝수개 존재하면 Parity값은 0이 되고, 1이 홀수개 존재하면 Parity 값은 1이 됩니다. 이 이유는 패리티가 기본적으로 XOR 연산을 기반으로 만들어지기 때문인데요. XOR 연산은 서로 다르면 1, 같으면 0을 리턴합니다. 따라서 데이터의 비트들을 차례대로 XOR 연산하면 1의 개수가 짝수일 때(1과 0의 개수가 서로 짝이 맞는다) 0이 되는 것입니다.
한편 패리티를 이용해 어떻게 오류를 검출하고 데이터를 복원할까요?
RAID3 에서는 "바이트 단위"로 데이터가 나위어져 각 디스크들에 저장되고, "바이트 단위의 패리티 데이터"들이 패리티 디스크에 저장됩니다. 예를 들어 10101011 01010111 이라는 16비트의 데이터가 있다고 해볼까요? 그러면 이 데이터를 바이트 단위로 쪼개면 10101011, 01010111 이라는 두 개의 바이트로 쪼개집니다.
그러면 디스크 하나에 첫번째 바이트를 넣어두고, 두번째 디스크에 두번째 바이트를 넣어줍니다. 그리고 패리티 디스크는 다른 디스크들의 각 비트를 XOR 연산해서 하나의 바이트 데이터를 만들고 이를 저장하는 것이죠.
Disk1 : 10101011
Disk2: 01010111
Parity: 11111100
이 때 Disk2의 데이터가 날라갔다고 해볼까요? 그러면 Disk1의 데이터와 Parity의 데이터를 역으로 계산해서 Disk2를 복원할 수 있습니다. 이해가 되시나요?
한편, RAID 3는 효율성도 좋고 패리티 디스크를 이용해 Redundancy도 확보할 수 있어서 좋은 것 같지만 단점도 존재합니다.
예를 들어 어떤 디스크(D0)에 새로운 데이터를 쓰려고 하면 1) 기존에 있던 D0를 읽고(Read), 2) 기존 Parity를 읽고(Read), 3) 새로운 데이터를 D0에 쓰고(Write), 4) Parity 데이터에도 쓰는(Write) 작업이 필요합니다. 즉, 두 번의 Read/Write 작업으로 인한 오버헤드가 발생하는 것이죠. 이를 Small Write Problem이라고도 합니다.
또한 궁극적으로 패리티 디스크가 박살나면 말짱 도루묵이 된다는 점도 치명적인 약점이 됩니다.
💻 4) RAID 5(Striped set with distributed parity)
RAID 5 방식은 패리티 블록을 각각의 디스크에 나눠서 저장하는 방식입니다. RAID 1처럼 어느정도 데이터 안정성을 확보하면서 RAD 0처럼 성능도 좋은 방식을 채택한 것이죠. 즉, RAID 3에서 패리티 값을 하나의 디스크에 몰빵했다면 RAID 5는 데이터를 처리할 때마다 각 디스크들이 돌아가며 패리티 정보를 저장합니다.
한편, RAID 5 역시 패리티 정보들을 디스크에 분산해서 저장하기 때문에 전체 패리티 값은 디스크 하나의 분량만큼을 차지합니다. 따라서 실제로 데이터를 저장하는 데 사용할 수 있는 디스크는 "전체 디스크 수 - 1"이 됩니다.
지금까지 RAID 기법에 대해 공부를 해봤습니다.
학교에서 교수님이 설명해주신 내용을 바탕으로 정리해서 RAID 0,1,3,5에 대해서만 정리가 됐는데요. 글을 쓰면서 다른 자료들을 찾아보다 보니 RAID를 설계하는 방식에는 정말 많은 방법이 있는 것 같습니다.
더 많은 내용이 궁금하신 분은 아래 블로그를 쓰신 분이 잘 정리한 것 같아서 한 번 참고해보세요!
'CS > OS' 카테고리의 다른 글
[운영체제/OS] Blocking / NonBlocking, Sync / Async (4) | 2021.12.02 |
---|---|
[운영체제/OS] 동기화 이슈 처리하기 - (2) (2) | 2021.09.24 |
[운영체제/OS] 시스템 콜(System Call)에 대한 간단한 정리 (0) | 2021.09.23 |
[운영체제/OS] 디스크 구조와 I/O 작업 스케줄링 (0) | 2021.06.14 |
[운영체제/OS] 프레임 할당(Frame allocation)과 Page fault 관련 기타 이슈들 (1) | 2021.06.14 |