운영체제 아주 쉬운 세가지 이야기 17주차(RAID)

2025. 12. 29. 18:15개념 공부

RAID 정리

RAID(Redundant Arrays of Inexpensive Disks)는 “여러 개의 디스크를 묶어서 하나의 큰 저장장치처럼” 보이게 만들면서, 성능(병렬 I/O)과 내구성(디스크 고장 대응)을 동시에 얻기 위한 설계입니다. 핵심은 OS/파일시스템 위에 RAID 레이어가 있고, 이 레이어가 논리 블록 주소(Logical Block Address)물리 디스크 + 물리 오프셋으로 매핑한다는 점입니다.


1) RAID를 이해하는 3가지 질문

  • Capacity(용량): N개의 디스크(각 B 용량)를 묶을 때 “실제로 쓸 수 있는” 용량은?
  • Reliability(신뢰성): 디스크가 고장 났을 때 데이터를 복구할 수 있나? 몇 개까지 버티나?
  • Performance(성능): 순차/랜덤 읽기/쓰기가 어떻게 변하나? 병목은 어디서 생기나?

RAID는 “성능/가용성”을 위한 장치이지, 백업(논리적 실수/삭제/랜섬웨어 복구)가 아닙니다. 운영에선 RAID + 스냅샷/백업/복제 전략을 분리해서 설계하세요.


2) RAID의 핵심: Striping(스트라이핑)과 Chunk Size

2-1. Striping이란?

하나의 큰 파일(연속 블록들)을 “디스크 여러 개에 나눠” 저장해 병렬로 읽고 쓰는 방식입니다. 예를 들어 chunk size가 C(블록 단위)라면, 논리 블록 x는 대략 아래처럼 매핑됩니다.

disk_index   = (x / C) % N
disk_offset  = (x / (C*N)) * C + (x % C)
  • Chunk size가 작으면: 작은 요청도 디스크들이 번갈아 처리 → 병렬성↑ (하지만 seek/오버헤드, “요청 쪼개짐” 비용)
  • Chunk size가 크면: 큰 순차 I/O에 유리, 작은 랜덤 I/O는 한 디스크에 몰릴 수 있음

실무에서 chunk size가 중요한 이유
“내 워크로드가 주로 큰 순차 스트림(백업/미디어)인지, 작은 랜덤(OLTP/로그)인지”에 따라 최적값이 달라집니다. RAID를 ‘레벨’만으로 고르면 망하고, chunk size + I/O 패턴까지 같이 봐야 합니다.


3) RAID-0: Striping만 하는 경우 (성능↑, 내구성×)

  • 아이디어: 데이터만 N개 디스크에 분산 저장 (패리티/미러 없음)
  • Capacity: N · B
  • Reliability: 한 디스크만 죽어도 전체 데이터 손실
  • 성능(직관): 순차 읽기/쓰기에서 N개 디스크를 다 활용 → 대역폭이 N배에 가까움

RAID-0는 “고장나도 괜찮은 캐시/임시 데이터/재생성 가능한 결과물”에만 쓰세요. 실서비스 원본 데이터에 RAID-0만 쓰는 건 ‘시간 문제’입니다.


4) RAID-1: Mirroring (용량 절반, 읽기↑, 쓰기≈, 복구 단순)

RAID-1은 데이터를 “두 벌” 저장합니다. 논리 블록 x를 쓸 때 두 디스크에 같은 내용을 씁니다.

  • Capacity: (N · B) / 2
  • Reliability: 1개 고장은 확실히 버팀 (2개도 “운 좋으면” 가능하지만 보장 아님)
  • Random Read: 읽기는 복제본 중 하나를 골라 분산 가능 → 병렬성↑
  • Write: 쓰기는 두 군데에 써야 해서 이론상 “한 번의 write가 두 번의 물리 write”로 바뀜

실무 관점
RAID-1은 운영이 단순합니다. “성능이 조금 덜 나와도 안정적으로 굴리는” 서비스에서 여전히 많이 씁니다. 특히 작은 랜덤 읽기가 많은 워크로드에서 이점이 큽니다.


5) RAID-4: Parity(패리티)로 공간 아끼기 (하지만 small-write가 아픔)

5-1. 패리티의 핵심: XOR로 “1개 블록 손실” 복구

RAID-4는 한 stripe(데이터 블록 N-1개)마다 parity 블록 1개를 둡니다. 패리티는 XOR로 계산합니다. 어느 한 블록이 날아가도 나머지 블록들과 패리티로 복구 가능합니다.

P = B0 XOR B1 XOR ... XOR B(N-2)
(어떤 블록 하나가 사라지면)
missing = P XOR (나머지 블록들 XOR)
  • Capacity: (N − 1) · B
  • Reliability: 디스크 1개 고장까지 복구 가능

5-2. Full-stripe write(큰 순차 쓰기)는 빠르다

큰 덩어리로 “stripe를 통째로” 채우는 쓰기라면, 패리티를 한 번 계산해서 데이터+패리티를 병렬로 쓰면 됩니다(효율적).

5-3. 진짜 문제: Small random write(read-modify-write)

문제는 “블록 1개만 덮어쓰기” 같은 작은 랜덤 write입니다. 데이터 블록만 바꾸면 패리티가 깨지기 때문에 패리티도 업데이트해야 하고, 그 과정에서 읽기 2번 + 쓰기 2번이 발생하기 쉽습니다. (대표적으로 old data + old parity를 읽고, new parity 계산 후 data/parity를 쓰는 흐름)

Small-write가 비싼 이유를 한 문장으로
“패리티는 ‘stripe 전체’의 요약값이라, 블록 하나만 바꿔도 요약값을 다시 맞춰야 해서” 추가 I/O(read-modify-write)가 강제로 붙습니다.


6) RAID-5: Rotating Parity (RAID-4의 parity-disk 병목을 줄인다)

RAID-5는 RAID-4와 거의 같지만, 패리티 블록을 “항상 같은 디스크”에 두지 않고 stripe마다 디스크를 돌려가며 배치합니다. 즉, RAID-4의 parity 디스크 1개에 쓰기/읽기가 몰리는 병목을 완화합니다.

  • Capacity: (N − 1) · B (RAID-4와 동일)
  • Reliability: 1개 디스크 고장까지 복구 (RAID-4와 동일)
  • 차이(핵심): 랜덤 write에서 “패리티 업데이트” 트래픽이 한 디스크로 몰리지 않아 병렬성↑

실무 감각
RAID-5는 “공간 효율(미러보다 좋음)”과 “쓰기 성능(패리티 병목 완화)” 사이의 타협안입니다. 다만 small-write의 read-modify-write 자체가 사라지는 건 아니고, 병목을 분산시키는 것이 핵심입니다.


7) 한 눈에 보는 비교 요약

레벨 용량 고장 허용 강점 약점
RAID-0 N·B 0 최고의 순차 성능/병렬성 1개만 죽어도 전체 손실
RAID-1 (N·B)/2 1 (확실) 운영 단순, 랜덤 읽기 강함 공간 2배 비용
RAID-4 (N-1)·B 1 공간 효율, 큰 순차 쓰기(Full-stripe) 효율 parity 디스크 병목 + small-write 비용
RAID-5 (N-1)·B 1 parity 병목 분산, 랜덤 write 병렬성↑ small-write의 read-modify-write 자체는 남음

8) “선택 가이드 + 체크리스트”

8-1. 워크로드 기준 빠른 선택

  • 읽기 위주(특히 작은 랜덤 읽기): RAID-1이 단순하고 강력
  • 큰 순차 스트림(백업/ETL/미디어): RAID-0(데이터가 재생성 가능할 때), 또는 RAID-4/5(내구성 필요할 때)
  • 공간도 아끼고 내구성도 필요: RAID-5 (단, 쓰기 패턴과 small-write 비중 확인)

8-2. 운영에서 터지는 포인트(현실)

  • small-write가 많은가? → 패리티 RAID(4/5)는 read-modify-write로 생각보다 느릴 수 있음
  • chunk size를 워크로드에 맞췄나? → “레벨”보다 “chunk size”가 체감 성능을 좌우하는 경우가 많음
  • 고장 복구(rebuild) 중 성능 저하를 감당할 수 있나?
  • RAID는 백업이 아니다 → 논리 삭제/암호화/운영 실수는 복구 못 함

최종 한 줄
RAID는 “디스크 고장”이라는 물리 문제를 다루는 기술이고, 실서비스 안정성은 “RAID + 백업/스냅샷/모니터링 + 테스트된 복구 절차”의 합으로 나옵니다.


9) 복습용 한 문장 문제

Q. “RAID-4에서 작은 랜덤 write가 유독 느려지는 이유를 ‘패리티 갱신’ 관점에서 설명하고, RAID-5의 rotating parity가 그 문제를 어떤 방식으로 ‘완화’하는지 한 단락으로 정리해보세요.”

(이 문제의 포인트: RAID-4는 parity 디스크가 병목이 되기 쉬운 구조이고, RAID-5는 parity를 분산시켜 병목을 완화하지만 read-modify-write 자체가 사라지는 건 아니라는 점)