본문 바로가기
정보보안/이론

[KITRI] Day10. 리눅스 RAID 구성하기

by 민-Zero 2020. 5. 7.

RAID 정리

 

RAID 란?

위키백과에서는 다음과 같이 설명한다. 복수 배열 독립 디스크(Redundant Array of Independent Disks 혹은 Redundant Array of Inexpensive Disks)는 여러 개의 하드 디스크에 일부 중복된 데이터를 나눠서 저장하는 기술이다. 디스크 어레이(disk array)라고도 한다. 데이터를 나누는 다양한 방법이 존재하며, 이 방법들을 레벨이라 하는데, 레벨에 따라 저장장치의 신뢰성을 높이거나 전체적인 성능을 향상하는 등의 다양한 목적을 만족시킬 수 있다.

RAID는 여러 개의 디스크를 하나로 묶어 하나의 논리적 디스크로 작동하게 하는데, 하드웨어적인 방법과 소프트웨어적인 방법이 있다. 하드웨어적인 방법은 운영 체제에 이 디스크가 하나의 디스크처럼 보이게 한다. 소프트웨어적인 방법은 주로 운영체제 안에서 구현되며, 사용자에게 디스크를 하나의 디스크처럼 보이게 한다.

즉, 정리하면 하드디스크를 병렬로 사용하는 기법을 말하며 컴퓨터의 성능을 높이기위한 방법이다. 

 

<RAID 0>

스트라이핑(stripe or striping) 이라고 불리는 RAID0는 2개 이상의 하드디스크를 병렬로 연결해 하나의 하드디스크로 사용하는 기술이다.

https://en.wikipedia.org/wiki/Standard_RAID_levels

A, B라는 하드디스크가 존재하고 123456 이라는 데이터를 저장하려고 한다면 0 level은 두 하드디스크에 번갈아가며 저장하는데 해당 과정이 거의 동시에 일어나 저장하는 속도를 1개를 사용할때보다 증가하게 된다. 하지만 하드디스크 개수의 배수만큼 속도가 증가하지는 않으며 만약 다른 하드디스크 1개가 망가지면 모든 데이터가 사라지는 상황이 발생하는 단점이 존재한다.

A B A B A B
1 2 3 4 5 6

병렬로 데이터를 저장할때 속도의 증가가 발생한다고 했는데 그 이유를 간략히 정리하자.

실제로 데이터가 컴퓨터 내부에 전송되는 속도보다 하드디스크에 저장되는 속도가 느리기 때문에 이를 상쇄하기 위해 병렬 연결을 고려하는 것이다. 또한 하드디스크는 원형의 판이 회전하며 그 표면의 전기 신호를 읽거나 쓰는 처리를 하도록 구성되어 있는데 이런 처리 속도보다 회전속도가 빠르기 때문에 실제 하드디스크에는 데이터가 순서대로 저장되지 않는다. 예를 들어 하드디스크를 5등분 하고 각 부분에 번호를 1,2,3,4,5로 매겼을 경우 실제 데이터는 각 부분에 순차적으로 저장되는 것이 아니라 1, 4, 2, 5, 3 과 같이 일정한 간격(해당 예시에서는 2라는 간격을 가정)을 두고 저장이 된다. 따라서 간격만큼 처리시간에 지연이 발생되는 것이다. 이것을 만회하기 위해 처리지연이 일어나는 동안 다른 하드디스크에 데이터를 저장하는 것을 고려한 것이 RAID 0 가 된다.

 

<RAID 1>

미러링(mirror or mirroring)이라고 불리는 RAID 1은 두개 이상의 하드디스크를 이용해 저장하는 데이터를 다른 한쪽에도 똑같이 복사해 저장하는 방법이다.

https://en.wikipedia.org/wiki/Standard_RAID_levels

RAID 0와 같은 속도의 증가는 전혀 없으며 디스크의 용량또한 50%만 사용할수 있다는 단점을 지니지만 항상 동일한 데이터를 담고있는 하드디스크 1개를 확보할 수 있으므로 데이터 유실에 대한 복구 대책을 가지게 되는 장점을 가진다.

 

<RAID 2>

RAID 2는 데이터 저장용 디스크와 복구용 디스크를 나누어 저장한다. 이때 데이터 저장시 RAID 0와 같은 스트라이프 방식을 사용하며 데이터 복구에는 해밍 코드를 통해 데이터 복구를 수행한다.

하지만 RAID 4의 등장으로 거의 사용하지 않는다.

 

<RAID 3, 4>

RAID 3, 4는 RAID 0, 1의 문제점을 보완하기 위해 등장한것으로 3, 4로구분되어 있지만 둘의 구성은 거의 비슷하다.

데이터의 저장은 RAID 0와 같이 스트라이핑으로 수행하며 추가적으로 에러체크 및 복구를 위한 parity 정보를 별도의 디스크에 따로 저장한다.

3, 4의 차이점은 3의 경우 byte단위로 데이터를 저장하고 4는 block단위로 저장한다는 차이를 가진다. block단위로 데이터를 저장할 경우 데이터의 크기가 작은 파일은 한번의 작업으로 데이터를 읽을 수 있기 때문에 성능상의 장점이 있으며 3은 동기화 과정을 거쳐야 하기 때문에 4를 더 많이 사용한다.

또한 RAID3은 적어도 3개의 하드디스크가 필요하며 4는 2개 이상의 하드디스크만 있어도 구성할 수 있다.

<RAID 5>

RAID 5는 3, 4의 단점을 보완한 방식으로 가장 많이 사용되는 방식중 하나이다. parity 정보를 한 디스크에 몰아서 저장하는 것이 아닌 모든 디스크에 분산하여 저장한다. 따라서 3개 이상의 디스크를 필요로 하며 3, 4에서 패리티를 저장하는 디스크와 정보를 저장하는 디스크 1개가 동시에 망가질경우 데이터 복구가 불가능한 단점을 보완한다.

하지만 데이터를 읽는 과정에서 패리티 정보를 갱신하며 읽게 되기 때문에 약간의 성능저하를 유발할 수 있다. RAID 0보다 성능은 떨어지지만 성능, 안정성, 용량 모두를 고려한 방식이다.

 

<RAID 6>

RAID 6는 5와 같은 개념으로 사용하지만 parity 정보를 하나 더 넣어 여러 하드에 문제가 생겨도 데이터 복구를 가능하게 하여 더욱 안정성에 신경쓴 방법이다.

데이터가 스트라이핑으로 저장되기 때문에 0+1이나 1+0 보다 성능과 신뢰성이 좋지만 2차 parity 정보를 저장하면서 읽기 성능은 5와 비슷해 졌고 데이터를 쓰는 경우 작업의 구현이 매우 복잡해져 일반적으로 잘 사용하지는 않게 되었다.

 

<RAID 0+1(RAID01)>

RAID 0+1은 0 와 1을 동시에 구현한 방식이다. 먼저 스트라이핑한 디스크를 생성후 스트라이핑 한 디스크들을 미러링방식으로 묶어서 구현한다.

따라서 RIAD 0의 장점인 속도의 증가와 RAID 1의 데이터 백업을 동시에 지원한다.

 

<RAID 1+0(RAID10)>

0+1과는 거꾸로 RAID 1을 사용해 미러링으로 구성한다. 그리고 미러링으로 구성된 디스크들을 스트라이핑을 통해 묶는 방식을 수행한다.

그럼 0+1과 1+0은 최종적으로 같은 동작을 하는것 처럼 보여 무슨 차이가 있는지 의아함이 생긴다. 물론 둘은 최종적으로 생성되는 디스크의 용량과 속도가 같지만 디스크의 안정성과 디스크의 복구 성능에서 차이가 생기게 된다.

 

안정성 측면

RAID 01은 디스크 0과 2가 동시에 망가질 경우 모든 디스크가 먹통이되지만 10은 0 과2가 동시에 망가져도 전체 디스크가 동작하는데 문제가 없다. 물론 10도 디스크 0과 1이 동시에 망가진다면 전체 디스크가 깨지지만 전체 디스크가 망가질 확률이 01보다 적으므로 안정성 측면에서 RAID 10이 좀더 좋다고 할 수 있다.

복구 측면

망가진 디스크의 복구과정 에서 01의 경우 디스크 0번이 망가진 경우 0번 디스크를 교체한후 재구성하게 되면 디스크 2, 3번으로 구성된 RAID 0 전체가 복사되지만 RAID 10의 경우 0번 디스크를 교체했다면 1번 디스크에서 복사를 하게되어 리소스의 비용이 훨씩 적게들어 시간이 단축된다.

 

Linux에서 RAID 구성하기

선처리 작업

우선 리눅스에서 RAID를 구성하기 위해 앞에서 정리했던 fdisk 명령어를 통해 파티션의 설정을 바꾸어 주어야 한다.

/dev/sdb를 이용해 한개의 단일파티션을 생성할 경우 Linux 라는 단순방식으로 설정되어 있다.

 

해당 설정을 변경하기 위해 fdisk 에서 l을 눌러 확인하면 다양한 파일시스템 유형을 지원하는 것을 학인할 수 있다.
그중 fd Linux raid auto 방식을 사용해 raid를 구성할것이다.

 

t 커맨드를 이용하여 파티션의 유형을 변경할 수 있고 raid구성을 위해 필요한 Linux raid auto가 hex 코드 fd를 지니고 있으므로 fd를 입력하면 유형이 변경된 것을 확인할 수 있다. 

그럼 레이드 구성을 위해 필요한 갯수만큼 파티션을 설정해 주면 된다.


해당 과정이 필요한 이유는 하드디스크 제일 앞부분에 Raid로 구성된다는 metadata가 들어 있어야 하기 때문에 정보공간을 확보하기 위해 파일시스템 유형을 미리 바꿔주어야 한다.
t 커맨드를 통해 파일시스템 유형을 변경할 수 있고 fd 라는 hex code를 통해 Linux raid auto 모드로 변경하자.

 

mdadm 명령어

해당 명령어는 RAID를 구성할 수 있게 해주는 명령어이다. 파티션에 해당 디스크는 raid로 구성할 것이라고 미리 알려주는 메타데이터를 입력하는 과정을 수행 하였으므로 이제 디스크들을 이용해 raid를 구성하면 된다.

 
mdadm -옵션 옵션값 -옵션 옵션값 디바이스1 디바이스2 ...


생성
-C, --create : RAID 생성
-l, --level : RAID 레벨 설정 0, 1, 5, 6 을 거의 사용
-n, --raid-devices : RAID로 묶을 HDD의 갯수

확인

mdadm --detail --scan 
mdadm -Ds : 모든 RAID 정보 간단하게 확인 
mdadm -D RAID명 : 특정 RAID 정보 자세히 확인

추가
mdadm --add RAID명 디바이스1 디바이스2 ... : 장치를 추가하는 명령어로 복구시 망가진 디스크를 빼고 동일 raid에 새로운 하드를 추가할때 사용한다.

 

정지, 재구동

mdadm --stop raid장치명  : 구성되어 있는 RAID 멈추기 
멈춘다음에 다시 raid 구성하려고 md1을 사용하면 기존의 레이드 정보가 남아있기 때문에 다시 만들건지 물어본다. 
mdadm --run raid장치명 : 멈춰진 RAID 장치를 가동

 

RAID 1 구성하기

간단하게 미러링 방식을 사용하는 raid 1을 구성해 보자.

raid 1으로 구성하기 위해 필요한 2개의 하드의 파티션 작업을 완료한뒤 mdadm 명령어를 통해 2개의 하드를 raid 1 의 구성으로 하나로 묶어내면 된다.

mdadm -C /dev/md1 -l 1 -n 2 /dev/sdb1 /dev/sdc1 예시에서 사용한 명령어의 뜻을 해석하면 sdb1, sdc1 2개의 장치를 묶어 RAID level을 1로 구성하고 생성되는 raid 장치의 명은 /dev/md1으로 생성해라 라는 뜻을 가지는 명령어가 된다. 명령어를 다르게 작성하면 mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1도 같은 동작을 수행한다. 
그럼 mdadm을 통해 레이드를 구성하면 2개의 디스크가 하나로 묶여 /dev/md1 이라는 새로운 하드디스크가 생성된것 이므로 이전에 하드디스크를 사용하기 위한 과정과 동일하게 수행하면 된다.

 

raid는 파티션을 나눈뒤 생성하므로 파티션 설정은 이미 생성되어 있는것과 같으므로 이제 해당 하드에 데이터를 저장할 수 있도록 mkfs 명령어를 사용해 파일시스템을 생성해주어야 한다.
mkfs -t ext3 /dev/md1
mkfs.etx3 /dev/md1

 


마지막으로 raid로 구성된 하드디스크에 접근할 수 있도록 마운트작업을 수행하면 된다. 마운트를 위해 /raid1 이라는 디렉토리를 만들고 해당 디렉토리에 /dev/md1을 마운트 시켜주면 된다. 마운트 정보를 유지하려면 앞서 정리한것 처럼 /etc/fstab에 등록하면 된다.
그럼 raid 1으로 구성된 하드를 사용할 수 있게 된다.

 

RAID 1+0 구성하기

RAID 1과 0을 혼합하여 구성하는 RAID 1+0도 단일 구성과 차이점이 없다. 차이점이라면 mdadm을 통해 raid로 묶는 과정이 추가되는것 뿐이다.

 

HDD1-- raid1 /dev/md1 -- 

HDD2-- raid1 /dev/md1 -- 2개의 디스크를 raid 1으로 구성한다.

                                                                    --> 각 raid1으로 구성된 2개의 raid 장치를 다시 raid 0로 묶는다.

HDD3-- radi1 /dev/md2 -- 2개의 디스크를 raid 1으로 구성한다.

HDD4-- raid1 /dev/md2 --

 

우선 2개의 raid 1 을 준비한다. 이때 해당 raid는 0로 묶이는 일반 디스크와 같은 역할이므로 파일시스템을 생성하는 작업은 불필요하다.

 

mdadm 명령어를 통해 raid 1으로 생성된 2개의 장치 md1 과 md2를 일반 디스크로 raid를 구성할때와 같이 raid 0로 설정하여 묶어내면 생성한 /dev/md10은 raid 1+0으로 구성되게 된다.

 

이제 만든 md10을 파일시스템을 만든뒤 마운트하고 사용하면 된다. 하지만 /etc/fstab에 등록하고 재부팅을 해도 md10이 남아있지 않게 된다.

이때 mdadm -A /dev/md10 /dev/md1 /dev/md2 로 (-A, Assemble)재조립을 시키면 다시 복구할 수 있다. 그리고 다시 마운트 시키면 기존에 존재하던 파일도 남아있는 것을 확인할 수 있다.

 

이러한 일이 발생하는 이유는 기본 RAID 방식 0~6 까지는 재부팅 이후에도 RAID 구성이 유지되지만, RAID0+1, 1+0과 같이 혼합한 방식은 풀어지게 되는 경우가 생긴다.

이런 일이 없게 하려면 mdadm -Ds의 정보를 /etc/mdadm.conf라는 파일을 새롭게 생성한뒤 저장하면 조립된 결과를 기억하고 있어 레이드 구성이 사라지지 않게된다. 연습하고 있는 CentOS 5으로 최신버전이 아니라 이런 경우가 발생하지만 최신버전의 리눅스를 사용하면 해당 설정을 하지 않아도 유지된다. 하지만 만일의 경우에 대비하여 생성해 두는것도 좋은 방법이다.

 

raid 문제 발생 테스트

raid 레벨별 테스트를 위해 0 과1 두개의 레이드를 생성했다. 0은 1G 디스크 2개를 모두 저장소로 사용하기 때문에 전체 크기가 2G로 출력되며 raid 1은 하나는 데이터 백업을 위한 저장소로 사용되므로 사이즈가 1G로만 나오는것을 확인할 수 있다.

 

디스크에 문제 발생시 결과를 확인하기 위해 raid 0과 1로 구성된 장치에 디렉토리 1개와 파일 1개를 저장했다.

그리고 각각의 raid를 구성하고 있는 디스크중 1개씩을 제거해 보았다.

 

raid구성하고 있는 HDD이외의 장비는 제거해도 raid를 구성하고 있는 HDD의 이름이 sdb 등으로 이름으로 바뀌어도 raid가 그대로 유지가 된다. 하지만 level0는 결함허용이 되지 않기때문에 raid 구성하는 HDD하나가 사라지면 데이터 복구가 불가능 하기 떄문에 해당 하드를 지우면 데이터를 찾을수 없는걸 확인할 수 있다.
raid1은 하드가 하나 사라져도 데이터가 그대로 남아있는것을 확인할 수 있다.

또한 복구를 위해 mdadm --add /dev/md1 /dev/sdd1 이라는 명령을 사용하면 하드를 하나 추가해서 raid1을 복구할 수 있게된다.

댓글