LabHub
시작하기
배우기 러닝패스 코스

스토리지 실무 — RAID·스냅숏·iSCSI·fio

RAID1 을 세우고, 한 장을 죽이고, 다시 맞춘다

LabHub 에서 이어서 보기

목표

루프 장치 위에 md RAID1 을 세우고, 한 장을 고장 내 degraded 상태를 직접 보고, 새 장치로 재구성한 뒤 체크섬과 점검(check)으로 데이터가 무사하다는 증거를 남깁니다.

왜 중요한가

디스크 교체는 인프라 엔지니어가 가장 자주 하는 하드웨어 작업이지만, 대부분은 그 순간을 처음 겪으면서 배웁니다. /proc/mdstat[U_] 가 무엇인지, --fail--remove 가 왜 따로 있는지, 재구성이 끝났다는 것과 데이터가 그대로라는 것이 왜 다른 증거인지를 미리 손으로 겪어 두면 새벽 알림에 당황하지 않습니다.

이 실습은 우분투 24.04 VM 에서 root 로 돕니다. 빈 디스크가 없으므로 파일을 블록 장치처럼 보이게 하는 루프 장치(losetup)로 디스크 세 장을 흉내 냅니다. 실무에서 디스크 없이 RAID 를 시험할 때 쓰는 바로 그 방법입니다. 세션은 60분에 시작해 최대 180분까지 연장할 수 있고, VM 은 세션이 끝나면 사라집니다.

단계

  1. /var/lib/sto/raid-a.img, /var/lib/sto/raid-b.img, /var/lib/sto/raid-c.img 를 각각 256MiB 로 만들고 셋 다 루프 장치로 붙이세요. losetup -a 출력을 /root/sto/raid/loops.txt 에 저장하세요.
  2. raid-a.imgraid-b.img 의 루프 장치 둘로 RAID1 배열 /dev/md/sto 를 만드세요(메타데이터 1.2). raid-c.img 는 아직 넣지 않습니다.
  3. /dev/md/sto 를 ext4 로 포맷해 /srv/raid 에 마운트하세요. /srv/raid/ledger.dat20MiB 짜리 임의 데이터를 쓰고, sha256sum /srv/raid/ledger.dat 출력을 /root/sto/raid/ledger.sha256 에 저장하세요.
  4. /etc/mdadm/mdadm.conf/dev/md/stoARRAY 줄을 추가하세요. 그 배열의 UUID 가 적힌 ARRAY 줄은 정확히 한 줄이어야 합니다.
  5. raid-b.img 의 루프 장치를 고장(fail) 으로 표시한 직후의 /proc/mdstat/root/sto/raid/degraded.txt 에 저장하고, 그 장치를 배열에서 제거(remove) 하세요.
  6. raid-c.img 의 루프 장치를 배열에 추가해 재구성하고 끝날 때까지 기다리세요. 상태가 clean, 활성 장치 2개, 고장 장치 0개여야 합니다.
  7. 3단계의 체크섬으로 ledger.dat 를 검사하고 sha256sum -c 출력을 /root/sto/raid/verify.txt 에 저장하세요.
  8. 배열에 점검(check) 을 돌리고 끝나면 /root/sto/raid/scrub.txtlast_sync_action=<값>mismatch_cnt=<값> 두 줄을 적으세요(값은 /sys/block/<md 장치>/md/ 에서 읽습니다).

참고

루프 장치 세 개 만들기

/var/lib/sto/raid-a.img, /var/lib/sto/raid-b.img, /var/lib/sto/raid-c.img 를 각각 256MiB 로 만들고(희소 파일이면 됩니다) 셋 다 루프 장치로 붙이세요. losetup -a 출력을 /root/sto/raid/loops.txt 에 저장하세요.

truncate -s 로 크기를 정하고 losetup -f --show 로 비어 있는 루프 장치에 붙입니다. 번호를 직접 적으면 snap 이 쓰고 있는 장치와 부딪힙니다.

RAID1 배열 /dev/md/sto 만들기

raid-a.imgraid-b.img 의 루프 장치 둘로 RAID1 배열 /dev/md/sto 를 만드세요(메타데이터 1.2). raid-c.img 는 아직 넣지 않습니다.

mdadm --create 에 --level 과 --raid-devices 를 줍니다. 부팅 장치로 쓰기에 알맞지 않다는 확인 질문이 나오면 이 실습에서는 y 로 넘어가도 됩니다. 어느 루프 장치인지는 losetup -j <파일> 로 되찾습니다.

파일시스템과 체크섬 남기기

/dev/md/sto 를 ext4 로 포맷해 /srv/raid 에 마운트하세요. /srv/raid/ledger.dat20MiB 짜리 임의 데이터를 쓰고, 그 파일의 SHA-256 을 sha256sum /srv/raid/ledger.dat 형식 그대로 /root/sto/raid/ledger.sha256 에 저장하세요.

배열도 블록 장치이므로 mkfs.ext4 와 mount 가 그대로 됩니다. head -c 20M /dev/urandom 으로 임의 데이터를 만들 수 있습니다. 체크섬 파일에는 절대 경로가 들어가야 나중에 어디서든 sha256sum -c 로 검사할 수 있습니다.

mdadm.conf 에 배열을 한 줄로 등록

/etc/mdadm/mdadm.conf/dev/md/stoARRAY 줄을 추가하세요. 그 배열의 UUID 가 적힌 ARRAY 줄은 정확히 한 줄이어야 합니다.

mdadm --detail --brief 가 ARRAY 줄을 만들어 줍니다. 이미 그 UUID 가 파일에 있는지 먼저 보고 없을 때만 붙이세요. 실제 서버라면 update-initramfs -u 까지 해야 부팅 초기에 조립됩니다.

한 장을 고장 내고 빼기

raid-b.img 의 루프 장치를 배열에서 고장(fail) 으로 표시한 직후의 /proc/mdstat/root/sto/raid/degraded.txt 에 저장하고, 그 장치를 배열에서 제거(remove) 하세요. /srv/raid/ledger.dat 는 여전히 읽혀야 합니다.

mdadm <배열> --fail <장치> 다음 --remove <장치> 순서입니다. 고장 표시 직후의 mdstat 에는 장치 이름 뒤에 (F) 가, 상태 칸에 [2/1] 이 보입니다.

새 디스크로 재구성하기

raid-c.img 의 루프 장치를 배열에 추가해 재구성하고, 재구성이 끝날 때까지 기다리세요. 끝난 뒤 mdadm --detail /dev/md/sto 의 상태가 clean 이고 활성 장치가 2개, 고장 장치가 0개여야 합니다.

mdadm <배열> --add <장치> 로 넣으면 커널이 recovery 를 시작합니다. mdadm --wait 가 끝날 때까지 기다려 줍니다. cat /proc/mdstat 에 진행률이 보입니다.

체크섬으로 데이터 확인

3단계에서 남긴 체크섬으로 /srv/raid/ledger.dat 를 검사하고, sha256sum -c 의 출력을 /root/sto/raid/verify.txt 에 저장하세요.

sha256sum -c <체크섬 파일> 은 파일마다 OK 또는 FAILED 를 한 줄씩 냅니다. 배열이 clean 이라는 것과 데이터가 그대로라는 것은 다른 증거입니다.

점검(check)을 돌리고 결과 남기기

배열에 점검(check) 을 돌리고 끝날 때까지 기다린 뒤, /root/sto/raid/scrub.txt 에 두 줄을 적으세요: last_sync_action=<값>, mismatch_cnt=<값>. 두 값은 /sys/block/<md 장치>/md/ 아래의 같은 이름 파일에서 읽습니다.

/dev/md/sto 는 /dev/mdNNN 을 가리키는 링크입니다(readlink -f). 그 장치의 /sys/block/mdNNN/md/sync_action 에 check 를 쓰면 점검이 시작되고, mdadm --wait 로 끝날 때까지 기다릴 수 있습니다.