RAID 구성

소프트웨어 RAID(mdadm)의 설계, 구성, 모니터링 및 문제 해결 완벽 가이드


소프트웨어 RAID(mdadm)의 설계, 구성, 모니터링 및 문제 해결 완벽 가이드

목표: 프로덕션 환경에서 RAID를 설계하고 장애를 복구할 수 있는 수준 [!warning] 실습 주의 RAID 생성, 파일시스템 생성, 암호화 설정은 대상 디스크를 덮어쓸 수 있다. 실습 전 디바이스명을 재확인하고 테스트 디스크에서만 수행한다.


🏗️ RAID 아키텍처

RAID 레벨 심화 비교

레벨최소 디스크용량 효율읽기 성능쓰기 성능장애 허용사용처
RAID 02100%N배N배없음임시 데이터, 캐시
RAID 1250%N배1배N-1개부팅 디스크, OS
RAID 53(N-1)/N(N-1)배1배1개파일 서버, 일반
RAID 64(N-2)/N(N-2)배1배2개대용량 저장소
RAID 10450%N배N/2배N/2개 (미러당 1개)데이터베이스, VM
RAID 506(N-2)/NN배N/2배2개 (스패어당 1개)대규모 스토리지
RAID 608(N-4)/NN배N/2배4개 (스패어당 2개)대규모 스토리지

RAID 선택 의사결정 트리

데이터 중요성?
├── 중요하지 않음 ──> RAID 0 (성능만)
└── 중요함
    └── 쓰기 집약적? (DB, VM)
        ├── 예 ──> RAID 10
        └── 아니오
            └── 대용량? (>10TB)
                ├── 예 ──> RAID 6
                └── 아니오 ──> RAID 5

🔧 mdadm 심화

RAID 생성 상세

RAID 10 (권장)

# 4개 디스크로 RAID 10 생성
sudo mdadm --create /dev/md0 \
  --level=10 \
  --raid-devices=4 \
  --layout=n2 \
  /dev/sd[b-e]1

# 레이아웃 옵션
# n2: near copies 2 (기본, 성능 중심)
# f2: far copies 2 (읽기 성능 향상)
# o2: offset copies 2 (중간)

# 청크 크기 지정 (데이터베이스: 64K, 일반: 256K)
sudo mdadm --create /dev/md0 \
  --level=10 \
  --raid-devices=4 \
  --chunk=256 \
  /dev/sd[b-e]1

RAID 6 (대용량)

# 6개 디스크 + 1 스패어
sudo mdadm --create /dev/md0 \
  --level=6 \
  --raid-devices=6 \
  --spare-devices=1 \
  /dev/sd[b-g]1 \
  /dev/sdh1

# 청크 크기 (기본 512K, 대용량 파일: 1024K)
sudo mdadm --create /dev/md0 \
  --level=6 \
  --raid-devices=6 \
  --chunk=1024 \
  /dev/sd[b-g]1

비동기 초기화 모니터링

# 초기화 진행 상황
watch -n 1 cat /proc/mdstat

# 상세 정보
sudo mdadm --detail /dev/md0

# 초기화 속도 조정 (빠르게)
echo 200000 | sudo tee /proc/sys/dev/raid/speed_limit_min
echo 200000 | sudo tee /proc/sys/dev/raid/speed_limit_max

# I/O 부하 고려 시 (느리게)
echo 1000 | sudo tee /proc/sys/dev/raid/speed_limit_min

📊 RAID 모니터링

상세 상태 확인

# RAID 상세 정보
sudo mdadm --detail /dev/md0

# 주요 필드 해석
/dev/md0:
        Version : 1.2
  Creation Time : Mon Jun  1 10:00:00 2026
     Raid Level : raid10
     Array Size : 976630784 (931.39 GiB 1000.07 GB)
  Used Dev Size : 488315392 (465.69 GiB 500.03 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Mon Jun  1 12:00:00 2026
          State : clean              # clean, active, degraded, recovering
 Active Devices : 4                   # 활성 디스크
Working Devices : 4                   # 작동 중인 디스크
 Failed Devices : 0                   # 장애 디스크
  Spare Devices : 0                   # 스페어 디스크

         Layout : near=2
     Chunk Size : 256K

           Name : server:0
           UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync set-A   /dev/sdb1
       1       8       33        1      active sync set-B   /dev/sdc1
       2       8       49        2      active sync set-A   /dev/sdd1
       3       8       65        3      active sync set-B   /dev/sde1

이메일 알림 설정

# /etc/mdadm/mdadm.conf
MAILADDR admin@example.com
MAILFROM mdadm@server.example.com

# 프로그램 실행
PROGRAM /usr/local/bin/raid-alert.sh
#!/bin/bash
# /usr/local/bin/raid-alert.sh

echo "RAID Event: $1" | \
  mail -s "RAID Alert on $(hostname)" admin@example.com

SMART + RAID 통합 모니터링

#!/bin/bash
# raid-health-check.sh

RAID_DEVICE="/dev/md0"
DISKS="/dev/sdb /dev/sdc /dev/sdd /dev/sde"

# RAID 상태
RAID_STATE=$(mdadm --detail $RAID_DEVICE | grep "State :" | awk '{print $3}')
if [ "$RAID_STATE" != "clean" ]; then
    echo "WARNING: RAID state is $RAID_STATE" | \
      mail -s "RAID State Alert" admin@example.com
fi

# 디스크 SMART 상태
for disk in $DISKS; do
    if ! smartctl -H $disk | grep -q "PASSED"; then
        echo "WARNING: SMART failed on $disk" | \
          mail -s "SMART Alert" admin@example.com
    fi
done

# 동기화 진행 상황
SYNC_STATUS=$(cat /proc/mdstat | grep $RAID_DEVICE)
if echo "$SYNC_STATUS" | grep -q "recovery"; then
    PROGRESS=$(echo "$SYNC_STATUS" | grep -oP '\d+\.\d+' | tail -1)
    echo "RAID recovery: $PROGRESS%" | \
      mail -s "RAID Recovery Progress" admin@example.com
fi

🛠️ 장애 복구

디스크 장애 시나리오

RAID 1/10 장애 복구

# 1. 장애 확인
sudo mdadm --detail /dev/md0
# State: degraded
# Failed Devices: 1

# 2. 장애 디스크 표시 (자동으로 되는 경우도 있음)
sudo mdadm --manage /dev/md0 --fail /dev/sdb1

# 3. 장애 디스크 제거
sudo mdadm --manage /dev/md0 --remove /dev/sdb1

# 4. 새 디스크 준비
sudo fdisk /dev/sdf          # 파티션 생성
sudo mdadm --zero-superblock /dev/sdf1

# 5. 새 디스크 추가
sudo mdadm --manage /dev/md0 --add /dev/sdf1

# 6. 동기화 확인
watch cat /proc/mdstat

RAID 5/6 장애 복구

# RAID 5: 1개 디스크 장애 허용
# RAID 6: 2개 디스크 장애 허용

# 1. 장애 확인
cat /proc/mdstat
# [UU_U]  # 3번째 디스크 장애 (U=정상, _=장애)

# 2. 장애 디스크 처리
sudo mdadm --manage /dev/md0 --fail /dev/sdc1
sudo mdadm --manage /dev/md0 --remove /dev/sdc1

# 3. 새 디스크 추가 (자동 재구성 시작)
sudo mdadm --manage /dev/md0 --add /dev/sdg1

# 4. 진행 상황 모니터링
watch -n 1 cat /proc/mdstat
# recovery = 12.3% (123456/987654) finish=45.6min speed=12345K/sec

# 5. 완료 후 상태 확인
sudo mdadm --detail /dev/md0
# State: clean

다중 장애 복구 (RAID 6)

# RAID 6에서 2개 디스크 동시 장애
# (아직 데이터 손실 없음)

# 1. 두 디스크 모두 교체
sudo mdadm --manage /dev/md0 --fail /dev/sdb1 /dev/sdc1
sudo mdadm --manage /dev/md0 --remove /dev/sdb1 /dev/sdc1

# 2. 두 디스크 동시 추가
sudo mdadm --manage /dev/md0 --add /dev/sdh1 /dev/sdi1

# 3. 병렬 재구성 (RAID 6 지원)
# 자동으로 병렬로 재구성됨

비정상적 종료 후 복구

# RAID가 비정상적으로 중지된 경우
# 1. 어셈블 시도
sudo mdadm --assemble /dev/md0 /dev/sd[b-e]1

# 2. 자동 검색
sudo mdadm --assemble --scan

# 3. 강제 어셈블 (메타데이터 불일치 시)
sudo mdadm --assemble --force /dev/md0 /dev/sd[b-e]1

# 4. 영구 설정 업데이트
sudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf

💾 RAID 성능 최적화

파일시스템 최적화

# RAID 10 + XFS (데이터베이스)
sudo mkfs.xfs -d su=256k,sw=4 -l su=256k /dev/md0
# su: stripe unit (chunk size)
# sw: stripe width (data disks)

# RAID 6 + ext4 (대용량 파일)
sudo mkfs.ext4 -E stride=256,stripe-width=1024 /dev/md0
# stride = chunk size / block size (256K / 4K = 64)
# stripe-width = stride * data disks (64 * 4 = 256)

# 마운트 옵션
sudo mount -o noatime,nobarrier /dev/md0 /mnt/raid

I/O 스케줄러

# RAID용 스케줄러: deadline 또는 noop
echo "deadline" | sudo tee /sys/block/md0/queue/scheduler

# RAID 구성원 디스크도 동일하게
echo "deadline" | sudo tee /sys/block/sd[b-e]/queue/scheduler

읽기 전용 작업 최적화

# 읽기 전용 마운트 (백업, 스캔 등)
sudo mount -o ro /dev/md0 /mnt/raid

# RAID 읽기 정책
sudo mdadm --detail /dev/md0 | grep "Preferred Minor"

🔐 RAID 보안

쓰기 의도 비트맵 (Write Intent Bitmap)

# 비트맵 활성화 (빠른 재구성)
sudo mdadm --grow /dev/md0 --bitmap=internal

# 비트맵 비활성화
sudo mdadm --grow /dev/md0 --bitmap=none

# 외부 비트맵 파일
sudo mdadm --grow /dev/md0 --bitmap=/var/md bitmap

장점:

  • 비정상 종료 후 재구성 시간 단축
  • 동기화할 블록만 선택적으로 처리

RAID 암호화 (LUKS + RAID)

# 방법 1: RAID 위에 LUKS
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
sudo cryptsetup luksFormat /dev/md0
sudo cryptsetup luksOpen /dev/md0 raid_crypt
sudo mkfs.ext4 /dev/mapper/raid_crypt

# 방법 2: LUKS 위에 RAID (더 안전)
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup luksFormat /dev/sdc1
sudo cryptsetup luksOpen /dev/sdb1 crypt1
sudo cryptsetup luksOpen /dev/sdc1 crypt2
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/mapper/crypt1 /dev/mapper/crypt2

📋 RAID 관리 체크리스트

일일 점검

  • RAID 상태 확인 (cat /proc/mdstat)
  • 디스크 SMART 상태
  • 동기화 진행 상황

주간 점검

  • 상세 RAID 정보 (mdadm --detail)
  • 디스크 온도 확인
  • 로그 검토

월간 점검

  • 백업 테스트
  • 장애 복구 절차 연습
  • 성능 벤치마크

🔗 관련 노트

  • 02-05-디스크-관리 — 기본 디스크 관리
  • 02-06-LVM-구성 — LVM과 RAID 결합
  • 02-05-디스크-관리 — ZFS RAID-Z
  • 03-02-성능-모니터링 — I/O 성능
  • 백업-복구-전략 — 백업 전략

마지막 업데이트: 2026-06-01