INFRA/Linux

RAID 구성+복구 실습 -> Window+Linux

sshhhh 2024. 6. 27. 23:58

 

RAID (Redundant Array of Inexpensive Disk)

  • 저장장치 여러 개를 묶어 고용량, 고성능인 저장 장치 한 개와 같은 효과를 얻음
  • 여러 개의 Disk를 하나의 가상 Disk로 구성

 

RAID 구성 (Window 2003)

1. HDD 추가

 

 

2. 디스크 초기화 : HDD라고 인식시켜줌

 

3. 동적 디스크로 변환

 

단순 볼륨 E:\

 

스팬 F:\

  • 1개 이상의 동적 디스크에 있는 공간을 하나의 논리적 볼륨으로 만든다.
  • RAID 아님 → 성능 향상, 오류 복구 기능 X
  • E드라이브 1기가 F드라이브 3기가인 상태
  • ex) 1.5기가 파일을 저장하면 1기가는 E 드라이브에, 나머지 500메가는 F 드라이브에 저장함. 이때 F 드라이브에 고장이 발생하면 해당 파일을 열 수 없으며, 스팬 볼륨은 데이터 복구를 지원하지 않음
  • 즉 여러 디스크에 분산된 공간을 하나의 논리적 볼륨으로 합친 것 → 이는 단순히 용량을 늘리는 것 뿐

 

RAID 0 == 스트라이프(분산저장) G:\

  • 최소 2개 이상의 동적 디스크에 데이터를 저장
  • 디스크 1에는 A, 디스크 2에는 B, 디스크 3에는 C와 같이 데이터 분산 저장
    • 번갈아가며 분산 저장되기 때문에 용량이 동일한 디스크에만 묶인다.

  • 단순 볼륨 E랑, 분산 저장 G에 ABCD저장되어있을때 동시에 ABCD 열려고 하면 분산 저장해둔게 더 빨리뜸
    왜냐면 G의 HDD는 각각 AC DB 두글자만 읽으면되는데 E에서는 ABCD 다 읽어야되서
  • 단순 볼륨 E:와, 분산 저장 G에 ABC라는 데이터가 저장되어 있을 경우 동시에 ABCD를 열려고 할 때 분산 저장된 G:가 더 빨리 접근된다. 이는 G:의 각각의 HDD가 각각 A B C 한글자만 읽으면 되기 때문
    E:는 ABC 다 읽어야 한다. → 분산저장 장점 : 단순, 스팬 볼륨보다 엑세스 속도가 빨라진다. == 성능향상

 

RAID1 ==미러링 H:\

  • 2개의 동적 디스크에 사용자 데이터를 복제 → 오류복구O, 데이터 손실 방지

  • H:\ 2개 생성됨 근데 용량이 2GB가 아니고 1GB임 왜냐면 미러링이기 때문
    디스크1에도 ABCD적히고 디스크2에도 ABCD적힘
  • H:\ 2개 생성되었지만 각 드라이브의 용량이 2GB가 아닌 1GB인 이유는 미러링 구성 때문이다.
    즉, 디스크 1과 디스크 2에 동일한 데이터가 저장됨

  • 단점
    • 하드디스크 낭비 심함 ex) 1테라바이트의 하드디스크를 2개 미러링한다면 사용 가능한 용량은 1테라바이트뿐 → HDD용량 절반밖에 쓸 수 없음
    • 성능 향상 X

 

RAID 5 I:\

  • 데이터를 3개 이상의 동적디스크에 스트라이프로 저장한다.
  • 데이터의 일부를 손실한 경우 데이터를 복구할 수 있다.
  • 첫번째 디스크에 A,C 두번째에 B,D라는 실제 데이터 적고 세번째에 P 실제 데이터 아닌 패리티값을 적는다.

  • 패리티실제 데이터 컴퓨터에서 저장된 값
    디스크1 0
    디스크2 1
    디스크3 P 가,나 XOR연산값 : 1
    • 두 비트를 XOR해서 나온값 같으면 0 다르면 1 → 실제 데이터 아님 오류복구하려는 값
    • 여기서 디스크2내용 날아가도 패리티 값으로 유추가능
  • 디스크 3개를 RAID로 묶으면 총 용량은 3GB이지만, 패리티 값 1GB를 제외해야 하므로 실제 사용 가능한 용량은 2GB (디스크 4개를 묶으면 디스크 1개가 패리티 정보로 사용되어 실제 저장 용량은 3/4)

 

RAID 상세 설명

 

  • RAID 0
    • 성능은 좋지만 오류 복구X
  • RAID 1
    • 소프트웨어 미러링은 데이터 낭비가 심하기 때문에 주로 OS에서 사용
  • RAID 5
    • 두 개 이상의 하드디스크가 손상되면 데이터 복구 불가능
    • 따라서, 실제로는 RAID 0+1 또는 RAID 1+5 구성을 많이 사용
  • RAID 1+5 : 실전에서 많이 사용
    • 높은 가용성: RAID 1 미러링을 통해 하나의 디스크가 고장 났을 때도 데이터 손실 없이 시스템을 계속 사용
    • 향상된 데이터 무결성: RAID 5의 분산된 패리티 체계를 통해 하나 이상의 디스크가 고장 났을 때도 데이터를 복구
  • RAID 1+0 : 가용성을 위해 사용
    • 높은 가용성: RAID 1 미러링
    • 향상된 성능: RAID 0 스트라이핑을 통해 여러 디스크에 데이터를 분산하여 읽기 및 쓰기 성능을 향상
  • RAID 6 : 네 개 이상의 하드디스크에서 사용되며, 두 개 이상의 패리티 값이 저장

 

 

 

 

RAID 복구

1. a.txt 모든 디스크에 추가함

2. 하드디스크 하나가 고장났다고 가정하고 삭제했다.

  • 그 결과, 단순볼륨 E: 스팬 F: RAID 0 G: 사라지고 미러 H: , RAID 5 I: 만 존재한다.
    → 미러, RAID 5만 오류 복구된다는 것을 알 수 있음.

 

 

3. 미러 복구 : 복구를 위해 하드디스크 하나 추가

  • 복구를 하지 않아도 데이터 접근은 가능하지만, 하드디스크 하나가 손상되었기 때문에 미러가 아닌 단순 볼륨 상태이다. 가용성을 위해 미러를 복구해주어야함.

 

 

4. RAID 5 복구

 

 

RAID Linux 실습

RAID 0

  • mdadm : Software RAID 관리 명령--create Raid 장치 생성 --detail 장치 상세 정보  
    --stop 중지 --scan 검색
    --level 종류 설정 -a, -r, -f Disk 추가, 삭제, 실패상태로 표시
--패키지 설치되었는지 확인
[root@localhost ~]# rpm -qa | grep mdadm
mdadm-4.2-2.el9.x86_64
  1. 동일한 용량을 갖는 다수의 파티션 생성(RAID 타입)
  • fdisk /dev/sdb -> n -> p -> 1 -> enter -> +1G -> t -> fd -> p -> wq
  • fdisk /dev/sdc -> n -> p -> 1 -> enter -> +1G -> t -> fd -> p -> wq
--HDD 4개 추가 후 확인
root@localhost ~]# fdisk -l

--파티션 생성 -> 리눅스 RAID 타입으로 변경
Partition number (1, default 1): 1
Hex code or alias (type L to list all): fd

Device     Boot   Start     End Sectors Size Id Type
/dev/sdb1          2048 2099199 2097152   1G fd Linux raid autodetect
Device     Boot Start     End Sectors Size Id Type
/dev/sdc1        2048 2099199 2097152   1G fd Linux raid autodetect

 

 

2. RAID 0 레벨의 RAID 구성

  • mdadm --create /dev/md0 --level=[RAID레벨] --raid-devices=[RAID 구성 수] [장치1] [장치2]
[root@localhost ~]# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid0] 
md0 : active raid0 sdc1[1] sdb1[0]
      2093056 blocks super 1.2 512k chunks
      
unused devices: <none>
[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Fri May 31 17:10:08 2024
        Raid Level : raid0
        Array Size : 2093056 (2044.00 MiB 2143.29 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Fri May 31 17:10:08 2024
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

            Layout : original
        Chunk Size : 512K

Consistency Policy : none

              Name : localhost.localdomain:0  (local to host localhost.localdomain)
              UUID : d74423ff:d47d4790:666768a7:cb829ad3
            Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1

 

 

3. RAID 장치 포맷

[root@localhost ~]# mkfs -t xfs /dev/md0
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md0               isize=512    agcount=8, agsize=65408 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=523264, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

 

 

4.RAID 장치 마운트

[root@localhost ~]# mkdir /test_raid0
[root@localhost ~]# mount /dev/md0 /test_raid0
[root@localhost ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             4.0M     0  4.0M   0% /dev
tmpfs                872M     0  872M   0% /dev/shm
tmpfs                349M  7.1M  342M   3% /run
/dev/mapper/rl-root   39G  4.6G   34G  12% /
/dev/sda1           1014M  373M  642M  37% /boot
/dev/mapper/rl-home   19G  171M   19G   1% /home
tmpfs                175M  100K  175M   1% /run/user/0
/dev/sr0             7.9G  7.9G     0 100% /run/media/root/Rocky-9-0-x86_64-dvd
/dev/md0             2.0G   47M  1.9G   3% /test_raid0

 

5. 4는 재부팅시 사라지니 자동마운트

-- RAID 자동구성
[root@localhost ~]# mdadm --detail --scan >> /etc/mdadm.conf
[root@localhost ~]# cat /etc/mdadm.conf 
ARRAY /dev/md0 metadata=1.2 name=localhost.localdomain:0 UUID=d74423ff:d47d4790:666768a7:cb829ad3
--마지막 줄에 마운트 정보 추가
[root@localhost ~]# vim /etc/fstab

 

6. 확인

[root@localhost ~]# tail -3 /etc/fstab 
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0
/dev/md0	/test_raid0	xfs	defaults	0 0

  

RAID-5

  1. RAID-0 마운트 해제 및 구성 중지
[root@localhost ~]# umount /test_raid0
[root@localhost ~]# mdadm --stop /dev/md0
mdadm: Value "localhost.localdomain:0" cannot be set as name. Reason: Not POSIX compatible. Value ignored.
mdadm: stopped /dev/md0

 

2. - 1G 크기의 /dev/sdd1 파티션 생성 후 진행

Device     Boot Start     End Sectors Size Id Type
/dev/sdd1        2048 2099199 2097152   1G 83 Linux

 

3. RAID-5 레벨의 RAID 구성

[root@localhost ~]#  mdadm --create /dev/md5 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
mdadm: Value "localhost.localdomain:0" cannot be set as name. Reason: Not POSIX compatible. Value ignored.
mdadm: /dev/sdb1 appears to be part of a raid array:
       level=raid0 devices=2 ctime=Fri May 31 17:10:08 2024
mdadm: /dev/sdc1 appears to be part of a raid array:
       level=raid0 devices=2 ctime=Fri May 31 17:10:08 2024
Continue creating array? 
Continue creating array? (y/n) y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.

 

4.구성 확인

[root@localhost ~]# mdadm --detail /dev/md5
mdadm: Value "localhost.localdomain:0" cannot be set as name. Reason: Not POSIX compatible. Value ignored.
/dev/md5:
           Version : 1.2
     Creation Time : Fri May 31 17:28:17 2024
        Raid Level : raid5
        Array Size : 2093056 (2044.00 MiB 2143.29 MB)
     Used Dev Size : 1046528 (1022.00 MiB 1071.64 MB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

       Update Time : Fri May 31 17:28:22 2024
             State : clean 
    Active Devices : 3
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 0

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : resync

              Name : localhost.localdomain:5  (local to host localhost.localdomain)
              UUID : 3dd2676b:66ff80d3:27b53cf2:63129ffa
            Events : 18

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       3       8       49        2      active sync   /dev/sdd1

 

5.RAID 장치 포맷

[root@localhost ~]# mkfs -t xfs /dev/md5
mkfs.xfs: /dev/md5 appears to contain an existing filesystem (xfs).
mkfs.xfs: Use the -f option to force overwrite.

 

6.RAID 장치 마운트

[root@localhost ~]# mkdir /raid5
[root@localhost ~]# mount /dev/md5 /raid5
mount: /raid5: wrong fs type, bad option, bad superblock on /dev/md5, missing codepage or helper program, or other error.

--에러 발생해서 강제로 xfs 포맷 수행 후 진행
[root@localhost ~]# mkfs -t xfs -f /dev/md5
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/md5               isize=512    agcount=8, agsize=65408 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=523264, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

  

RAID-5 장애구성

  1. 1G 크기의 /dev/sde1 파티션 생성 후 진행
Device     Boot Start     End Sectors Size Id Type
/dev/sde1        2048 2099199 2097152   1G 83 Linux

 

2. spare 파티션 sde1 추가

[root@localhost ~]# mdadm /dev/md5 -a /dev/sde1
mdadm: Value "localhost.localdomain:0" cannot be set as name. Reason: Not POSIX compatible. Value ignored.
mdadm: added /dev/sde1

--RAID-5 장치 정보 확인
[root@localhost ~]# mdadm --detail /dev/md5
mdadm: Value "localhost.localdomain:0" cannot be set as name. Reason: Not POSIX compatible. Value ignored.
 Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       3       8       49        2      active sync   /dev/sdd1

       4       8       65        -      spare   /dev/sde1

 

3.장애디스크 결함 설정

--장애 디스크 디바이스에 결함이 있음을 설정
[root@localhost ~]#  mdadm /dev/md5 -f /dev/sdc1
 
 --확인
 [root@localhost ~]# mdadm --detail /dev/md5
 Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       4       8       65        1      active sync   /dev/sde1
       3       8       49        2      active sync   /dev/sdd1

       1       8       33        -      faulty   /dev/sdc1

 

4.장애디스크 삭제

 --장애 디스크 삭제
 [root@localhost ~]# mdadm /dev/md5 -r /dev/sdc1

 --확인
 [root@localhost ~]# mdadm --detail /dev/md5
 Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       4       8       65        1      active sync   /dev/sde1
       3       8       49        2      active sync   /dev/sdd1

 

5. 결론

  • RAID-5 에서 디스크 장애가 발생했을 때 스페어 디스크를 사용하여 데이터 손실 없이 시스템을 유지할 수 있음
  • 장애 처리 전 RAID 상태
    • /dev/sdc1, /dev/sdb1, /dev/sdd1이 활성 상태이며, /dev/sde1은 스페어로 대기 중
  • 결함 설정 후
    • /dev/sdc1이 실패(faulty)로 표시되고, /dev/sde1이 활성 상태로 전환
  • 장애 디스크 제거 후
    • /dev/sde1이 /dev/sdc1을 대체하여 RAID-5 정상 작동