Linux

Linux #11

broom7946 2023. 2. 3. 17:10

RAID(Redundant Array of Independent(or Inexpensive) Disks) 디스크 구축하기

  RAID를 사용하는 목적은 적어도 두 개 이상의 디스크를 RAID로 묶어서 데이터를 저장한 뒤 어느 한 디스크가 고장나더라도 저장된 데이터가 그대로 존속되게 하는 기법이다. 서버를 구축하고 모든 중요한 데이터를 하드디스크에 저장했다고 해보자. 만일 하드디스크 하나를 사용하고 있는데 그 디스크가 고장 나면 운영에 필요한 시스템 파일뿐만 아니라 중요한 모든 데이터를 잃고 말게 될 것이다.

  이런 경우 간단히 하드디스크 두 개를 사용해서 RAID1(mirrored)으로 시스템을 구축해 두면 CentOS RAID로 미러드된 두 개의 디스크에 똑같이 데이터가 저장되게 해서, 두 개의 하드디스크는 정확히 서로를 미러링하고 있기 때문에 하나의 디스크가 고장 나더라도 복제된(cloned) 다른 디스크가 있으므로 시스템 파일뿐만 아니라 중요한 데이터도 그대로 존속되어서 서비스 제공에 문제가 없게 된다. 나중에 손상된 디스크를 교체하면 다시 미러드된 시스템이 된다. 그리고 RAID를 사용하면 시스템의 성능도 대폭 향상시킬 수 있다.

  하지만 RAID로 시스템을 구축했다고해서 시스템을 완전히 믿을 수는 없다. 이 경우 두 개의 디스크는 하나의 디스크 컨트롤러(arm)에 연결되어 있으므로 두 개의 디스크가 동시에 고장 나거나 하나밖에 없는 컨트롤러가 고장 나면 두 디스크 모두 사용할 수 없게 된다. 물론 동일한 전원 공급기에 두 디스크가 끼워져 있을 때 전원이 나가도 두 디스크 모두 못 쓰게 된다.

 

  RAID 디스크 구축을 백업용으로 생각하면 안 된다. 백업은 일정한 수준에서 지속적으로 진행되어져야 하므로 하드웨어 오류에 대한 일시적인 데이터 보호책인 RAID와 다르다. 백업은 완전히 재난 수준의 하드웨어 오류에 대한 데이터 보호책이다.

 

  RAID 타입과 레벨

  일반적으로 RAID는 하드웨어 RAID와 소프트웨어 RAID(그리고 faked RAID)로 두()가지 타입이 있다. 하드웨어 RAID는 물론 가장 좋은 해결책인데 전용 하드웨어가 RAID 디스크들을 관리하므로 CentOS RAID 컨트롤러가 생성한 논리적인 디스크만 보게 되고 RAID에 관한 구성을 알지 못하므로 RAID에 관해서 아무 것도 설정해줄 것이 없어서 운용이 편리하다. 하지만 하드웨어 RAID는 비싸고 보통 프로프리에터리(proprietary:벤더 종속적)한 포맷이어서, 예를 들어 HP RAID 컨트롤러가 고장 나면 반드시 동일한 HP RAID 컨트롤러 제품만 구입해야 하는 벤더 종속적인 단점이 있다. 반면에 소프트웨어 RAID는 하드웨어 RAID보다는 기능이 조금 떨어지지만 현재 널리 사용되고 있다. 대부분 RAID에 참여하는 하드디스크는 주로 같은 브랜드에 같은 용량을 가진 디스크들이지만 최근에는 서로 다른 용량의 하드디스크를 모아서 RAID를 만드는 Linear RAID도 있고,

  CentOS RAID 어레이를 설정하고 관리할 때 mdadm과 같은 일련의 명령어를 사용한다. 소프트웨어 RIAD는 예를 들어서 RAID1 미러링인 경우 운영체제가 같은 데이터를 두 디스크에 각각 따로 보내야 하기 때문에 성능상 하드웨어 RAID만큼 빠르지 못하다. 그렇지만 소프트웨어 RAID는 어느 블록장치라도 RAID로 구성할 수 있어서 두 개의 HDD나 두 개의 USB는 물론 HDD USB RAID로 묶어서 SAN(Storage Area Network)으로 구성할 수도 있다. 그리고 RAID 기술은 대부분 Linux 배포판에 필수적으로 들어있어서 벤더 종속적이지 않기 때문에 일부 기술자들은 오히려 소프트웨어 RAID를 더 선호하기도 한다. 반면 속도와 성능이 중시되는 데이터베이스를 RAID로 구축한다면 소프트웨어 RIAD로는 곤란할 수 있다.

 

  CentOS는 시스템이 부팅될 때 /etc/mdadm.conf 파일에서 모든 가용한 RAID를 찾아서 어레이를 구성한다. 두 개의 패리티 비트로 구성해서 두 개의 디스크에 문제가 생겨도 데이터 복원이 가능한 디스크 4개의 RAID6, 속도가 빠른 RAID0과 데이터 복원이 되는 RAID1을 합쳐서 RAID10([ten]이 아니라 [one zero]로 발음)을 만들기도 한다. Faked(가짜) RAID라는 것도 있는데 기본적으로는 RAID에 속하지만 실제로 구축하는 대신 운영체제가 그런 역할을 대신하는 경우이다. 이 가짜 RAID는 거의 사용되지 않으며 대부분 Linux 배포판도 이 기능을 제공하지 않는다.

 

  RAID 레벨에는 몇 가지가 있지만 주로 다음 세 가지를 사용한다.

RAID 0 : 데이터 복원은 되지 않지만 암(arm:컨트롤러)이 두 개여서 읽기/쓰기 속도가 빠름 =>stripe without parity, Arm 2

RAID 1 : 데이터 복원이 되며 두 개의 디스크가 필요한 중소 조직용 =>mirroring

           하나의 HDD가 망가져도 데이터 복원이 가능하다.

RAID 5 : 데이터 복원이 되며 세 개 이상의 디스크가 필요한 대형 조직용이다.

           =>stripe with parity, 8bit 내의 홀수 개수를 보고 패리티비트가 0또는 1로 지정한다. 만일 도중에 오류로 인해서 변경되면 패리티비트가 맞지 않으므로 재전송을 요청하게 된다. 1G 3개로 구성하면 실제 데이터는 2G이다. 하나의 HDD가 오류여도 데이터 복원이 가능하다.

RAID 10 : RAID 1(미러링) RAID 0(stripe without parity)을 합친 구성이다. =>mirroring without parity

RAID3,

RAID6 : HDD 4개로 구성하는데 parity 디스크가 2곳에 쓰이므로 1G 4개로 RAID 6을 구성했다면 실제 데이터는 2G가 된다. 하지만 두 개의 HDD가 망가져도 데이터 복원이 된다.

 

  LVM(Logical Volume Management)으로 디스크 관리하기

  예를 들어서 사용자들의 디폴트 작업공간인 /home 디렉터리가 현재는 소수의 사용자들만 이용하고 있기 때문에 하나의 파티션으로 충분하지만 사용자가 늘어나면 /home 디렉터리를 확장할 수 있는 방법은 없다. 그렇다고 /home 디렉터리를 다른 파티션 /tmp/home식으로 분할해서 사용자들에게 할당하면 관리하기도 힘들고 일관적인 작업수행도 힘들 수 있다. 이럴 때 운영체제를 다시 설치하거나 별도의 작업 없이 /home 파티션의 용량을 크게 확장시켜주는 기법이 바로 VLM이다.

  LVM 기법은 즉석에서 파티션 사이즈를 늘리거나 디스크를 추가/삭제할 수 있는 기법으로 전통적인 디스크 관리의 큰 장벽을 없앴다. CentOS를 설치하면 디폴트로 LVM을 사용하는데 작은 용량의 /boot 부트 파티션 영역만 놔두고 나머지 / 영역을 모두 LVM으로 할당해서 CentOS가 관리하게 함으로써 나중에 메인 HDD / 공간이 작아졌을 때 HDD를 추가해서 /를 얼마든지 확장하게 배려하고 있다.

 

  LVM은 파티션된 디스크들의 물리적 여분 공간을 모두 모으거나 새로 디스크를 추가해서 하나의 논리 공간으로 확장시켜줄 수 있다.

  LVM은 다음 두 가지 기능이 있다.

하나의 디스크에 1.5GB이 남아있고, 또 하나의 디스크에 0.5GB가 남아있을 때 LVM으로 이 남은 공간들을 묶어서 마치 하나의 디스크처럼 2GB의 공간으로 만들 수 있고,

기존의 2GB 디스크에 새로 1GB 디스크를 추가해서 LVM으로 묶으면 별도의 파티션과 같은 작업 없이 바로 3GB의 공간으로 만들 수 있다. 이 두 가지는 결국 같은 메카니즘이다.

  예를 들어서 2GB의 한 디스크를 1.5GB 0.5GB 두 개의 파티션으로 나누어서 C:, D: 드라이브를 할당해서 각각 하나의 디스크로 만들면 0.5GB D: 드라이브에는 0.5GB 이상의 데이터를 저장할 수 없다. 하지만 운영체제의 파일시스템이 파티션마다 각각 따로 존재할 수 없기 때문에 CentOS는 여전히 이들을 하나의 블록공간으로 여겨서 C:, D: 각 공간을 하나의 연속적인 블록 덩어리로 인식하므로 데이터를 저장할 수 있는 공간은 여전히 2GB로 인식하는 것이다. 이런 특성을 이용한 것이 LVM이다. 

  HDD, USB, DVD 등 블록장치는 파일시스템이 있어야 데이터를 저장할 수 있다. 디스크 하나 전체를 하나의 블록으로 파티션해서 포맷할 수도 있지만 대부분은 관리하기 쉽고, 어느 한 파티션에 문제가 있어도 전체 블록에는 영향을 미치지 않도록 여러 블록으로 나누어서(파티션해서) 사용한다.

 

RAID에서는 주로 같은 HDD 브랜드의 같은 용량의 디스크들을 묶어서 구성하지만,

LVM에서는 다른 브랜드와 다른 용량의 HDD들을 묶어서 새로운 볼륨으로 만들 수 있다. HDD 브랜드가 달라도 되고, USB HDD식으로 각각 저장매체가 달라도 구성된다.

 

  볼륨 그룹

  LVM에서 가장 중요한 개념은 볼륨그룹이다. 볼륨그룹(Volume Groups:VGs)은 물리적 볼륨(Physical Volumes:PVs)과 논리적 볼륨(Logical Volumes:LVs)을 합쳐서 부르는 말인데 운영체제는 이 VGs를 통해서 디스크들을 관리한다. 시스템에서 여러 개의 디스크 타입을 사용할 예정이라면 볼륨그룹도 여러 개 만들어 두어야 한다. 예를 들어서 CentOS에 로컬 디스크만 연결된다면 파일시스템 인식에 별 문제가 없지만 SAN(Storage Area Network)이 연결된다면 CentOS는 이 SAN이 가지고 있는 디스크 타입도 인식해야 할 필요가 있기 때문이다. 이럴 때 관리자는 LVM VGs를 사용해서 로컬 디스크는 local VG를 만들어서 모든 로컬 파티션을 그룹화해두고, SAN san VG를 만들어서 모든 SAN의 파티션을 그룹화해두면 관리하기도 편하고 서로 다른 포맷을 가지고 있으므로 충돌도 생기지 않아서 디스크 관리의 유연성이 배가된다. 사용자들도 sales marketing식으로 그룹화해서 사용하는 VG 디스크를 따로 지정할 수도 있다.

 

  물리적 볼륨(PVs), 볼륨그룹(VG), 그리고 논리적 볼륨(LV) 생성하기

  PVs는 데이터를 저장하는 실제적인 블록장치로써 대부분 하드디스크일 것이다. SCSI, SATA, 그리고 USB 등을 LVM으로 묶어서 하나의 저장 공간으로 만든 뒤 시스템에서 일반 하드디스크처럼 사용하면 된다.

  LVM으로 디스크들을 묶으려면 먼저 PVs를 생성해야 한다.

  VLM 생성 순서는 PVs(물리적 볼륨) 생성 => VGs(볼륨 그룹)를 생성 => 최종적으로 LVs(논리적 볼륨)로 만들어서 사용한다.

 

  ZFS File System 특징

- 2001년에 UNIX Open Solaris, 2008년에 FreeBSD Linux에 설정

- ZFS 파일 시스템은 파일 시스템 관리를 근본적으로 변화와 혁신시킨 새로운 파일 시스템이다. 다른 파일 시스템에서는 찾아볼 수 없는 막강한 특징을 가지고 있다.

- ZFS 파일시스템은 강력하고 확장성이 뛰어나며 관리가 편리하도록 디자인되어 있다.

- SPARC 또는 Intel 시스템 모두 사용 가능

- UNIX Solaris 10 OS 06/06 릴리즈 이상부터 채용됨

- 최소 물리적 디스크 크기는 128MB 필요

- 권장 메모리는 최소 768MB, 성능상 1G 메모리 이상 필요

- 미러 방식을 구현한다면 다중 컨트롤러(RAID0) 권장

- 기본적으로 ZFS 파일시스템을 만들면 EFI Label을 사용하게 된다.

- HDD 저장 풀(Pool) 가능, Copy-on-Write 기능, Snapshot 기능, 데이터 무결성과 자동 수정 기능, RAID5와 유사한 RAID-Z 구성 가능, 16EB까지 설정 가능, 256개의 Quardrillion Zettabytes 저장 가능하다는 특징이 있다.

 

=>RAID-Z에는 다음의 종류가 있다.

RAID-Z1(2HDD:data+1HDD:parity <=3HDD),

RAID-Z2(2HDD:data+2HDD:parity <=4HDD),

RAID-Z3(2HDD:data+3HDD:parity <=5HDD)가 필요하다.

=>Copy-on-Write는 일반 파일 시스템에서는 데이터가 겹쳐 쓰이면 이전 데이터는 삭제되는데 ZFS에서는 새로운 데이터를 다른 블록에 써서 일단 쓰기가 끝나면 파일 시스템의 메타데이터가 업데이트되어 새로운 데이터를 가리키게 되어서 시스템 크래시에 기존 데이터가 자동으로 보존되게 한다(Linux journaling 기능). 따라서 시스템 크래시에도 물리적으로 체크해주는 fsck 도구를 사용할 필요가 없다.

 

  파일 압축과 풀기

  Linux 시스템은 일반적인 Windows 시스템과 파일과 포맷이 다르므로 CentOS 사용자는 Linux 시스템에서의 파일을 압축하거나 압축된 파일을 풀 수 있어야 한다. 여기에 사용되는 도구는 tar, rpm, yum, apt-get, zip, bunzip 등 여러 가지가 있는데 주로 시스템이나 사용자의 데이터를 백업하거나 벤더의 소스 프로그램이나 커널 배포 패키지를 다운받아서 풀고 시스템에서 실행할 때 사용된다.

  먼저 파일을 압축하고 푸는 tar 계열의 명령어부터 알아보자.

 

  tar로 묶기/압축

  예를 들어 /var 밑의 여러 파일/디렉터리들을 test라는 이름으로 묶으려면 파일/디렉터리를 묶어주는 c, 진행 상황을 화면에 출력하는 v, 파일을 지정하는 f를 옵션으로 주면 된다. 특히 조심할 것은 일반적인 cp, mv 등과 달리 파일 등을 묶을 때에는 'tar 옵션 생성될_파일명 대상_파일/디렉터리' 형식인데 생성될 결과 파일_명이 먼저 오는 것에 주의해야 한다. cp a b a b로 복사, mv A B A B로 이동/이름변경,

     tar cvf B.tar a b c D a, b, c, D를 모두 묶어서 B.tar로 만듦

     tar cvfz/j B.tar.gz/B.tar.bz2 a b c D 하면 모두 묶어서 압축해서

             B.tar.gz/B.tar.bz2로 보인다. 둘 다 압축인데 압축율이 다르다.

  tar로 묶인 것/압축 풀기

  이럴 때에는 tar xvfz/j B.tar.gz/B.tar.bz2 -C 압축이_풀릴_곳 해주면 된다.

** abc.tar.xz xz abc.tar 해서 압축한 파일이다.

   unxz abc.tar.xz 하면 풀린다.

   tar cvfJ test.tar.xz /home/centos/* 하면 /home/centos/ 아래의 모든 파일/디렉터리가 test.tar.xz로 묶이고 압축된다.

풀 때에는

tar xvfJ test.tar.xz 한다.

기존 abc.tar 파일에 qwe.lst 파일을 추가해서 묶는다면

tar rvf abc.tar qwe.lst 하면 되고

tar로 묶인 파일들을 본다면

tar tvf abc.tar 하면 된다.

tar 파일을 삭제한다면

rm -rf abc.tar 식으로 일반파일 삭제하듯이 해주면 된다.

 

  gzip은 파일을 압축할 때 사용된다.

gzip /etc/passwd =>passwd.gz 가 된다.

gzip -d /etc/passwd.gz 하면 풀린다.

 

  bzip2도 파일을 압축할 때 사용된다.

bzip2 /etc/passwd =>passwd.bz2

bzip2 -d /etc/passwd.bz2 하면 풀린다.

 

  compress도 압축할 때 사용된다.

compress /etc/passwd =>passwd.Z

compress -d /etc/passwd.Z 하면 풀린다.

 

  정리하면

  압축 =>생성된파일.확장자’ =>압축과 묶인 것을 푸는 것을 정리하면

gzip files => ~.gz => gunzip ~.gz

bzip2 files => ~.bz2 => bunzip2 ~.bz2

tar cvf files => ~.tar => tar xvf ~.tar

tar cvfz files=> ~.tar.gz => tar xvfz ~.tar.gz(=~.tgz)

tar cvfj files => ~.tar.bz2 => tar xvfj ~.tar.bz2

tar cvfJ files => ~.tar.xz => tar xvfJ ~.tar.xz

compress files => ~.Z => uncompress ~.Z 하면 압축되고 풀린다.

zip files => ~.zip => unzip ~.zip 하면 풀린다.