RAID: 데이터를 안전하게, 더 빠르게! 저장 장치 활용의 핵심 기술

혼자 공부하는 컴퓨터구조 + 운영체제

이 게시글은 혼공학습단(혼공컴운) 14기의 3주차 과제를 포함하고 있습니다.

RAID란 무엇인가요?

RAID는 'Redundant Array of Independent Disks'의 줄임말로, 독립적인 여러 개의 디스크를 마치 하나의 큰 디스크처럼 작동하게 만드는 기술입니다. 단순히 디스크를 합치는 것을 넘어, 데이터를 여러 디스크에 분산 저장하거나 복사본을 만들어 보관함으로써 다음과 같은 이점을 제공합니다.

  • 데이터 안전성 향상: 디스크 하나가 고장 나더라도 데이터를 보호하고 복구할 수 있습니다.
  • 성능 향상: 여러 디스크가 동시에 작동하여 데이터 읽기/쓰기 속도를 높일 수 있습니다.

예를 들어, 1TB 하드디스크 4개를 RAID로 구성하면 단순히 4TB 하나의 하드디스크를 사용하는 것보다 훨씬 뛰어난 성능과 안전성을 기대할 수 있습니다.

다양한 RAID 레벨: 목적에 맞는 선택

RAID는 구성 방식에 따라 여러 '레벨'로 나뉘며, 각 레벨마다 장단점이 명확합니다. 주요 RAID 레벨을 살펴보겠습니다.

1. RAID 0 (스트라이핑): 속도에 올인!

  • 작동 방식: 데이터를 여러 디스크에 블록 단위로 나누어 동시에 저장합니다.
  • 장점: 여러 디스크에서 동시에 읽고 쓰기 때문에 압도적인 입출력 속도 향상을 경험할 수 있습니다.
  • 단점: 디스크 중 단 하나라도 고장 나면 모든 데이터를 잃을 수 있어 데이터 안전성이 매우 낮습니다.

2. RAID 1 (미러링): 데이터 안전이 최우선!

  • 작동 방식: 원본 데이터를 다른 디스크에 완벽하게 복사하여 저장합니다. 마치 거울처럼 데이터를 복제한다고 해서 '미러링'이라고 불립니다.
  • 장점: 디스크 하나가 고장 나도 복사본이 있어 데이터 복구 및 안전성이 매우 높습니다.
  • 단점: 원본과 복사본에 동시에 데이터를 써야 하므로 쓰기 속도가 느릴 수 있으며, 동일한 데이터를 두 번 저장하기 때문에 실제 사용 가능한 용량이 절반으로 줄어들어 비용 효율성이 낮습니다.

3. RAID 4: 패리티를 활용한 효율적인 안전성

  • 작동 방식: 완전한 복사본 대신, 오류 검출 및 복구 정보인 '패리티 비트'를 별도의 디스크에 저장합니다.
  • 장점: RAID 1보다 적은 디스크로도 데이터를 안전하게 보관할 수 있습니다.
  • 단점: 패리티 정보를 저장하는 디스크에 모든 쓰기 작업이 집중되어 병목 현상이 발생할 수 있습니다.

4. RAID 5: RAID 4의 단점 보완

  • 작동 방식: RAID 4의 단점인 패리티 디스크의 병목 현상을 해결하기 위해 패리티 정보를 여러 디스크에 분산하여 저장합니다.
  • 장점: RAID 4보다 효율적이며, 데이터 안전성과 성능의 균형이 좋습니다.

5. RAID 6: 더욱 강력한 데이터 보호

  • 작동 방식: 두 가지 종류의 패리티 정보를 사용하여 오류 검출 및 복구 능력을 한층 강화합니다.
  • 장점: RAID 5보다 데이터 안전성이 더욱 높습니다. 디스크 두 개가 동시에 고장 나도 데이터를 보호할 수 있습니다.
  • 단점: 두 종류의 패리티 정보를 써야 하므로 쓰기 속도가 RAID 5보다 느릴 수 있습니다.

3주차 숙제

 

[혼공컴운] 스택(Stack)과 큐(Queue)

개념 설명

▶ 스택 (Stack)

  • 정의: 스택은 뒤로 넣고 뒤로 금방하는 (Last-In First-Out, LIFO) 구조.
  • 복소 가능 작업:
    • push: 인접 값을 스택의 끝에 추가
    • pop: 스택의 끝에서 값 개발 (제거)
  • 특징:
    • 매우 간단하고 다른 자료구 구성의 기원이 되기도 함
    • 불필요한 값 감지 불가 (LIFO)

▶ 큐 (Queue)

  • 정의: 큐는 지난시점에 넣고 지나지 않은 순서대로 가지고 가는 (First-In First-Out, FIFO) 구조.
  • 복소 가능 작업:
    • enqueue: 값을 큐 끝에 추가
    • dequeue: 큐 첫번째 값 개발 (제거)
  • 특징:
    • 일정 순서대로 값 처리
    • 역순서처리 불가

TypeScript로 스택 구현

// 스택 구현
class Stack<T> {
  private items: T[] = [];

  // push: 값을 뒤에 넣기
  push = (item: T): void => {
    this.items.push(item);
  };

  // pop: 뒤에서 값 개발
  pop = (): T | undefined => {
    return this.items.pop();
  };

  // peek: 최근 값
  peek = (): T | undefined => {
    return this.items[this.items.length - 1];
  };

  // isEmpty: 빈 상태 확인
  isEmpty = (): boolean => {
    return this.items.length === 0;
  };
}

TypeScript로 큐 구현

// 큐 구현
class Queue<T> {
  private items: T[] = [];

  // enqueue: 끝에 값 추가
  enqueue = (item: T): void => {
    this.items.push(item);
  };

  // dequeue: 첫번째 값 개발
  dequeue = (): T | undefined => {
    return this.items.shift();
  };

  // front: 첫번째 값 확인
  front = (): T | undefined => {
    return this.items[0];
  };

  // isEmpty: 빈 상태 확인
  isEmpty = (): boolean => {
    return this.items.length === 0;
  };
}

사용 예제

const stack = new Stack<number>();
stack.push(10);
stack.push(20);
console.log(stack.pop()); // 20

const queue = new Queue<string>();
queue.enqueue("A");
queue.enqueue("B");
console.log(queue.dequeue()); // "A"

1주차 숙제