[Operating System] RAID (Redundant Array of Inexpensive Disk)

2020. 6. 2. 16:11Operating System

(1) capacity, (2) reliability, (3) performance를 위해서 하나의 시스템에서도 여러 개의 디스크를 사용한다.

 

 

JBOB vs RAID

  • JBOB: 각각의 디스크 마다 독립적인 FS가 존재하는 형태. 그냥 용량만 늘어난 것이 전부
  • RAID: 여러 개의 physical disk를 하나의 logical disk와 같이 사용한다. user application과 FS 상에서는 마치 한 개의 disk만 다루는 듯하게 보임.
    • transparent, deployable

 

참고) RAID에 "Inexpensive"라는 단어가 들어간 이유는 말 그대로 값이 싼 디스크 여러 개를 통해 고성능을 낼 수 있도록 만들어졌기 때문이다.

 

RAID 특징

Performance와 Capacity 상의 이점

RAID는 병렬적으로 여러 개의 physical disk를 사용하는데 logical disk를 통해서 마치 한 개의 디스크를 사용하는 듯한 착각을 준다. (Host system에게는 하나의 커다란 디스크를 사용하는 듯하게 보임)

 

Reliability (Fault-tolerance) 

하나의 데이터 instance가 소실되더라도 백업 instance가 존재하여 데이터 보존이 가능하다. 즉, crash가 났을 때 어떤 문제가 발생했는지 감지하고 복원이 가능하다.

 

Fail-Stop Fault Model

디스크는 반드시 WORKING 또는 FAILED 둘 중 하나의 상태에 있어야 한다.
- WORKING: 모든 블록이 R/W 가능하다.
- FAILED: Disk의 정보가 완전히 소실되었다.

즉, 어떤 블록은 R/W가 되는데 어떤 블록은 안 되는 상황이 발생해서는 안 된다.  

 

 

RAID의 인터페이스

1. Logical I/O

I/O 요청을 받으면 어느 disk에 I/O할 것인지 결정하고 한번에 여러 개의 physical I/O를 수행한다. Host system 입장에서는 logical disk에 대해서 한 개의 I/O 요청을 이슈하지만, 실제로는 여러 개의 physical I/O가 수행된다.

 

2. Static Mapping

Logical block과 physical block을 정적으로 매핑한다. 가상 메모리와 물리 메모리 간의 mapping처럼 dynamic mapping이 되면 좋겠지만, disk는 메모리보다 매우 느리기 때문에 dynamic mapping은 비효율적이다. 디스크에서 page table walk를 한다면 매우 시간이 많이 걸릴 것이다.

 

3. Redundancy

 

- Atomicity를 유지하기 위하여 mirroring을 하거나, parity block을 둔다.

- Reliablity와 Space-efficiency 간의 trade-off

 

RAID에서는 atomicity를 위해서 항상 2개의 data copy를 두고, host system에서 logical disk에 write를 했을 때 실제로는 2번의 physical write를 수행한다. 새로 데이터 write를 하는 상황을 생각해보자.

- 첫 번째 copy에 데이터를 성공적으로 write 했다면, 두 번째 copy에도 write를 한다. (만약 두 번째 copy에 write를 하는 도중 문제가 발생했다면 첫 번째 copy를 통해서 다시 write를 할 수 있다.)
- 첫 번째 copy에 write를 하는 도중 문제가 발생했다면, 두 번째 copy에 있는 값을 통해 기존 데이터로 복원이 가능하다.

 

 

내부 하드웨어 구성요소

  • RAID 연산들을 위한 펌웨어인 microcontroller
  • Data block buffering을 위한 DRAM
  • Buffer의 내용을 쓸 disk(non-volatile)
  • Parity 계산을 위한 특별한 로직

 

 


 

여기에서부턴  RAID system을 어떻게 디자인하면 좋을지에 대해서 살펴볼 것이다. 밑에서 살펴볼 각 RAID level 마다 서로 다른 이점과 trade-off가 존재한다.

 

  1. RAID-0: Striping + Chunking
  2. RAID-1: Mirroring
  3. RAID-2, 3는 잘 안 쓰므로 생략
  4. RAID-4: Parity
  5. RAID-5: Rotating-Parity

 

RAID-0: Striping

1. Striping

Striping이란 여러 개의 disk를 묶어서 하나의 커다란 disk로 사용하는 것을 의미한다. 이 때 하나의 디스크에서 striping한다면 병렬화를 통한 이점이 전혀 없기 때문에 서로 다른 디스크에서 하나의 블록씩 묶는다.

 

2. No redundancy 

RAID-0에서는 redundant copy를 두지 않기 때문에 공간 효율성은 좋지만 fault-torelerance가 없다.

 

 

RAID-0 Chunked Version

앞에서처럼 하나의 디스크에서 하나의 블록만 뽑아서 stripe를 만든다면 positioning time이 상당히 아깝다. 따라서 아래의 그림과 같이 하나의 disk에서 chunk 단위로 블록을 뽑고, 그렇게 뽑은 블록들로 stripe를 만든다. (일반적으로는 64K 정도의 큰 chunk를 사용한다.) Chunk size는 무조건 크다고 좋은 건 아니다. 왜냐하면 chunk size가 커질 수록 포지셔닝으로 인한 오버헤드는 줄일 수 있겠지만 병렬성이 떨어지기 때문이다.

 

 

 

1. Capacity: GOOD
RAID-0은 N개의 물리 디스크가 있다면 N배의 용량을 가질 수 있기 때문에 capacity가 뛰어나다.


2. Performance: GOOD
병렬적으로 여러 디스크에 대해 R/W를 할 수 있어서 성능이 좋다.

3. Reliability: BAD
Redundant copy가 존재하지 않기 때문에 좋지 못하다.

 

RAID-1: Mirroring

일단 RAID-1에서도 RAID-0에서처럼 striping을 사용한다. 다만 mirroring을 통해서 redundant copy를 둔 상태에서 striping을 한다.(RAID-10)

 

 

RAID-10

 

RAID-10: 먼저 미러링을 한 뒤에 striping을 한다. (이 방법이 더 성능이 좋다.)
RAID-01: 먼저 striping을 한 뒤에 미러링을 한다.

 

RAID-01

 

    •  
1. Capacity: BAD
RAID-0은 N개의 물리 디스크가 있다면 N/2배의 용량을 가진다. 절반으로 줄어드는 이유는 미러링을 했기 때문이다.

2. Performance: SO SO
Logical write 하나당 physical write 2번이 이루어져야하므로 RAID-0와 비교했을 땐 throughput이 떨어진다. 단 read의 경우엔 2개의 copy 중에 하나만 읽으면 되기 때문에 문제가 되지 않는다.

3. Reliability: GOOD
어떤 disk 하나에서 fail이 난다면 이에 대해 대처가 가능하다. 하지만 완벽하진 못하다. (위의 RAID-10 그림에서 디스크 0번과 디스크 2번에서 동시에 문제가 발생하면 각각 1번, 3번 디스크에 있는 copy를 통해 복원이 가능하지만, 1번, 2번 디스크에 동시에 문제가 발생하면 대처가 불가능하다.)

 

Non-volatile RAM

RAID-1에서 미러링을 통해 crash 상황에 제대로 대처하기 위해서는 시스템이 종료되더라도 값을 보존할 수 있는 non-volatile RAM이 RAID controller에 들어가 있어야만 한다. 디스크에 write를 하는 도중 시스템 crash가 발생하여 컴퓨터가 꺼져버린 상황을 생각해보자. Write 도중에 crash가 발생하였으므로 두 개의 mirrored block 중에 하나에만 값이 업데이트 되어 두 mirrored block은 서로 다른 값을 갖게된다. 이때 문제는 어떤 값으로 복원을 하는 것이 올바른지 알 수가 없는 것이다. 따라서 컴퓨터를 재부팅해도 값이 소실되지 않도록 비휘발성 메모리를 두어야 이러한 상황에 대처 가능하다.

 

 

RAID-4: Parity

RAID-4에서는 디스크 하나에는 parity block을 두어서 RAID-1에서 미러링으로 인해 공간 효율성이 크게 떨어지는 점을 개선하였다.

 

 

  • 위의 그림에서 보듯이 parity 블록에는 같은 row에 있는 block들의 값이 XOR되어 들어간다.
  • XOR을 했을 때 짝수가 나오면 미러링이 제대로 이루어진 상태라는 뜻이므로 정상적인 상태에 해당한다. (단, 서로 다른 두 개(짝수 개)의 데이터가 망가진 경우에도 짝수가 나오므로 이런 경우엔 대처를 할 수가 없다.)
  • XOR을 했을 때 홀수가 나오면 미러링이 제대로 되지 않고 하나의 블록만 업데이트 되었다는 뜻이므로 복원을 하면 된다.

 

Small Write Problem

RAID-4는 random write 시에 오버헤드가 상당히 크다. 왜냐하면 데이터 블록 하나만 수정했음에도 같은 row(stripe)에 있는 데이터를 모두 읽고 XOR 연산을 수행하여 parity block을 업데이트 해줘야 하기 때문이다.

 

1. Capacity: GOOD
parity block 1개의 오버헤드를 제외하면 RAID-0과 동일하다. (N개의 물리 디스크가 있으면 N-1배의 용량)

2. Performance: BAD
Parity block으로 인해 병렬성이 저하된다. Stripe 내에 있는 서로 다른 디스크의 블록들은 병렬적으로 write할 수 있지만, parity 블록은 새로운 값이 업데이트 된 뒤에 XOR를 따로 하고, 그 뒤에 독립적으로 update 하기 때문에 throughput이 상당히 저하된다. 또한 parity 블록이 들어가는 디스크는 어떤 디스크에 write가 되든 간에 항상 함께 업데이트 되어야하므로 request가 몰리는 병목이 발생할 수 있다.

3. Reliability: SO SO
딱 한 개의 disk에 failure가 발생한 상황에 대해서만 대처 가능하다. (홀짝 구분만 가능한 XOR 연산의 특성 때문에) 만약 2개의 failure가 발생하면 문제가 없다고 판단한다.

 

 

RAID-5: Rotating Parity

RAID-5는 RAID-4에서 parity 블록을 각 디스크에 고르게 분배시킴으로써 parity 블록 업데이트의 병목을 감소시켰다. 즉 parity 블록을 둔 디스크 하나에 write request가 집중되는 것을 분산시켰다.

 

 

 

 

1. Capacity: GOOD
parity block 1개의 오버헤드를 제외하면 RAID-0과 동일하다. (N개의 물리 디스크가 있으면 N-1배의 용량)

2. Performance: RAID-4보단 나음
 parity block을 디스크에 분산시켜서 디스크 하나에 요청이 몰리는 병목을 제거하였다.

3. Reliability: SO SO
RAID-4와 마찬가지로 딱 한 개의 disk에 failure가 발생한 상황에 대해서만 대처 가능하다.

 

 

 

 

'Operating System' 카테고리의 다른 글

[Operating System] File System Implementation  (0) 2020.06.02
[Operating System] File System API  (0) 2020.06.02
[Operating System] I/O Devices  (0) 2020.06.02
[Operating System] Scheduling  (0) 2020.01.16
[Operating System] Process  (1) 2020.01.16