inux SoftWare RAID 설정 복구 추가 등등

2012. 2. 5. 18:44개발/서버

0. 개요

요즘 disk의 성능과 용량이 증가했다. 하지만, 용량이 커진만큼 문제가 생기면,

잃어 버리는 데이터 또한 상당하다. 난 RAID 의 안정성을 믿지 않는다. 많은 복구

작업을 하면서 느낀 것이지만, H/W RAID는 내게

그렇게 신뢰를 주지 못했다. 하지만, S/W RAID 1 은 내게 다음과 같은 매력을 느끼게

해 주었다.


 

(1) 신뢰성


 

다른것은 모른다. 난 RAID 5는 그렇게 좋아하진 않는다. 정말 HDD의 물리적인 고장엔

탁월한 복구 능력이있지만, 내가 복구하러 간 대부분의 시스템은 H/W 적으로 약간의

BadBlock 또는 파일시스템이 엉켜버린 상황이었다.


 

그래서 RAID 5는 복구 능력이 불행히도 전혀 없었다. 하지만, RAID 1(미러링) 간단한

테스트로 내게 신뢰를 주었다.

linux 설치시 시스템 영역은 그리 중요하지 않다. 그냥 일반적으로 설치한다.


 

그리구 하루에 한번, 적어두 일주일에

한번씩 시스템 영역을 백업하면 문제가 없다. 중요한것은 데이터(홈,DB,메일)이다.

예를 중요한 DB 데이터를 RAID 1으로 미러링을 한다. 그리고 전원을 내리고 하나의

디스크를 뽑은 다음 다른 곳에 장착한 다음 CD로 Linux 를 부팅하여 Linux Rescue

모드로 들어간다. 그리고 일반적인 방법으로 마운트 한다...


 

정말 신기하게 DATA는 모두 살아 있었다. 아무래도 문제가 생기는것이 파일 시스템 쪽 문제다.

소프트웨어 라서 지능적으로 처리할것으로 예상 하고 진행한다.


 

(2) 성능


 

성능은 다름이 아닌 속도이다. 하나의 DISK를 사용하는것 과 별 차이를 느끼지 못했다. 하지만,

실 운영에는 다를것으로 예상한다.


 

(3) 단점


 

HDD 공간이 많이 필요하다... <== 안정성만 보장된다면 이건 아무것두 아니다.


 



1. RAID (redundant array of independent [또는 inexpensive] disks)


 

이 용어의 의미는 적지 않는다. 물론 S/W RAID를 사용하고자 하는 사람들은

이미 많이 알고 시작할것이다.^^;


 

2. 종류


 

(1) Linear mode


 

여러개의 디스크를 순차적으로 묶는다. 0 처럼 분산 저장하지 않는다.


 

(2) RAID 0


 

stripe, 여러개의 디스크에 물리적으로 분산 저장한다. 성능이 아주 향샹된다.

H/W RAID 구성시 이 모드를 써봤다. DISK 속도가 장난아니게 빨랐다.^^;

S/W RAID 는 만약 16K를 저장한다면, 0번디스크에 4K, 1번에 4K, 다시 0번에 4K ,

다시 1번에 4K 이렇게 저장 알려진 성능은 S/W 에서두 꾀 빠른 성능을 보인다구 한다.


 

(3) RAID 1


 

mirroring , redundancy 구성 2개의 DISK가 있다면, 똑 같은 데이터를 똑같이 저장한다.

쓰기 시간은 대체로 떨어진다. 읽기 성능은 빠르다는데.. ㅠㅠ^^;


 

(4) RAID 4


 

난 레벨을 알구 싶지 않다.. 그래서 생략^^;


 

(5) RAID 5


 

3개 이상의 DISK로 구성, 용량 = (디스크수-1)*한개용량, 자체 패러티채킹을 해서 복구

능력이 있다.

3개중에 1개가 고장나두 2개 가지고 운영이 가능하다.. 읽기, 쓰기 성능이 대체로 괜찮다.

안정성두 괜찮다.


 



3. RAID르 SWAP 으로?


 

스왑은 오래전부터 파티션을 나눠서 잡아주면 이런 기능을 하였다. 그렇지만, 스왑공간에

문제가 생기면, 시스템에 커다란 장애를 준다고 한다. 난 스왑 쓰는것을 안 좋아 한다...

왜냐면? 이놈 쓰면 무조건 느려진다.


 

4. H/W 적인 문제


 

(1) SCSI


 

컨트롤러의 대역폭이 채널당 320MB/Sec 라면, 디스크 속도를 대충 60MB/Sec 로 봤을때,

6개 이상 구성하면, 모두 풀^^ 가동했을때 문제가 생길것이다. 그치만, 6개 이상

달일두 없다.


 

(2) IDE


 

일반적으로 안정성이 떨어진다. 요즘 IDE두 채크섬 계산을 한다는군^^; 예전에는 전혀

하지 않았다고 한다.

성능이 요즘 많이 향상되었지만, CPU자원을 많이 먹는다. 하나의 버스에 하나의 DISK 만

연결하길 권장한다.


 

요즘 IDE는 최대 8M 의 내부 캐시를 가지고 있지만, SCSI는 오래전부터 8M였다.


 



5. Hot Swap 과정 (SCA:Single Connection Attach 를 지원해야 한단다^^)


 

일반적으로 H/W RAID는 자동으로 알아서 한다.^^; 그걸 봤다^^; 하지만 이건 그게 아니더군~~


 

(1) 파티션 테이블 백업

sfdisk -d /dev/sdb > patitions.sdb


 

(2) RAID 에서 DISK 제거

raidhotremove /dev/md0 /dev/sdb1


 

(3) 다음 파일에서 교체한 DISK의 정보를 알아둔다.

cat /proc/scsi/scsi


 

(4) proc를 이용하여 시스템에서 장치를 제거한다.

(아래 숫자들은 위 DISK 정보에서 추출한다.)

echo "scsi remove-single-device 0 0 2 0" > /proc/scsi/scsi


 

(5) DISK 제거 확인

cat /proc/scsi/scsi


 

(6) 물리적으로 디스크를 제거하교 새것으로 교체^^:


 

(7) proc를 이용하여 시스템에서 장치를 인식한다.

echo "scsi add-single-device 0 0 2 0" > /proc/scsi/scsi


 

(8) 파티션 테이블을 리스토어

sfdisk /dev/sdb < patitions.sdb


 

(9) RAID에 디스크 추가

raidhotadd /dev/md0 /dev/sdb1

('')실제 이작업은 raid1일때 디스크 하나가 고장이 났을경우 새로하나를 추가하여

복구를 한다
 



6. RAID 설정


 

(0) 디스크 파티셔닝


 

새 디스크가 있으면, 그 디스크에 파티션을 만든다. 그리구 mkfs 로 파일

시스템을 만든 다음 다음 단계를진행 (보아하니. ext2로 만들어야지 작동을 한다.)


 

(1) raidtab 에 설정한다. (/etc/raidtab)


 

1) linear 모드 (이것 쓰는것 보다 LVM 쓰는게 좋을듯^^)


 

raiddev /dev/md0

raid-level linear

nr-raid-disks 2

chunk-size 32

persistent-superblock 1

device /dev/sdb6

raid-disk 0

device /dev/sdc5

raid-disk 1


 

2) RAID 0


 

raiddev /dev/md0

raid-level 0

nr-raid-disks 2

persistent-superblock 1

chunk-size 32

device /dev/sdb6

raid-disk 0

device /dev/sdc5

raid-disk 1


 

3) RAID 1


 

raiddev /dev/md0

raid-level 1

nr-raid-disks 2

nr-spare-disks 0

chunk-size 4

persistent-superblock 1

device /dev/sdb6

raid-disk 0

device /dev/sdc5

raid-disk 1


 

4) RAID 5


 

raiddev /dev/md0

raid-level 5

nr-raid-disks 3

nr-spare-disks 0

persistent-superblock 1

parity-algorithm left-symmetric

chunk-size 128

device /dev/sda3

raid-disk 0

device /dev/sdb1

raid-disk 1

device /dev/sdc1

raid-disk 2


 

5) 용어 설명


 

- raiddev : 레이드 장치명 /dev/md숫자

- raid-level : RAID 레벨 linear, 0, 1, 4, 5 등이 올수 있다.

- nr-raid-disks : 레이드 구성할 디스크 수

- nr-spare-disks : 여분 disk 수

- persistent-superblock : 첫번째 디스크에 RAID 관련 특별한 수퍼블럭을 기록,

커널이 인식할 수있게함


 

이 옵션을 켜야지만, Autodetection이 가능하다.

- chunk-size : 사전상의 의미는 "덩어리" 이정도로 나온다. 블럭이랑 비슷한 개념이다.


 

만약 RAID 0에서 2개의 disk 가 있다면, 특정용량으로 번갈아 가면서 저장해야 할것이다.

그 나눌 용량을 설정한다. RAID 0는 32K가 적당, RAID 1은 읽을때 사용하며 32K,


 



(2) 레이드 드라이브 생성

mkraid /dev/md0


 

(3) 확인

cat /proc/mdstat


 

(4) RAID 정지

raidstop /dev/md0


 

(5) RAID 시작

raidstart /dev/md0


 



7. 성능 테스트 (by doly)


 

구딱따리 disk를 가지구 성능 테스트 했다.

- CPU : P3-550(512k,100MHz) *2

- BOARD : Intel L440GX+

- RAM : 64M(ECC,Reg, PC100) *2

- HDD : 18G (OS), 4G *3 (80pin 으로 돌아가는 disk의 led를 확인 가능하다.)

- OS : Fedora Core2 (2.6.5-1.358smp)

- 테스트 도구 : 파일 : 1,524,037KByte (약 1.5G 파일), 명령: hdparam, time , cp


 



(1) 디스크 정보 및 성능(hdparam -t )


 

sda : SEAGATE | ST318436LC | 18G | 7200RPM | 25.36 MB/Sec

sdb : Fujisu | RZ1CF-CF | 4G | 7200RPM | 12.13 MB/Sec

sdc : SEAGATE | RZ1CB-CS | 4G | 7200RPM | 9.02 MB/Sec

sdd : Fujisu | RZ1CF-CF | 4G | 7200ROM | 12.13 MB/Sec


 



(2) RAID 구성시


 

1) RAID 0 : sdb, sdc, sdd : 12.8G | 27.03 MB/Sec


 

속도는 최고 느린 disk 에 속도 *3 정도 되는 것 같다. (9.02*3=27.09)

-복사 테스트 : sda --> RAID0 : 1m45.065초 (약 14.506MByte/Sec)

RAID0 --> sda : 1m36.274초 (약 15.830MByte/Sec)


 

2) RAID 1 : sdb, sdc, sdd : 4G | 12.13 , 9.02, 12.13 MB/Sec

(이렇게 돌아가면서..)


 

미러링 구성하면, 동기화 한다고 시간이 좀 걸린다.

(cat /proc/mdstat 진행률을 하면 볼수 있다.)

동기화하는데 약 10분 정도 소요되었고, 부하는 거의 없었고 ,

속도 저하또한 거의 없었다.


 

속도 채크를 하면, 디스크가 sdb, sdc, sdd 순으로 돌아가면서 속도가 나온다.

-복사 테스트 : sda --> RAID1 : 3m38.148초 (약 6.991MByte/Sec)

RAID1 --> sda : 2m36.502초 (약 9.769MByte/Sec)


 

2) RAID 5 : sdb, sdc, sdd : 8G | 15.26 MB/Sec


 

이것또한 RAID 구성한다고 시간이 좀 걸린다. ( 약 10분 ) , 부하는 좀 있고,

속도 저하 아주 조금 echo "scsi remove-single-device 0 0 2 0"

> /proc/scsi/scsi 이 방법으로 sdc를 제거했다.

그런다음 물리적으로 disk를 뺀다.. 물론 HotSwap 베이가 있다.


 

그러니 자동으로 sdb,sdd 만 운영된다. 속도테스트 : 24.04 MB/Sec..

RAID 0으로 작동하는것 같다^^

물리적으로 다시 끼운다. 디스크는 돌기 시작하지만, linux 는 인식하지 못한다.


 

echo "scsi add-single-device 0 0 2 0" > /proc/scsi/scsi

이런명령을 내리니 linux에서 인식한다.


 

하지만 이게 왠일?? sdg로 인식한다. 그래두 상관없다.

raidhotadd /dev/md0 /dev/sdg1 으로 인식시킨다.

정상 작동 하며, 복구를 시작한다. 또 약 10분이 걸린다.^^


 

-복사 테스트 : sda --> RAID5 : 2m27.263초 (약 10.367MByte/Sec)

RAID5 --> sda : 2m15.695초 (약 11.289MByte/Sec)


 



8. 끝내며..

생각보다 성능이 좋다. 못쓰는 디스크들 모아서 RAID 구성하면,

꽤 쓸만한 장치가 된다.^^ 물론 서버로는

불안, 초조, 긴장이겠지^^;