Raid 0, 1, 5 리눅스에서 직접 구성해보기 (mdadm 실습)

Views: 0

개요

소프트웨어 RAID는 별도 하드웨어 컨트롤러 없이도 디스크 성능과 가용성을 끌어올릴 수 있는 현실적인 선택지다. 리눅스의 mdadm은 RAID 관리 표준 도구로, 설정과 복구 절차가 명확하고 자동화에 유리하다. 이 글은 RAID 0/1/5의 특성을 간단히 짚은 뒤, 실습 중심으로 준비→생성→파일시스템→부팅 자동화→장애 복구→모니터링까지 단계별로 안내한다. 실전에서 중요한 블록 크기, 정렬, 메타데이터 버전, 스페어 디스크 운용 팁도 함께 담았다.

실습 전 준비와 주의사항

  • 실습용으로 최소 동일 용량의 빈 디스크 2~3개를 준비한다. 예) /dev/sdb, /dev/sdc, /dev/sdd
  • 파티션을 나눠 RAID에 쓰려면 타입을 Linux raid autodetect로 맞춘다. GPT 기준 fd00(parted에서는 set <n> raid on)로 설정한다.
  • SSD라면 성능과 수명을 위해 파티션 시작을 1MiB 정렬로 맞춘다. 대부분의 파티셔너에서 기본값이다.
  • 같은 크기로 맞추되, 서로 다른 제조/로트를 섞으면 동시 고장 확률을 낮출 수 있다.
  • 서버라면 전원 장애 대비로 파일시스템 저널링과 배터리 백업(또는 안정적 UPS)을 고려한다.

RAID 레벨 한눈에 보기

  • RAID 0(스트라이핑): 최소 2장. 성능↑, 용량 합산, 내고장성 없음. 운영 데이터에는 부적합하며 캐시/스크래치용으로 적합.
  • RAID 1(미러링): 최소 2장. 읽기 성능 향상, 내고장성 1장까지, 용량은 한 장 크기. 시스템/DB 부트 디스크에 적합.
  • RAID 5(패리티): 최소 3장. 읽기↑, 쓰기 패널티 존재, 내고장성 1장까지, 용량은 (N-1)×디스크. 백업과 병행 시 일반 파일서버에 다용도.

디스크 파티션 생성 예시(GPT)

# 예: /dev/sdb에 1MiB 정렬된 전체 파티션 1개 생성
parted -s /dev/sdb mklabel gpt
parted -s /dev/sdb mkpart primary 1MiB 100%
parted -s /dev/sdb set 1 raid on

# /dev/sdc, /dev/sdd도 동일 반복

파티션 경로는 /dev/sdb1 같은 형태로 사용한다.

mdadm 설치와 기본 확인

# Debian/Ubuntu
apt-get update && apt-get install -y mdadm
# RHEL/Alma/Rocky
yum install -y mdadm

# 현재 md 디바이스 확인
cat /proc/mdstat

RAID 0 만들기(실습)

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 \
  --metadata=1.2 --chunk=256
  • --chunk: 스트라이프 크기. 대용량 순차 I/O 위주면 256~512KiB가 유리하다.
  • RAID 0은 장애 허용이 없으니 운영 데이터에 사용하지 않는다.

파일시스템과 마운트:

mkfs.xfs -f /dev/md0
mkdir -p /data/raid0
blkid /dev/md0   # UUID 확인
echo 'UUID=<위-UUID> /data/raid0 xfs defaults,noatime 0 0' >> /etc/fstab
mount -a

RAID 1 만들기(부트 디스크 대용으로 적합)

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1 \
  --metadata=1.2
mkfs.ext4 -F /dev/md1
mkdir -p /data/raid1
echo 'UUID=$(blkid -s UUID -o value /dev/md1) /data/raid1 ext4 defaults 0 2' >> /etc/fstab
mount -a
  • 부트 파티션을 RAID로 구성할 때는 부트로더 제약을 고려한다. 최신 배포판은 RAID1의 /boot를 무난히 지원하지만, UEFI 환경에선 ESP는 미러 대신 다중 복제로 관리하는 설계가 깔끔하다(각 디스크에 ESP 생성 후 동기화 스크립트로 복제).

RAID 5 만들기(균형형)

mdadm --create /dev/md5 --level=5 --raid-devices=3 \
  /dev/sdb1 /dev/sdc1 /dev/sdd1 \
  --metadata=1.2 --chunk=512
mkfs.xfs -f /dev/md5
mkdir -p /srv/raid5
echo "UUID=$(blkid -s UUID -o value /dev/md5) /srv/raid5 xfs defaults,noatime 0 0" >> /etc/fstab
mount -a
  • RAID 5는 쓰기 시 패리티 계산 오버헤드가 있으나 읽기/용량/내고장성의 균형이 좋다.
  • 재빌드 시간 동안 성능 저하와 스트레스가 커서 2차 고장 위험이 높아질 수 있다. 스페어 디스크를 준비해 자동 재구성을 빠르게 하는 편이 안전하다.

생성 직후 상태 확인과 동기화 모니터링

watch -n1 cat /proc/mdstat
mdadm --detail /dev/md5
iostat -xm 1   # 동기화 중 디스크 병목 관찰

초기 빌드/리싱크는 백그라운드로 진행된다. 마운트 후에도 사용 가능하지만 대규모 쓰기는 동기화 완료 후로 미루면 안정적이다.

mdadm 설정 영구화(자동 어셈블)

# mdadm 설정 파일 갱신
mdadm --detail --scan >> /etc/mdadm/mdadm.conf   # Debian/Ubuntu
# 또는
mdadm --detail --scan >> /etc/mdadm.conf         # RHEL 계열

# initramfs/grub 갱신(특히 부트 관련 RAID일 때 중요)
update-initramfs -u   # Debian/Ubuntu
dracut -f             # RHEL 계열
update-grub || grub2-mkconfig -o /boot/grub2/grub.cfg

재부팅 후 자동 assemble이 되는지 /proc/mdstat와 마운트를 확인한다.

스페어 디스크 추가와 교체

스페어 추가:

mdadm /dev/md5 --add-spare /dev/sde1
mdadm --detail /dev/md5 | grep -i spare

디스크 장애로 “faulty”가 되면 즉시 스페어로 자동 재구성된다.

고장 디스크 교체(실습 흐름):

# 1) 장애 디스크 마킹(식별 예시)
/sbin/mdadm /dev/md5 --fail /dev/sdc1

# 2) 배열에서 제거
mdadm /dev/md5 --remove /dev/sdc1

# 3) 교체 디스크 파티션 준비(기존과 같은 크기, raid on)
parted -s /dev/sdc mklabel gpt
parted -s /dev/sdc mkpart primary 1MiB 100%
parted -s /dev/sdc set 1 raid on

# 4) 배열에 추가(재빌드 시작)
mdadm /dev/md5 --add /dev/sdc1
watch -n1 cat /proc/mdstat

용량·성능 팁

  • 스트라이프/청크 정렬: 파일시스템 생성 시 스트라이프 정보를 넘기면 큰 파일 워크로드에서 성능이 향상된다.
    • XFS: mkfs.xfs -d su=<chunk>,sw=<N-1> 예) RAID5(512KiB, 3디스크) → su=512k, sw=2
    • EXT4: mkfs.ext4 -E stride=<chunk/4k>,stripe-width=<stride×(N-1)>
  • 마운트 옵션: noatime로 읽기 경로의 메타데이터 쓰기를 줄인다.
  • 스케줄러/튜닝: HDD는 mq-deadline, SSD/NVMe는 기본 스케줄러가 무난하다. echo mq-deadline > /sys/block/sdb/queue/scheduler
  • 재빌드 속도: 낮 시간대 영향이 크면 echo <KB/s> > /proc/sys/dev/raid/speed_limit_max로 한시 조정 가능.

RAID 5의 쓰기 패널티와 대안

  • 쓰기 패널티로 랜덤 쓰기 성능이 낮아질 수 있다. 데이터베이스처럼 쓰기가 많은 워크로드는 RAID 10(스트라이프+미러)을 고려한다.
  • 중복 에러 탐지·복구 관점에서는 RAID 6(2중 패리티)도 대안이지만 CPU 비용과 디스크가 더 든다.

상태 점검과 모니터링

mdadm --detail --scan
mdadm --detail /dev/md5
cat /proc/mdstat

자동 알림 설정:

# 메일 경로가 있다면
echo 'MAILADDR admin@example.com' >> /etc/mdadm/mdadm.conf
systemctl enable --now mdmonitor.service mdmonitor

메일 인프라가 없다면 저널/프로메테우스 익스포터로 감시한다. SMART 상태도 병행 점검:

smartctl -a /dev/sdb

장애 시나리오별 복구 요령

  • RAID 1/5에서 한 디스크만 실패: --fail--remove→새 디스크 파티션→--add→리싱크 완료까지 대기
  • RAID 5에서 두 디스크 이상 동시 실패: 표준 복구는 불가능. 백업에서 복구가 현실적이다.
  • 슈퍼블록 손상: mdadm --examine /dev/sdX1로 메타데이터 확인 후 --assemble --force 시도. 신중하게 로그를 남기고 읽기 전용으로 시작해 데이터 사본을 확보한다.
  • 부팅 불가: 라이브 환경에서 mdadm --assemble --scan으로 배열을 복원하고 루트 마운트 후 chroot로 부트로더/초기램디스크를 재생성한다.

안전한 운영 체크리스트

  • 백업: RAID는 백업이 아니다. 스냅샷/오프사이트 백업을 별도로 유지
  • 스페어 상시 준비: 동일/큰 용량의 예비 디스크를 연결해 자동 복구 시간을 최소화
  • 정기 스크럽: echo check > /sys/block/md0/md/sync_action으로 미디어 에러 사전 발견
  • 펌웨어/케이블: 잦은 재빌드는 디스크보다 케이블/전원 문제일 때도 많다
  • 테스트: 장애 주입(의도적 --fail)으로 복구 절차를 주기적으로 검증

자동화 예시(Ansible 스니펫 개념)

  • 파티션 생성 → mdadm 생성 → /etc/mdadm*.conf 업데이트 → initramfs/grub 갱신 → 파일시스템/마운트 → mdmonitor 활성화 → 알림 구성의 순서로 플레이북을 구성하면 대규모 서버에도 일관되게 배포할 수 있다.

자주 묻는 질문

  • 메타데이터 버전은 무엇을 쓰나?
    일반적으로 1.2가 권장된다. 슈퍼블록이 파티션 시작부에 저장되며, 현대 부트 환경과 호환성이 좋다. 매우 오래된 부트로더와의 호환이 필요하면 0.90을 쓸 수 있으나 특별한 이유가 없으면 최신을 사용한다.
  • 서로 다른 크기 디스크를 섞어도 되나?
    가능하지만 RAID는 가장 작은 디스크 용량에 맞춰진다. 낭비가 크므로 동일 용량을 권장한다.
  • 재빌드 중 사용해도 되나?
    가능하지만 I/O 지연이 커진다. 중요 배치 작업은 리싱크 완료 후로 스케줄링한다.

마무리

mdadm을 이용한 소프트웨어 RAID는 비용 대비 효과가 크고 관리가 투명하다. RAID 0/1/5의 특성을 이해하고, 올바른 파티션 타입·메타데이터·청크/정렬·파일시스템 옵션을 선택하면 안정성과 성능을 동시에 확보할 수 있다. 생성 직후 자동 어셈블과 마운트를 확실히 고정하고, 스페어·모니터링·스크럽·백업을 체계화하면 장애 시에도 예측 가능한 속도로 복구할 수 있다. 운영 워크로드에 맞춰 RAID 레벨을 선택하고 정기적으로 복구 절차를 연습하는 습관이 결국 데이터 가용성을 지켜준다.