[파일] 리눅스 Soft Raid 구성하기

Raid 라는 것에 대한 설명은 HOWTO에 자세하게 나와 있지만, 간략하게 설명하자면, 디스크들을 묶어서 속도와 안정성을 높이기 위한 기술이다. 리눅스에서 구현하는 소프트웨어 Raid는 데이터 분산과 장애 대응 방식에 따라 여러 가지 방식으로 구분되면, 각각의 방식마다 서로 다른 특징을 가지고 있다.

리눅스 소프트웨어 Raid의 구성 방식

Raid-linear

여러개의 파티션을 연결해 하나의 파티션으로 만들어 주는 것이다. 연결되어 있는 파티션이나 디스크에 오류가 생기면 Raid 자체가 망가진다. 안정성은 보장되지 않는다.

Raid-0 (stripe)

Raid-linear과 거의 같은 개념이지만, 파티션을 stripe로 나누고 묶는다는 것이 차이점이다. 물론 결과는 커다란 한개의 파티션이고, 낭비되는 공간은 없으나, Raid-linear과 마찬가지로 안정성은 보장되지 않는다.

stripe

디스크 블럭들이 연속적으로 붙어 있는 것을 말한다. 하나의 디스크 블럭만큼 짧을 수도 있고, 수천개의 블럭들로 이루어져 있을 수도 있다. Raid 드라이버는 파티션을 stripe 단위로 나누게 될 것이다. (stripe 에 대한 것은 잘 모르겠지만, HOWTO 에 나와 있는 것을 보니까 그냥 하나의 기다란 끈이라고 생각하면 되겠군요. 디스크를 붙여서 끈을 길게 하고… 뭐 그런 것 같습니다.)

Raid-1 (mirror)

디스크를 미러링하는 것이다. 두개 이상의 같은 크기의 파티션(중요! 같은 크기의 파티션이어야만 함)이 블럭단위로 같은 데이터를 가진다. 같은 데이터를 Raid-1로 구성된 모든 디스크에 저장되기 때문에 오류에 매우 강력하고, 데이터를 읽는데 있어서 서로 다른 디스크에 분산시킴으로서 I/O 성능을 높일 수 있다. 디스크 공간 낭비는 엄청나다. -_-;

Raid-4 (parity-stripe)

Raid-0 처럼 stripe으로 구성된다. 레벨 0과의 차이점은 오류에 대비한 parity 정보를 가지는 파티션을 별도로 가지고 있다는 것 정도. 대신 미러링만큼의 속도는 나지 않고, 디스크에 저장할 때 마다 parity를 연산해야 하고, parity 디스크에 저장해야 하기 때문에, write 작업이 많은 시스템에서는 병목현상이 일어날 수 있다.

Raid-5 (parity-stripe)

Raid-4 의 병목현상을 피하기 위하여, 각 디스크에 parity 정보를 저장한다. write 성능은 mirroring 보다 빠를 수 없다. read 역시 디스크마다 데이터가 분산 저장되어 있기 때문에 빠르지 않다.

Raid-2, Raid-3

거의 사용되지 않는다. (이 레벨에서 제공하는 기능이 하드웨어적으로 해결되었기 때문에..)

준비하기

Raid 관련 커널 설정

커널에서 Raid를 사용하기 위해 다음 모듈들을 추가한다.

CONFIG_BLK_DEV_MD=y  <- Raid 구성을 위한 멀티플 디바이스 지원

CONFIG_AUTODETECT_RAID=y <- Raid 자동 인식

CONFIG_MD_LINEAR=y  <- 선형적인 블럭 디바이스 접근 모드

CONFIG_MD_STRIPED=y  <- Raid 0

CONFIG_MD_MIRRORING=y  <- Raid 1

CONFIG_MD_RAID5=y  <- Raid 5

하드디스크 파티셔닝

Raid-1 인 미러링을 제외하고는 파티셔닝에 크게 문제는 없을 것이다. Raid-1 의 경우에는 서로 다른 디스크의 같은 블록에 데이터를 기록해야 하기 때문에, 똑같은 하드디스크를 가지고 같은 용량을 파티셔닝해야 한다. 다른 레벨에서는 그다지 문제 될 것은 없다.

raidtools 구하기

raid를 구성하기 위해서 필요한 패키지이다. 배포판에 포함되어 있다.

구성하기

기본적으로 OS는 설치되어 있다고 가정한다. 지금부터 Raid-0 을 구성하는 방법을 설명할 것이다. 다른 레벨의 Raid 구성도 크게 다르지는 않다.

하드디스크 구성

9.1G SCSI HDD UW-2  (sda)

18.2G SCSI HDD UW-2 (sdb)

18.2G SCSI HDD UW-2 (sdc)

파티셔닝

sda 에 기본적인 Linux 설치를 마친 후, sdb, sdc 두 하드디스크를 통째로 Raid-0으로 구성하도록 하자. 일단 sdb, sdc 두 하드디스크를 전부 하나의 파티션으로 잡는다. (어짜피 striping으로 사용할 것이니까 굳이 파티션을 나눌 필요는 없다.)

그리고, 파티션의 타입을 fd Linux raid auto 로 잡아주도록 하자. (커널에서 Autodetection 을 선택해 놓아야 한다!). sdc 역시 sdb 와 같은 작업을 하면 된다.

raidtab작성

md (raid) 디바이스를 위한 설정 파일인 raidtab 파일을 작성해야 한다. raidtools 에 예제가 있으니 참고하여 만들도록 하자. 무지 쉽다. 그냥 보고 만들면 된다. 와우 7.0 기준으로 예제 파일은 /usr/share/doc/raid-tools-0.90/ 에 각 레벨별로 있다. 그래도 한 번 짚어 보는 의미에서 다음 예를 보자. (패키지에 포함된 예제와 동일하다)

# Sample raid-0 configuration

raiddev                 /dev/md0

raid-level              0    # it’s not obvious but this *must* be

                             # right after raiddev

persistent-superblock   0    # set this to 1 if you want autostart,

                             # BUT SETTING TO 1 WILL DESTROY PREVIOUS

                             # CONTENTS if this is a RAID0 array created

                             # by older raidtools (0.40-0.51) or mdtools!

chunk-size              16

nr-raid-disks           2

# nr-spare-disks          0 <- Raid 레벨 4, 5에서 사용된다.

device                  /dev/sdb1

raid-disk               0

device                  /dev/sdc1

raid-disk               1

이것이 끝이다.

Raid 만들기

raidtab 파일을 참고하여 raid를 만들도록 한다.

# mkraid /dev/md0

간단하게 두개의 파티션이 raid-0 으로 striping 되었다. 🙂

* 주의할 것이 있다.

Raid 구성후 Raid 가 망가졌을 경우, 각각의 파티션을 날린다고 제대로 구성되지 않는다.

이때에는 다음 옵션을 이용하도록 하자!

# mkraid –really-force /dev/md0

  제대로 구성이 될 것이다. 🙂

Raid 동작시키기

/dev/md0 가 무사히 만들어졌다면, raidstart 명령으로 레이드를 동작시키도록 하자. 그리고 새로운 가상의 raid 디바이스인 /dev/md0 에 파일시스템을 생성하도록 한다. mkfs를 이용하여 만들면 된다.

# raidstart

     …

     …

# mkfs /dev/md0

이렇게 하면 리눅스 기본 파일시스템인 ext2로 생성이 된다. ReiserFS 를 이용한 Raid를 구성이 더 안정적이라고 생각할 수 있는데, 별반 차이가 없다고 한다. (정확한 확인이 필요하겠지만..)

파일시스템이 만들어 졌다면 제대로 구성되었는지 확인하기 위해, md0 를 임의의 곳에 마운트 하도록 한다. 그리고 df -h 명령으로 확인한다.

# mount /dev/md0 /mnt/raid0

              ….

              ….

# df -h

Filesystem  size Used Avail Use% Mounted on

/dev/sda1  

                   ….

                   ….

/dev/md0  33G … … … /mnt/raid0

뭐 이런식으로 나올 것이다.

2개를 raid-0 으로 구성한 것이니, 용량은 두배가 되어야 한다. raid-1이라면 하나의 디스크 용량이 보여야 한다. 그 후, /etc/fstab 에 등록해서 자동으로 부팅하면서 마운트 되도록 하면 설정은 끝난다.

주의점

구성된 Raid를 해체하려면 파일시스템을 언마운트 하도록 하고, raidstop 으로 raid 구성을 끊는다. 그리고 fdisk 로 파티셔닝을 하면 끝이다. 물론 기존의 자료는 백업을 하도록 하고…   🙂

아! Raid로 묶은 stripe은 절대 각각의 디바이스 (/dev/sdc1 등..)에 fsck 로 파일시스템을 체크하면 안된다고 한다. super 블록이 없어서 그렇다고 하는데, 자세한 내용은 HOWTO 를 참고하면 된다. ^^

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.