강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

RAID (소프트웨어) 시스템의 설치와 구성

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle19.gif


 

요약

RAID(Redundant Array of Inexpensive Disks)는 여러개의 디스크 드라이브를 마치 하나의 드라이브처럼 작동하도록 하는 일련의 시스템으로 구성되어 있다. 이 때 각각의 디스크들은 병렬적으로(parallelly) 작동하기 때문에 억세스 동작이 개선되고 사고에 의한 축적된 정보의 손실도 방지할 수 있게 된다.

 

들어가는 말

상업적인 하드웨어를 통한 해결책은 여러 가지가 있으나 보통은 가격이 매우 비싸고 특정한 컨트롤 카드를 이용하게 되어 있다.
또한 단순한 Z80칩과 온보드 소프트웨어를 이용하여 여러개의 같은 종류의 디스크들을 RAID로 사용할 수 있게 하는 카드들에 기반한 RAID방식도 있다. 이러한 구성에서는 리눅스를 통한 해결책에서 만큼 효율성이 없다.

컨트롤 카드를 통한 방식은 비용이 많이 들고 단지 같은 종류의 디스크 장치를 사용할 때만 이용할 수 있다. 한편 리눅스도 적절한 디바이스 드라이브만 있으면 이들 카드 중 몇가지를 이용할 수 있다. 그러나 이것은 좋은 해결책이 될 수 없는데, 왜냐하면 리눅스는 프리 소프트웨어에 기반한 해결을 가능케 하고 동시에 값비싼 하드웨어를 통한 해결책을 피할 수 있게 하는 효율성을 가지고 있기 때문이다.

리눅스에서 RAID시스템은 커늘 레벨에 장착되고 각기 다른 타입의 디스크들을 이용할 수 있게 한다. IDE방식과 SCSI방식의 디스크들을 혼용할 수도 있는 것이다. 심지어는 크기가 다른 디스크들도 같이 이용할 수 있으나 이 경우에는 각 디스크에서 같은 크기의 파티션을 잡아 주어야 한다. 가장 일반적으로는 크기가 같은 디스크들을 여러개 사용하는 것인데, 그럼에도 불구하고 리눅스가 훨씬 더 큰 융통성을 허용한다는 점은 주목할만한 것이다. 예를 들면 하나의 디스크의 일부분만이 RAID로 이용되고 다른 부분은 독립적인 파티션으로 이용할 수도 있다. 이것은 그리 좋은 방법은 아닌데 RAID시스템내에 독립적인 파티션을 사용하는 것이 RAID시스템의 접근 속도를 줄이기 때문이다. 다시 말해서 리눅스가 어떠한 종류의 디스크 디바이스도 가능케 하지만 가능하다면 같은 용량과 특성을 지닌 디스크들을 이용하는 것이 좋은 방법인 것이다. 또 다른 중요한 점은 SCSI기술을 이용하면 버스(Bus)에 연결된 여러 가지 장치들에 대한 동시적(concurrent) 엑세스가 가능하다는 것이다.

이와는 대조적으로 같은 IDE 제어 카드에 다수의 디스크를 장착하면 이 장치들은 결코 동시에 접근될 수 없다. 하지만 SCSI디스크는 아직까지 IDE 디스크에 비해 훨씬 값이 비싼 단점이 있다. 리눅스 RAID시스템과 같은 소프트웨어적인 해결책은 특별한 카드를 통한 방식에 비해 효율성이 결코 뒤떨어지지 않으며 값은 훨씬 싸고 이용할 수 있는 디스크장치의 융통성이라는 점에서도 유리하다.

SCSI 버스 방식에서는 하나의 장치가 데이터를 불러 오면서 동시에 저장할 수도 있지만 IDE 인터페이스에서는 각 디스크에 대한 접근이 동시에 일어날 수 없으며 순차적으로 밖에 이루어 질 수 없다.

 

RAID를 위한 디스크 선택

RAID를 가능하게 하기 위해서 매우 빠른 디스크 장치를 이용하는 것은 적절한 방법이 아니다. 그런 디스크들은 매우 비싸다. 디스크가 빠르다는 것은 해당 섹터에 디스크 헤드가 찾아가는데 있어서 효율성이 높고 속도가 빠르다는 것을 의미한다. 섹터간의 이동이 하드 디스크상에서 대부분의 시간을 소비하는 동작이지만 MS-DOS와는 반대로 리눅스에서는 이 동작이 다음과 같은 방식으로 최적화된다. 즉 정보는 요구하는 순서대로 접근되는 것이 아니라 마치 인텔리전트 엘리베이트에서와 같이 사용자의 요구를 기억해 두었다가 가장 효율적인 순서대로 일을 수행한다. 작동효율을 높이기 위한 또 다른 전략은 마치 캐쉬 메모리의 경우와 같이 디스크에 대한 접근 횟수를 최소화하는 것이다. 디스크의 회전속도는 크게 다르지 않지만 밀도와 헤드의 개수가 다르면 전송속도에 심각한 영향을 미치게 된다. 우리는 이러한 점들을 고려해야 하는데, 요약하자면 스카시 장치를 사용하고 가능하다면 유사한 특성을 가진 것이 좋겠다. 그리고 그리 값비쌀 필요는 없다. RAID시스템에서 속도는 동시적 사용에 의해서 결정되는 것이지, 개별적인 속도에 의해서 결정되는 것이 아니기 때문이다.
또한 리눅스 시스템은 RAID디스크 장치가 아닌 작은 크기의 디스크에서 시작해야만 하는데 이것은 루트 파티션이 상대적으로 자유로워야 하기 때문이다.

 

SCSI시스템의 특성

하드 디스크를 구입할 때는 여러 가지 의문들이 떠오른다. 따라서 바람직한 여러 가지  특성들을 좀더 살펴볼 필요가 있다.

RAID는 여러개의 디스크 파티션에 설정될 수 있지만 그 결과는 더 이상의 파티션을 나눌 수 없는 하나의 디스크를 가진 하나의 논리적 파티션에서 나타나는 것과 같다. 이 논리적 장치가 메타디스크인 것이다.
리눅스에서 다음에 나타나는 특정 옵션들을 가진 커늘을 컴파일링한 후, IDE장치의 파일은 /dev/hd...와 같은 형태로 나타나고 스카시 장치는 /dev/sd...와 같이 나타난다. 또 매타디스크들은 /dev/md...와 같이 나타난다. 네 개의 그러한 장치들은 다음과 같이 표현된다.

brw-rw----   1 root     disk       9,   0 may 28  1997 md0
brw-rw----   1 root     disk       9,   1 may 28  1997 md1
brw-rw----   1 root     disk       9,   2 may 28  1997 md2
brw-rw----   1 root     disk       9,   3 may 28  1997 md3

우리들의 첫 번째 목표는 스와프 억세스 타임을 가능한한 최소화하는 것이므로 이를 위해 RAID에서 작은 메타디스크를 사용하는 것이 최선의 방법이다. 또는 모든 물리적 디스크들에서 전통적 방식의 스와프를 하는 것이다. 만약 각각 다른 물리적 디스크에 각각 다른 여러개의 스와프 파티션이 사용되고 있다면 리눅스의 스와프 서브시스템이 그들 사이의 작업량을 관리해 주게 된다. 따라서 이 경우에 RAID는 필요가 없을 것이다.

 

RAID의 유형  

RAID0(스트립핑 모드)

이 모드에서는 효율성을 높이기 위하여 모든 디스크들에서 동등하게 블록들이 접근되도록 디스크 장치들이 구성된다. 어떤 파일이 들어 있는 블록을 찾아낼 확률이 모든 디스크에서 동등하므로 메타디스크의 작동횟수는 개별 디스크의 N배가 되도록하여 동시적으로 작동하게 해야한다.

RAID1

이 모드의 목적은 데이터의 안정성을 최대로 높이는 것이다. 모든 데이터 블록들은 모든 물리적 디스크들에 복사된다.(가상디스크의 각 블록들은 각각의 물리적 디스크에 복사된다) 이러한 특성으로 인해 하나의 장치를 읽는 성능을 N배로 높여 주지만 쓰기 작업의 경우 성능이 저하된다, 읽기작업은 각각의 장치에서 한꺼번에 N블록씩 동시에 읽을 수 있도록 구성된다. 마찬가지로 1블록의 쓰기작업에서도 각각의 물리적 디스크마다 N회 복사되어야 한다. 저장 능력에서 본다면 이러한 구성은 아무런 잇점이 없다.   

RAID4
(주:RAID2와 RAID3은 폐기되어 사용치 않음)

이 모드의 궁극적 목표는 RAID0와 RAID1에서 얻을 수 있는 잇점들의 균형을 잡기위한 것이다. 데이터는 두가지 방법을 혼합하여 구성된다. 1에서 N-1까지의 블록들은 스트라이핑 모드(RAID0)로 구성되고 N번째 블록은 1부터 N-1까지의 블록들에 해당되는 각각의 비트들의 패러티를 저장한다. 읽기 작업의 효율성은 N-1이되고 쓰기 작업은 그 1/2이 되는데 이것은 하나의 데이터 블록을 쓸때 패러티 디스크에도 동시에 써야하기 때문이다. 깨진 하드디스크를 복구하려면 단지 데이터들을 다시 읽고 다시 쓰기만 하면 된다. 데이터들은 패러티 디스크에서 읽혀져 새로 장착된 디스크에 쓰여진다.

RAID5

이것은 RAID4와 유사하지만 패러티 디스크의 정보들이 모든 하드디스크에 분산되어 있으며 패러티 디스크가 따로 없다는 점이 다르다. RAID4에서와 모든 같이 쓰기 작업에서 패러티 디스크에 접근할 필요가 없어 패러티 디스크의 작업부하를 줄여준다. (이 경우에는 하나의 트랙의 패러티 정보가 저장되어 있는 디스크는 각각의 트랙마다 다르다.)

그 밖에도 RAID1에 기반을 둔 여러 가지 혼합 RAID와 또 다른 여러 유형의 RAID가 있다. 또한 물리적 디스크 상에서 디스크 압축을 가능케 하려는 시도도 있지만 이러한 압축의 잇점이 분명하지 않아 논란이 있다. 근간에 보다 많은 의견들이 제시될 것으로 보인다. 여기서 디스크 페일을 방지하기위한 여유도(Redundancy)는 부족하지만 효율성은 가장 높은 RAID0에 대하여 좀 더 살펴보자. 만약 RAID가 3-4개 정도의 디스크로 구성되어 있다면 여유도면에서 매우 큰 비용이 든다. 이 경우 전체 용량의 약 1/3 또는 1/4정도의 손실이 발생한다. RAID에서 여유도가 높으면 디스크 에러는 방지할 수 있으나 사고로 인한 정보의 삭제까지 방지할 수는 없으므로 여유도가 높은 RAID라고 해서 백업을 하지않아도 되는 것은 아니다. 반면에 5개 이상의 디스크가 사용된다면 디스크 용량의 손실분은 줄어들고 여유도 비용도 낮아진다. 16비트 SCSI 카드가 15개까지의 장치를 지원하므로 이 경우 RAID5가 추천할 만 하다.

 

RAID0의 설치 방법

이제 RAID0의 설치방법을 살펴보자. 만일 독자들이 커늘2.0.xx에서와 다른 RAID를 설치하려면 여기서와 다른 조치가 필요하다.

RAID0는 여유도가 없으나 디스크 용량 손실을 줄이기 위해서는 디스크 개수가 많을 것이 권장된다. 디스크가 3개일 때 1개를 낭비하는 것은 정말로 손실이 크다고 할 수 있다. 더구나 높은 여유도가 현실에서는 잘 발생하지 않는 하드 디스크의 물리적 손상이외의 정보의 손실까지 방지할 수 없다. 만일 10개의 하드 디스크를 사용한다면 그 가운데 하나를 패리티제어를 위해 사용한다 해도 그리 큰 용량의 낭비는 아닐 것이다. RAID0에서 어떤 디스크 1개에서 디스크 패일뉴어가 나타나면 모든 물리적 디스크에 있는 모든 정보를 잃게되므로 적절한 백업이 필요한 것이다.

맨처음 해당 드라이브를 커늘에 첨가해야 한다. 리눅스 2.0.xx에서 옵션은 다음과 같다.

Multiple devices driver support (CONFIG_BLK_DEV_MD) [Y/n/?] Y
Linear (append) mode (CONFIG_MD_LINEAR) [Y/m/n/?] Y
RAID-0 (striping) mode (CONFIG_MD_STRIPED) [Y/m/n/?] Y
시스템을 새로운 커늘로 부팅하고 나면 /proc 파일에는 새로 만들어진 md0, md1, md2, md3 등(이것은 디폴트 값임) 4개의 장치에 대한 상태를 포함하는 엔트리 mdstat가 나타난다. 이들 4개중 어느 것도 아직까지 초기화되지 않았으므로 비활성 상태로 나타나고 아직 사용할 수도 없다.
새로운 4개의 장치들은 다음과 같은 mdutil을 이용하여 관리한다.

        -mdadd
        -mdrun
        -mdstop
        -mdop

이것들은 sweet-smoke.ufr-info-p7.ibp.fr/pub/Linux에서 다운로드받을 수 있으며 대부분의배포판에도 포함되어 있다.

커넬 2.1.62이나 그 이상에서는 RAID0, RAID4 ,그리고 RAID5를 사용할 수 있는 `RAIDtools’가 별도의 패키지로 포함되어 있다.   
다음 예에서 우리는 /dev/sdb1과 /dev/sdc1과 같은 두 개의 하드디스크를 사용하는 RAID0 메타디스크를 어떻게 정의하는지 설명해본다.

meta-device  RAID Mode  Disk Partition 1  Disk Partition 1
/dev/md0    linear         /dev/sdb1       /dev/sdc1

파티션 수를 늘일 수도 있다.

일단 메타디스크가 포맷이 되면 이것은 어떠한 상황에서도 변경될 수 없으며 모든 정보를 상실하게 된다.

mdadd -a
mdrun -a

이때 md0는 이미 초기화되어 나타나야 한다. 그것을 포맷하려면

mke2fs /dev/md0

그리고 이것을 마운트한다.

mkdir /mount/md0
mount /dev/md0 /mount/md0

이제까지 모든 것이 순조롭게 작동되면 이제 이들 명령어들을 부팅 스크립트에 포함시켜야 한다. 그러면 다음에 시스템을 재부팅할 때는 RAID0의 메타디스크가 자동적으로 마운트된다. 이를 위해서 먼져 /etc/fstab 파일에 엔트리를 추가하는 한편, 마운트하기전에 실행되는 스크립트 파일로부터 `mdadd -a’와 `mdrun -a’ 명령어를 시행한다. Devian 배포판에는 이들 명령어는 /etc/init.d/checkroot.sh 스크립트 파일에 두면되고 루트 파일시스템을 읽기/쓰기모드에서 리마운팅하기 직전에, 즉 “mount -n -o remount, rw /”라인 직전에 삽입한다.

<<예>>

다음 구성은 필자가 현재 사용하고 있는 것으로 필자는 6.3Gb의 IDE 하드와 4.2Gb 및 2Gb의 SCSI를 사용하고 있다.

HD 6.3Gb IDE
 /    /bigTemp + /incoming    swap    2Gb(RAID)hda4

HD 4.2Gb SCSI
 C:     D:      swap     2Gb(RAID)sda4

HD 2Gb SCSI
 swap    2Gb(RAID)sdb2
#######</etc/fstab>##############################
# <file system> <mount point>  <type>  <options>     <dump>  <pass>
     /dev/hda1       /                    ext2     defaults            0            1
     /dev/hda2       /mnt/hda2       ext2     defaults           0            2
     /dev/md0        /mnt/md0        ext2     defaults           0            2
     proc               /proc              proc     defaults           0            2
     /dev/hda3        none             swap     sw,pri=10
     /dev/sdb1        none             swap     sw,pri=10
     /dev/sda3        none             swap     sw,pri=10

#########</etc/mdtab>############################
# <meta-device> <RAID-mode> <DskPart1> <DskPart1> <DskPart1>
     /dev/md0          RAID0,8k       /dev/hda4   /dev/sda4   /dev/sdb2

루트 파티션은 6Gb 하드에 hda1으로 위치하고 있으며 이 하드에는 또한 인터넷이나 CD의 이미지 저장을 위한 큰 파티션이 있다. 이 파티션은 자주 사용하지 않으므로 그리 큰 부하가 걸리지는 않는다. 4Gb짜리 디스크는 Linux에서 거의 사용하지 않는 MSDOS 파티션이므로 RAID의 효율성을 저해한는 파티션을 나누지 않았다. 2Gb 디스크는 거의 전적으로 RAID 시스템용으로 사용한다. 각각의 디스크에는 스와프 스페이스로 작은 부분을 남겨두었다.

RAID의 모든 디스크(또는 파티션)의 크기를 대략 같게 정했는데 이것은 그 크기가 많이 차이가 나면 RAID의 성능이 악화되기 때문이다. 작은 차이는 문제가 되지 않는다. 우리는 사용가능한 모든 공간을 이용하는데 이에 따라 디스크의 모든 데이터가 연결될 수 있고, 여분의 데이터는 그대로 남아있게 된다.

하나의 RAID에 여러개의 IDE 디스크를 마운팅하면 효율성이 그리 좋지 않지만 한 개의 IDE와 여러개의 SCSI를 마운팅하면 훨씬 좋아진다. IED 디스크는 동시적(concurrent) 엑세스가 불가능하지만 SCSI 디스크는 가능하기 때문이다

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,074 명
  • 현재 강좌수 :  35,995 개
  • 현재 접속자 :  523 명