Views: 0
목차
- 1 개요
- 2 실습 전 준비와 주의사항
- 3 RAID 레벨 한눈에 보기
- 4 디스크 파티션 생성 예시(GPT)
- 5 mdadm 설치와 기본 확인
- 6 RAID 0 만들기(실습)
- 7 RAID 1 만들기(부트 디스크 대용으로 적합)
- 8 RAID 5 만들기(균형형)
- 9 생성 직후 상태 확인과 동기화 모니터링
- 10 mdadm 설정 영구화(자동 어셈블)
- 11 스페어 디스크 추가와 교체
- 12 용량·성능 팁
- 13 RAID 5의 쓰기 패널티와 대안
- 14 상태 점검과 모니터링
- 15 장애 시나리오별 복구 요령
- 16 안전한 운영 체크리스트
- 17 자동화 예시(Ansible 스니펫 개념)
- 18 자주 묻는 질문
- 19 마무리
개요
소프트웨어 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)>
- XFS:
- 마운트 옵션:
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 레벨을 선택하고 정기적으로 복구 절차를 연습하는 습관이 결국 데이터 가용성을 지켜준다.