Tuesday, April 10, 2018

CentOS 6.6 리눅스 관리] 4.2 RAID - mdadm 명령을 이용한 RAID Linear 구성


안녕하세요. 썬구루입니다. 이 게시물에서는 CentOS 환경에서 mdadm 명령을 이용한 소프트웨어적인 RAID 구성에 대해 알아볼 것입니다. 대부분의 운영체제는 자체 볼륨 매니져 기능을 사용한 소프트웨어적인 RAID 구성을 지원합니다. 윈도우 운영체제는 Veritas Volume Manager를 솔라리스(Sun Solaris)는 SVM(Solaris Volume Manager) 또는 ZFS를 리눅스에서는 MD(Multi-Disk)와 LVM(Linux Volume Manager)을 등등..

과거에는 디스크 용량이 작았었습니다. 15년만 하더라도 서버에 36GB나 72GB 하드디스크를 여러 개 꼽으면 우와~ 거렸었죠. 18GB 이하의 디스크가 수두룩했으니까요. 참고적으로 전 9GB 디스크를 장착한 서버도 많이 봤었습니다.

가정을 해보도록 하죠.. 가정입니다. ^^ 만약 지금 현재 72GB 디스크가 물리적으로 최대 용량의 디스크라 한다면 그리고 36GB 하드디스크 보다 4배 정도 비싸고. 그리고 현재 서버에 데이터베이스 파일을 저장하기 위해 신규로 130GB의 단일 공간이 필요하다면 어떻게 해야 할까요? 72GB가 물리적 최대 용량이니 한 개 디스크로는 130GB 단일 공간을 만들 수 없죠. 또한 한 개의 디스크는 단일 디스크 장애에 대처를 할 수 없을 것이고요. 하드웨어 기술 발전적인 한계가 있으니 72GB 용량이 최대일 것이고 ....

그래서 물리적 용량 한계를 뛰어넘기 위해서 여러 개 물리적인 디스크를 조합하여 논리적인 디스크를 만들 수 있는 기술을 개발한 것이죠. 72GB 3개로 RAID 5 구성을 하면 대략 130~140GB 사용 공간(Usable Space)이 나옵니다. 단순 도입 비용 계산으로는 36GB 12개 값이죠.

그런데 36GB 5개로 RAID 5 구성을 하면 130~140GB 사용 공간이 나옵니다. 그러면 72GB 디스크로 구성하는 비용에 50%도 안되는 비용으로 130GB 정도의 단일 공간을 만들 수 있는 것이죠. RAID는 Redundant Array of Independent Disks의 약어이지만 Redundant Array of Inexpensive Disks의 약어이기도 합니다. 여러 개 값싼 디스크를 조합하여 물리적인 용량 한계를 뛰어넘고 디스크 단일 장애에 대비할 수 있으며 성능을 향상시킬 수 있는 것이죠.

지금이야 PC용 2TB 디스크가 10만 원도 하지 않죠. 불과 몇 년 전만 하더라도 디스크 스토리지 Usable 2TB가 2억 정도 했었습니다. 과거에는 엄청 더 비쌌었죠. 상대적으로 값이 싼 디스크 여러 개를 조합하는 RAID 기술 왜 나오게 된 것인지 아시겠죠?

물리적 용량 한계 극복, 성능 향상, 결함 허용(Fault Tolerance), 비용 ☜ 요것..!! 때문에 나왔다고 보시면 됩니다.

리눅스에서는 mdadm 명령을 사용하여 Software RAID 구성이 가능합니다. 저희가 CentOS를 설치했을 때 MD에 관련된 패키지가 같이 설치되었습니다. 그리고 CentOS를 부팅시키면 관련 모듈이 메모리에 자동으로 올라옵니다. mdadm의 md는 Multi-disk를 뜻하는데 이 mdadm 명령을 통해 RAID 0, 1, 5, 6를 구성해볼 것입니다.

■ MD 관련 커널 모듈 확인

[root@sunguru ~]# for y in `lsmod | grep dm | cut  -d " " -f 1`
> do
> echo $y
> modinfo $y | grep description
> echo
> done
dm_mirror
description:    device-mapper mirror target
dm_region_hash
description:    device-mapper region hash
dm_log
description:    device-mapper dirty region log
dm_mod
description:    device-mapper driver
[root@sunguru ~]# 

■ RAID 테스트를 위한 디스크 추가

현재 CentOS 가상머신에는 아래와 같이 가상 디스크가 추가되어 있다.

[root@sunguru ~]# lsblk | grep disk
sdb      8:16   0   20G  0 disk
sda      8:0    0   20G  0 disk
sdc      8:32   0    4T  0 disk
[root@sunguru ~]# 

RAID 구성 테스트를 위해 10GB 가상 디스크 6개를 추가하고 아래와 같은 명령을 사용하여 추가한 디스크를 인식시킨다.


[root@sunguru ~]# lspci | grep -i scsi
00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
[root@sunguru ~]#
[root@sunguru ~]# find /sys/devices -name scan
/sys/devices/pci0000:00/0000:00:07.1/host1/scsi_host/host1/scan
/sys/devices/pci0000:00/0000:00:07.1/host2/scsi_host/host2/scan
/sys/devices/pci0000:00/0000:00:10.0/host0/scsi_host/host0/scan
[root@sunguru ~]#
[root@sunguru ~]# echo "- - -" > /sys/devices/pci0000:00/0000:00:10.0/host0/scsi_host/host0/scan
[root@sunguru ~]# lsblk | grep 10G
sdd      8:48   0   10G  0 disk
sde      8:64   0   10G  0 disk
sdf      8:80   0   10G  0 disk
sdh      8:112  0   10G  0 disk
sdi      8:128  0   10G  0 disk
sdg      8:96   0   10G  0 disk
[root@sunguru ~]# 

여기서 잠깐!! 디스크 6개를 추가한 후 가상머신을 정상 종료한 다음 VMware Workstation의 스냅샷(Snapshot) 기능을 통해 시점 저장을 해두도록 하자. 이것을 이용하면 Revert 기능을 사용하여 시점 복원이 가능하다. 이런 RAID 작업에는 스냅샷(Snapshot) 기능 활용이 시간 절약하는데 엄청난 도움이 된다.

■ RAID I/O 컨트롤러 노드 번호

VMware Workstation의 가상머신에는 The LSI Logic LSI53C10xx Ultra320 SCSI I/O 컨트롤러가 사용된다. 원래 이것은 하드웨어 RAID 컨트롤러이지만 VMware Workstation에서는 JBOD (Just a Bunch of Disks) 타입으로 동작한다. 그리고 디스크에 노드(Node) 번호가 사용되는데 이것은 '컨트롤러 번호:타겟 번호'를 나타낸다.

예를 들어 첫 번째 I/O 컨트롤러의 첫 번째 디바이스는 0:0 이다. VMware Workstation 환경에서 하나의 SCSI I/O 컨트롤러에는 15개의 SCSI 디바이스가 부착될 수 있다. 그리고 하나의 가상머신에는 최대 4개까지 SCSI 컨트롤러를 추가할 수 있다. 타겟(Target) 번호는 0부터 15까지 사용할 수 있으며 7은 컨트롤러 자체에 할당되어 있다. 즉 컨트롤러를 나타낸다.

VMware Workstation에서는 디스크가 추가될 때 자동으로 노트 번호가 부여된다. 하지만 특별한 테스트를 할 경우 이것을 수동으로 변경해야 할 경우도 있다.


■ mdadm 명령

리눅스 소프트웨어 RAID인 MD 디바이스들을 관리하기 위해 사용되는 명령이다. 이 명령을 사용하여 Linear( RAID 0 Concatenation 과 동일), RAID 0 (RAID 0 Stripe), RAID 1, 4, 5, 6, 10를 구성할 수 있다.

1). 명령 형식

mdadm [mode] <RAID DEVICE> [옵션] <component-deivces>

2). raiddevice

RAID 디바이스 파일을 나타낸다. 파일 이름 규칙은 아래와 같다.

/dev/mdNN [ 커널 2.4 이전에 사용하는 이름 규칙. 2.6.29 이상에서도 사용 가능함 ]
/dev/md_XXX [ 커널 2.6.29부터 사용할 수 있는 이름 규칙 ]

MD 디바이스 이름을 나타낸다. NN은 번호이고 0부터 시작한다. XXX는 문자열을 나타낸다.

3). 옵션

옵 션
내 용
--query DEVICE
 디바이스에 대한 간단한 정보를 확인하기 위해 사용한다.
--detail RAID_DEVICE
 RAID 디바이스에 대한 상세 정보를 확인하기 위해 사용한다.
--create
 RAID 디바이스를 만들기 위해 사용한다.
--level=LEVEL
 RAID 레벨을 설정하기 위해 사용한다. LEVEL 종류는 아래와 같다. 여기서는 RAID 0, 1, 5, 6에 대해서만 알아볼 것이다.

  linear : RAID 0 Concatenation과 동일하다.
  stripe : RAID 0 Stripe를 나타낸다.
  mirror : RAID 1 을 나타낸다.
  5 : RAID 5를 나타낸다.
  6 : RAID 6를 나타낸다.
--raid-devices=N
 RAID 디바이스 구성요소 개수를 설정한다. N은 숫자이다.
--fail COMPONENT
 동작중인 RAID 디바이스의 구성요소를 교체 전 Faulty 로 마크처리하기 위해 사용한다.
--remove CMPT or RAID DEV
 RAID 디바이스를 구성하는 구성요소를 제거하거나 RAID 디바이스를 제거하기 위해 사용한다.
--add COMPONENT
 RAID 디바이스에 구성요소를 추가하기 위해 사용한다.
--grow
 RAID 디바이스의 사이즈를 변경하기 위해 사용한다. 
--stop
 비활성화 상태로 전환하기 위해 사용한다. 
--run
 활성화  상태로 전환하기 위해 사용한다.
--remove DEVICE
 명시한 디바이스를 제거하기 위해 사용한다.
--spare-devices=N DEV
 RAID 디바이스의 Hot Spare 개수와 디바이스를 설정하기 위해 사용한다.
--detail --scan RAID DEV
 RAID 구성정보를 보거나 파일로 저장하기 위해 사용한다.
--version
 mdadm 버전을 출력한다. 
--zero-superblock
 디바이스에 MD 슈퍼블록이 포함되어있다면 이를 0(Zero)로 덮어쓰기 위해 사용한다. 




■ RAID Linear 구성


이것은 RAID 0 Concatenation 과 동일한다. 명령 형식은 다음과 같다.

mdadm --create RAID DEVICE --level=linear --raid-devices=N COMPONENT_DEVICE...




1). 예제

[root@sunguru ~]# mdadm --version
mdadm - v3.3 - 3rd September 2013
[root@sunguru ~]#
[root@sunguru ~]# mdadm --query
mdadm: No devices given.
[root@sunguru ~]#
[root@sunguru ~]# cat /proc/mdstat
Personalities : [linear] [raid6] [raid5] [raid4]
unused devices: <none>
[root@sunguru ~]#
[root@sunguru ~]# mdadm --create /dev/md0 --level=linear --raid-devices=2 /dev/sdd /dev/sde
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
[root@sunguru ~]#
[root@sunguru ~]# mdadm --query /dev/md0
/dev/md0: 19.98GiB linear 2 devices, 0 spares. Use mdadm --detail for more detail.
[root@sunguru ~]#
[root@sunguru ~]# mdadm --query /dev/sdd
/dev/sdd: is not an md array
/dev/sdd: device 0 in 2 device active linear /dev/md0.  Use mdadm --examine for more detail.
[root@sunguru ~]#
[root@sunguru ~]# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Mon Jul  4 12:43:09 2016
     Raid Level : linear
     Array Size : 20955136 (19.98 GiB 21.46 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Mon Jul  4 12:43:09 2016
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

       Rounding : 0K

           Name : centos01:0  (local to host centos01)
           UUID : a981e73e:bedeac1d:4064577f:b951bfb3
         Events : 0

    Number   Major   Minor   RaidDevice State
       0       8       48        0      active sync   /dev/sdd
       1       8       64        1      active sync   /dev/sde
[root@sunguru ~]#
[root@sunguru ~]# mdadm --detail --scan /dev/md0
ARRAY /dev/md0 metadata=1.2 name=centos01:0 UUID=a981e73e:bedeac1d:4064577f:b951bfb3
[root@sunguru ~]#
[root@sunguru ~]# cat /proc/mdstat
Personalities : [linear] [raid6] [raid5] [raid4]
md0 : active linear sde[1] sdd[0]
      20955136 blocks super 1.2 0k rounding

unused devices: <none>
[root@sunguru ~]#
[root@sunguru ~]# mkfs -t ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5238784 blocks
261939 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
 4096000
Writing inode tables: done                   
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@sunguru ~]#
[root@sunguru ~]# lsblk /dev/md0
NAME MAJ:MIN RM SIZE RO TYPE   MOUNTPOINT
md0    9:0    0  20G  0 linear
[root@sunguru ~]#
[root@sunguru ~]# blkid /dev/md0
/dev/md0: UUID="f0dd8d21-da74-4eb1-bec0-c9d484f27064" TYPE="ext4"
[root@sunguru ~]#
[root@sunguru ~]# mkdir /datafile01 /datafile02
[root@sunguru ~]# mount /dev/md0 /datafile01
[root@sunguru ~]# df -h /datafile01
Filesystem      Size  Used Avail Use% Mounted on
/dev/md0         20G   44M   19G   1% /datafile01
[root@sunguru ~]#
[root@sunguru ~]# cd /datafile01
[root@sunguru datafile01]# touch file1 file2 file3
[root@sunguru datafile01]# ls -l
합계 16
-rw-r--r--. 1 root root     0 2016-07-04 12:58 file1
-rw-r--r--. 1 root root     0 2016-07-04 12:58 file2
-rw-r--r--. 1 root root     0 2016-07-04 12:58 file3
drwx------. 2 root root 16384 2016-07-04 12:45 lost+found
[root@sunguru datafile01]# 

■ RAID Linear 용량 추가 ( 디바이스 추가 )

/dev/md0 디바이스에 용량을 추가하기 위해 아래와 같이 명령을 사용할 수 있다. RAID 디바이스 용량은 늘어나더라도 관련 디바이스에 대한 파일시스템 용량은 자동으로 늘어나지 않는다. resize2fs라는 명령을 사용하여 마운트된 파일시스템을 온라인 시 용량을 변경할 수 있다.

[root@sunguru datafile01]# mdadm  --verbose --detail --scan /dev/md0
ARRAY /dev/md0 level=linear num-devices=2 metadata=1.2 name=centos01:0 UUID=a981e73e:bedeac1d:4064577f:b951bfb3
   devices=/dev/sdd,/dev/sde
[root@sunguru datafile01]#
[root@sunguru datafile01]# mdadm /dev/md0 --grow --add /dev/sdf
[root@sunguru datafile01]#
[root@sunguru datafile01]# mdadm  --verbose --detail --scan /dev/md0
ARRAY /dev/md0 level=linear num-devices=3 metadata=1.2 name=centos01:0 UUID=a981e73e:bedeac1d:4064577f:b951bfb3
   devices=/dev/sdd,/dev/sde,/dev/sdf
[root@sunguru datafile01]#
[root@sunguru sbin]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        16G  2.7G   12G  19% /
tmpfs           936M  224K  936M   1% /dev/shm
/dev/sda1       190M   32M  149M  18% /boot
/dev/sdc2       2.2T   73M  2.0T   1% /data02
/dev/md0         20G   44M   19G   1% /datafile01
[root@sunguru sbin]#
[root@sunguru sbin]# resize2fs /dev/md0
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/md0 is mounted on /datafile01; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 2
Performing an on-line resize of /dev/md0 to 7858176 (4k) blocks.
The filesystem on /dev/md0 is now 7858176 blocks long.
[root@sunguru sbin]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        16G  2.7G   12G  19% /
tmpfs           936M  224K  936M   1% /dev/shm
/dev/sda1       190M   32M  149M  18% /boot
/dev/sdc2       2.2T   73M  2.0T   1% /data02
/dev/md0         30G   44M   28G   1% /datafile01
[root@sunguru sbin]# 

■ 새로 생성한 RAID 디바이스 정보 저장하기

새로운 RAID 디바이스를 생성한 후 관련된 정보를 반드시!! /etc/mdadm.conf 파일에 추가해야 한다. 만약 저장하지 않고 리부팅을 한다면 분명 /dev/md0으로 만들었는데 리부팅 후 /dev/md127로 나타나는 것을 확인할 수 있을 것이다. 이건 좀 불편하네... 새로 생생한 RAID 디바이스 정보를 저장하기 위해 아래와 같은 명령을 실행한다. 그리고 리부팅 후에도 정상적으로 RAID 디바이스가 동작하는지 확인해본다.

# mdadm --detail --brief /dev/md0 >> /etc/mdadm.conf
# reboot
# mdadm --detail --scan
# mdadm --detail /dev/md0

다음 게시물에선 RAID 0 Stripe 구성하는 방법에 대해 알아보도록 하겠습니다.





No comments:

Post a Comment