RAID 구성
소프트웨어 RAID(mdadm)의 설계, 구성, 모니터링 및 문제 해결 완벽 가이드
소프트웨어 RAID(mdadm)의 설계, 구성, 모니터링 및 문제 해결 완벽 가이드
목표: 프로덕션 환경에서 RAID를 설계하고 장애를 복구할 수 있는 수준 [!warning] 실습 주의 RAID 생성, 파일시스템 생성, 암호화 설정은 대상 디스크를 덮어쓸 수 있다. 실습 전 디바이스명을 재확인하고 테스트 디스크에서만 수행한다.
🏗️ RAID 아키텍처
RAID 레벨 심화 비교
| 레벨 | 최소 디스크 | 용량 효율 | 읽기 성능 | 쓰기 성능 | 장애 허용 | 사용처 |
|---|---|---|---|---|---|---|
| RAID 0 | 2 | 100% | N배 | N배 | 없음 | 임시 데이터, 캐시 |
| RAID 1 | 2 | 50% | N배 | 1배 | N-1개 | 부팅 디스크, OS |
| RAID 5 | 3 | (N-1)/N | (N-1)배 | 1배 | 1개 | 파일 서버, 일반 |
| RAID 6 | 4 | (N-2)/N | (N-2)배 | 1배 | 2개 | 대용량 저장소 |
| RAID 10 | 4 | 50% | N배 | N/2배 | N/2개 (미러당 1개) | 데이터베이스, VM |
| RAID 50 | 6 | (N-2)/N | N배 | N/2배 | 2개 (스패어당 1개) | 대규모 스토리지 |
| RAID 60 | 8 | (N-4)/N | N배 | 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