Profile picture

[Linux] 리눅스 레이드(RAID)에 대해 알아보고 구성해보기

JaehyoJJAng2023년 06월 26일

RAID를 쓰는 이유

서버를 운영함에 있어서 서버 관리자가 겪게 되는 제일 큰 고충은 하드디스크 장애로 인한 데이터 유실일 것이다.

하드디스크는 평생 가는 부품이 아니다. 소모품이기에 언제든 고장날 수 있고, 특히 input/output이 많은 서버에서는 하드디스크의 고장이 잦을 확률이 높다.


데이터는 절대적으로 손실이 되서는 안되는 중요한 자산이기에 백업이 절대적으로 필수적이다.

뿐만 아니라, 여분의 디스크가 생겨 서버에 용량을 증설하려고 할 때 데이터 손실 없이 클린하게 서버 용량을 증설해야 하는 경우가 생길 수 있다.

그래서 서버 관리자는 RAID 구성을 통해 하드디스크의 가용성을 높이고 서버 데이터의 안정성을 확보하기 위해 여러 노력을 해야한다.


실무에서의 RAID 사용?

그렇다면 실무에서는 어떤 목적으로 RAID를 사용하는 걸까?

  • 물리 서버 스토리지 어레이(SAN/NAS)나 고성능 스토리지에 주요 사용함.
  • 하드웨어 RAID 카드 -> DB·파일서버·가상화 플랫폼에서 고가용성 및 안정성 보장
  • 소프트웨어 RAID (mdadm) 저비용 소규모 서버나 테스트 환경에서 사용

참고로 이번 포스팅에서는 소프트웨어 RAID를 기반으로 실습을 진행할 예정이다.


RAID

RAID는 Redundant Array of Inexpensive Disks의 약자이다. 여러 개의 디스크를 배열하여 속도의 증대, 안정성의 증대, 효율성, 가용성의 증대를 높이는데 쓰이는 기술이다.


RAID의 장점

  1. 운용 가용성, 데이터의 안정성 증대
  2. 디스크 용량 증설 용이
  3. 디스크 I/O 성능 향상

📌 패리티(Parity)는 무엇인가?
1. 정수의 홀수 또는 짝수 특성
2. 정보 블록과 연결된 중복 정보, Parity는 오류 발생 시 데이터를 재구축하는데 사용되는 계산된 값이다.


RAID 장치명 level raid-device
RAID 0 /dev/md0 0 2
RAID 1 /dev/md1 1 2
RAID 5 /dev/md5 5 3
RAID 6 /dev/md6 6 4
RAID 10(1+0) /dev/md10 10 4

[장치명은 RAID명을 나타내기 위한 예시이므로 다른 이름을 사용해도 무방]


RAID 0

RAID 0에는 Concatenate 방식과 Stripe 방식 두 가지 방식이 존재한다.


Concatenate

  • 두 개 이상의 디스크에 데이터를 순차적으로 쓰는 방법

image


  • 장점
    • 디스크 기본 공간 부족 시 데이터는 보존하며 여분의 디스크를 볼륨에 포함하여 용량 증설 가능
  • 단점
    • RAID 0의 특성 상 디스크 중 어떤 디스크 하나에 장애 발생 시 전체 데이터 복구가 매우 어렵고, parity(오류검출기능)를 지원하지 않는다.
  • 용량
    • 모든 디스크의 용량을 합친 용량 (200GB disk * 2ea = 400GB)

Stripe

  • 흔히 RAID 0이라고 하면 Stripe 방식을 뜻함.

스트라이핑(stripe or striping) 이라고 불리는 RAID 0 방식은
두 개 이상의 디스크에 데이터를 랜덤하게 쓰는 방법이다.
image


  • 장점
    • 데이터를 사용할 때 I/O를 디스크 수 만큼 분할하여 쓰기 때문에 I/O 성능이 향상됨.
    • I/O Controller나 I/O Board 등 I/O를 담당하는 장치가 별도로 장착된 경우 더 큰 I/O 성능 향상을 기대할 수 있음.
  • 단점
    • RAID 0의 특성 상 디스크 중 어떤 디스크 하나에 장애 발생 시 전체 데이터 복구가 매우 어렵고, parity(오류검출기능)를 지원하지 않는다.
  • 용량
    • 모든 디스크의 용량을 합친 용량 (200GB disk * 2ea = 400GB)

RAID 1

미러링 이라고 불리는 RAID 1은 두 개 이상의 하드디스크를 이용해 저장하는 데이터를 다른 한쪽에도 똑같이 복사해 저장하는 방법이다
image


  • 장점
    • 볼륨 내 디스크 중 하나의 디스크만 정상이더라도 데이터는 보존되어 운영이 가능하기 때문에 가용성이 높다.
    • 복원이 비교적 매우 간단하다.
  • 단점
    • 용량이 절반(50%)으로 줄고, 쓰기 속도가 느려짐.
  • 용량
    • 모든 디스크의 절반(50%)의 용량 (200GB * 2ea = 200GB)

RAID 2

RAID 2는 데이터 저장용 디스크와 복구용 디스크를 나누어 저장한다. 이 때 데이터 저장시 RAID 0와 같은 스트라이핑 방식을 사용하며 데이터 복구에는 해밍 코드를 통해 데이터 복구를 수행함
image
하지만 RAID 4의 등장으로 RAID 2는 사용하지 않는다


RAID 3,4

RAID 3,4는 RAID 0,1의 문제점을 보완하기 위해 등장한 것으로 3,4로 구분되어 있지만 둘의 구성은 비슷하다.
데이터의 저장은 RAID 0와 같이 스트라이핑으로 수행하고 추가적으로 에러체크 및 복구를 위한 parity 정보를 별도의 디스크에 따로 저장한다
image
3,4의 차이점은 3의 경우 byte 단위로 데이터를 저장하고 4는 block 단위로 데이터를 저장한다는 차이를 가진다. block 단위로 데이터 저장 시 데이터의 크기가 작은 파일은 한 번의 작업으로 데이터를 읽을 수 있기 때문에 성능상의 장점이 있고 3은 동기화 과정을 거처야 하기 때문에 3보다는 4을 더 많이 사용한다

또한 RAID 3은 적어도 3개 이상의 하드디스크가 필요한 반면, RAID 4는 2개 이상의 하드디스크만 있으면 구성이 가능하다


RAID 5

RAID 5는 3,4의 단점을 보완한 방식으로 가장 많이 사용되는 방식 중 하나이다. parity 정보를 한 디스크에 몰아서 저장하는 것이 아닌 모든 디스크에 분산하여 저장한다. 따라서 3개 이상의 디스크를 필요로 하며 RAID 3, RAID 4에서 패리티를 저장하는 디스크와 정보를 저장하는 디스크 1개가 동시에 망가질경우 데이터 복구가 불가능하다는 단점을 5에서는 보완하였다
image


  • 장점
    • RAID 3,4에서 별도의 패리티 정보 디스크를 사용함으로써 발생하는 문제점 보완
    • 패리티 정보를 stripe로 구성된 디스크 내에서 처리
    • 1개의 하드가 고장나더라도 남은 하드들을 통해 데이터 복구

RAID 6

RAID 6는 5와 같은 개념으로 사용하지만 parity 정보를 하나 더 넣어 여러 하드에 문제가 생겨도 데이터 복구를 가능하게 하여 안정성에 더욱 신경 쓴 방법이다.
image
데이터가 스트라이핑으로 저장되기 때문에 0+1이나 1+0 보다 성능과 신뢰성이 좋지만 2차 parity 정보를 저장하면서
읽기 성능은 5와 비슷해졌고 데이터를 쓰는 경우 작업의 구현이 매우 복잡해지기 때문에 일반적으로 잘 사용이 되지는 않고있다.


RAID 0+1

RAID 0+1 은 0과 1을 동시에 구현한 방식이다. 먼저 스트라이핑한 디스크를 생성 후 스트라이핑 한 디스크들을 미러링 방식으로 묶어서 구현
image
RAID 0의 장점인 속도 증가와 RAID 1의 데이터 백업을 동시에 지원함


RAID 1+0

0+1과는 거꾸로 RAID 1을 사용해 미러링으로 구성. 그리고 미러링으로 구성된 디스크들을 스트라이핑을 통해 묶는 방식을 수행
image
0+1과 1+0은 같은 동작을 하는 것 처럼 보여 두 RAID 간 무슨 차이점이 있는지 의아함이 생길 수 있다.
물론 둘은 최종적으로 생성되는 디스크의 용량과 속도가 같지만 디스크의 안정성과 디스크의 복구 성능에서 차이가 발생한다.


안정성 측면

RAID 01은 디스크 0과 2가 동시에 망가질 경우 모든 디스크가 먹통이되지만 10은 0 과2가 동시에 망가져도 전체 디스크가 동작하는데 문제가 없다. 물론 10도 디스크 0과 1이 동시에 망가진다면 전체 디스크가 깨지지만 전체 디스크가 망가질 확률이 01보다 적으므로 안정성 측면에서 RAID 10이 좀더 좋다고 할 수 있다.


복구 측면

망가진 디스크의 복구과정 에서 01의 경우 디스크 0번이 망가진 경우 0번 디스크를 교체한후 재구성하게 되면 디스크 2, 3번으로 구성된 RAID 0 전체가 복사되지만 RAID 10의 경우 0번 디스크를 교체했다면 1번 디스크에서 복사를 하게되어 리소스의 비용이 훨씩 적게들어 시간이 단축된다.


레이드(RAID) 실습해보기!

지금까지 배운 RAID 이론을 기반으로 실무에서 자주 사용하는 레이드 기법 두 가지를 직접 구성해보고,

RAID를 강제로 깨뜨려 복구하는 방법까지 공부해보자.

준비물!

  • RAID 실습을 위한 하드디스크 할당
    • RAID 1: 디스크 2개 이상
    • RAID 5: 디스크 3개 이상

RAID 1 (미러링) 구성

  • 필요 하드디스크: 최소 2개
    • RAID 1 구성에는 하드디스크가 최소 2개는 필요하다.

구성 방법

1. 디스크 추가

VM에 두 개의 디스크를 장착해주자. 각 디스크는 실습을 위한 것이므로 10GB 정도로 설정하면 충분하다.
image


장착이 잘 되었는지 서버로 들어가 lsblk 명령어로 확인해보자.
image
sdb, sdc가 정상적으로 보인다.(사용자 환경에 따라 다른 이름으로 표시될 수 있음.)


2. RAID 패키지 설치

sudo apt update -y
sudo apt install mdadm -y

3. RAID 1 배열 생성

위에서 lsblk/dev/sdb/dev/sdc가 추가된 것을 확인하였으니, 아래 명령어를 실행하여 RAID 1 배열을 생성해주자.

sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

image


  • --create /dev/md0: RAID 디바이스를 /dev/md0으로 생성
  • --level=1: 레이드 레벨을 1로 지정
  • --raid-devices=2: 레이드 디바이스를 2개로 지정
  • /dev/sdb /dev/sdc: RAID로 묶을 디스크 명시

* 여기서 말하는 레이드 배열은 다음과 같다.

RAID 배열은 RAID 시스템을 구성하는 논리적인 디스크 그룹을 의미한다.

물리적으로 여러 개의 하드디스크가 RAID 설정에 따라 하나의 단위로 묶이게 되는데, 이 묶인 디스크들의 집합을 RAID 배열(RAID Array) 라고 한다.


쉽게 말하면, 여러 개의 물리적인 디스크를 RAID 기술로 결합해 하나의 큰 가상 디스크처럼 다루는 것을 RAID 배열 이라고 생각하면 된다.


4. RAID 배열 확인

cat /proc/mdstat

image


여기서 각 항목이 나타내는 의미는 다음과 같다.

  • md0: 이 이름은 RAID 배열의 디바이스 이름을 나타낸다.
  • active: RAID 배열의 상태를 나타낸다. active는 해당 배열이 정상 동작 중인 것을 의미한다.
    • inactive: RAID 배열이 비활성 상태임을 나타냄. 이는 RAID 배열이 중지되었거나, 구성된 디스크가 모두 작동하지 않거나 RAID 배열이 제대로 인식되지 않았을 때 발생할 수 있음.
    • degraded: RAID 배열이 정상 동작하지만, 하나 이상의 디스크가 비정상 상태에 있음을 의미함. RAID 1이나 RAID 5의 경우 하나의 디스크가 실패해도 배열은 계속 동작하지만 성능 저하가 우려됨.
    • failed: RAID 배열에 포함된 디스크가 고장나거나 RAID 배열 자체가 실패했음을 의미함. 이 상태가 뜬다면 데이터를 복구하기 위한 조치가 신속하게 이루어져야 함.
    • rebuilding: RAID 배열이 현재 복구 중임을 의미함. 일반적으로 RAID 배열에 새로운 디스크를 추가하거나 고장난 디스크를 교체했을 때 나타나며, RAID 관리 소프트웨어가 데이터를 새 디스크에 동기화하고 있음.
    • suspended: RAID 배열이 일시 중지된 상태.
    • removed: RAID 배열에서 디스크가 제거된 상태
  • raid1: 사용된 RAID 레벨
  • sdc[1] sdb[0]: 배열에 포함된 디스크 이름과 인덱스
  • 10476544 blocks: 총 블록 수 (용량)
  • super 1.2: 메타데이터 형식
  • [2/2]: 총 디스크 수와 정상 디스크 수
  • [UU]: 디스크 상태 (모두 정상)

5. 파일시스템 생성 및 마운트

sudo mkfs.ext4 /dev/md0
sudo mkdir /mnt/raid1
sudo mount /dev/md0 /mnt/raid1

image



6. RAID 1 설정 파일 업데이트

RAID 설정을 영구화하기 위해 /etc/mdadm/mdadm.conf 파일을 다음과 같이 업데이트하자.

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

image


  • mdadm --detail --scan: 현재 시스템에서 사용 중인 RAID 배열의 정보 스캔하여 출력
  • update-initramfs -u: 부팅 과정에서 사용되는 initramfs(초기 램 디스크 이미지) 를 업데이트하는 명령어.
    • initramfs는 리눅스 커널이 파일 시스템을 마운트하기 전에 필요한 드라이버나 설정을 포함한 초기 파일 시스템이다.

복구 테스트

1. 디스크 장애 시뮬레이션

한 개의 디스크(/dev/sdc)를 장애 상태로 설정

sudo mdadm /dev/md0 --fail /dev/sdc

image


2. 장애 디스크(/dev/sdc) 제거

/dev/sdc를 RAID에서 제거해주자

sudo mdadm /dev/md0 --remove /dev/sdc

image


3. 새 디스크 추가 및 복구

새로운 디스크를 추가해줄거다.
image


추가된 디스크를 lsblk로 확인해보자.
image


마지막으로 추가한 디스크(/dev/sdd)를 RAID에 추가해주고 복구를 시작하자.

sudo mdadm /dev/md0 --add /dev/sdd

RAID 5 (스트라이핑 + 패리티) 구성

  • 필요한 하드디스크: 최소 3개

구성 방법

1. 디스크 추가

VM에 세 개의 디스크를 장착해주자. 각 디스크는 실습을 위한 것이므로 10GB 정도로 설정하면 충분하다.
image


장착이 잘 되었는지 서버로 들어가 lsblk 명령어로 확인해보자.
image
/dev/sdb, /dev/sdc, /devsdd가 정상적으로 보인다.(사용자 환경에 따라 다른 이름으로 표시될 수 있음.)


2. RAID 5 배열 생성

위에서 lsblk/dev/sdb/dev/sdc, /dev/sdd가 추가된 것을 확인하였으니,

아래 명령어를 실행하여 RAID 5 배열을 생성해주자.

sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

image


3. RAID 배열 확인

cat /proc/mdstat

image


4. 파일시스템 생성 및 마운트

sudo mkfs.ext4 /dev/md0
sudo mkdir /mnt/raid5
sudo mount /dev/md0 /mnt/raid5

5. RAID 5 설정 파일 업데이트

RAID 설정을 영구화하기 위해 /etc/mdadm/mdadm.conf 파일을 업데이트하자.

sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
sudo update-initramfs -u

복구 테스트

1. 디스크 장애 시뮬레이션

한 개의 디스크(/dev/sdd)를 장애 상태로 설정

sudo mdadm /dev/md0 --fail /dev/sdd

image


2. 장애 디스크(/dev/sdd) 제거

/dev/sdd를 RAID에서 제거해주자

sudo mdadm /dev/md0 --remove /dev/sdd

image


3. 새 디스크 추가 및 복구

새로운 디스크를 추가해줄거다.
image


추가된 디스크를 lsblk로 확인해보자.
image


마지막으로 추가한 디스크(/dev/sde)를 RAID에 추가해주고 복구를 시작하자.

sudo mdadm /dev/md0 --add /dev/sde

RAID 클린 삭제

구성한 RAID를 클린 삭제해보자.

* RAID를 삭제하게 되면 데이터를 잃을 수 있으니 실습이 아닌 환경에서는 주의하자


1. RAID 배열 상태 확인

먼저 현재 구성된 RAID 배열의 상태와 사용 중인 디스크를 확인해야 한다. RAID 배열을 해제하기 전에 어느 디스크가 RAID에 포함되어 있는지 명확히 확인해야 한다.

cat /proc/mdstat

image


RAID 배열과 관련된 정보를 자세히 확인하려면 아래 명령어도 사용할 수 있다.

sudo mdadm --detail /dev/<raid>

image


2. 파일 시스템 마운트 해제

RAID 배열에 파일 시스템이 마운트되어 있는 경우, 이를 먼저 마운트 해제해야 한다.

RAID가 마운트된 위치를 확인하고, umount 명령어로 마운트를 해제하자.

sudo umount /mnt/raid1 # RAID가 마운트된 위치에 따라 경로를 변경

3. RAID 배열 중지

RAID 배열을 중지하기 위해 아래 명령어를 실행. 중지하는 과정은 RAID를 해제하는 첫 번째 단계이다.

sudo mdadm --stop /dev/md0 # /dev/md0은 RAID 장치 이름임

4. RAID 배열에서 디스크 제거

RAID에 추가한 각 디스크를 배열에서 제거해야 한다. 명령어 실행 시 RAID에 포함된 각 디스크를 순차적으로 제거한다.

sudo mdadm --remove /dev/md0

5. RAID 메타데이터 삭제 (superblock 삭제)

RAID 배열의 메타데이터는 디스크에 남아있으므로 이를 완전히 지우기 위해 superblock을 삭제해야 한다.

RAID에 사용된 각 디스크에서 superblock을 제거하자.

sudo mdadm --zero-superblock /dev/sd{b,c} # 각 디스크 이름으로 변경

/dev/sdb, /dev/sdc 디스크에 대해 실행하였다.


6. RAID 배열 정보 삭제

/etc/mdadm/mdadm.conf에 저장된 RAID 배열의 정보를 삭제해야 한다. 이 파일은 시스템 재부팅 시 RAID 배열을 다시 로드하므로, 더 이상 필요하지 않은 RAID 정보를 삭제해주자.

sudo vim /etc/mdadm/mdadm.conf

이 파일에서 삭제하려는 RAID 배열에 해당하는 줄을 찾아서 제거한 후, 파일을 저장하고 죵료하자.


7. initramfs 업데이트

RAID 배열 정보 삭제 후, 시스템이 이를 반영할 수 있도록 부팅 이미지를 업데이트해야 한다.

sudo update-initramfs -u

Loading script...