[소개] LVM(Logical Volume Manager) – 개념

  • Post category:AWS / Compute
  • Post author:

이번에는 EC2 의 EBS 저장 장치를 효율적으로 사용하기 위한 LVM에 대하여 알아보겠습니다.

먼저 LVM 을 한줄로 설명하자면,

” Logical Volume을 효율적이고 유연하게 관리하기 위한 커널의 한 부분이자 프로그램” 이라고 할 수 있습니다.

기존방식이 파일시스템을 블록 장치에 직접 접근해서 읽고 쓰기를 했다면, LVM은 파일시스템이 LVM이 만든 가상의 블록 장치에 읽고 쓰기를 하게 됩니다.

이처럼 LVM은 물리적 스토리지 이상의 추상적 레이어를 생성해서 논리적 스토리지(가상의 블록 장치)를 생성할 수 있게 해줍니다. 직접 물리 스토리지를 사용하는 것보다 다양한 측면에서 유연성을 제공하는데, 유연한 용량 조절, 크기 조정이 가능한 스토리지 풀(Pool), 편의에 따른 장치 이름 지정, 디스크 스트라이핑, 미러 볼륨 등을 제공합니다.

LVM의 주요 5가지 용어를 먼저 알아보겠습니다.

  • PV(Physical Volume)
  • PE(Physical Extent)
  • VG(Volume Group)
  • LV(Logical Volume)
  • LE(Logical Extent)

1. PV(Physical Volume)

LVM에서 블록 장치(블록 단위로 접근하는 스토리지. 하드 디스크를 예로 들 수 있습니다.)를 사용하려면 우선 PV로 초기화를 해야합니다.
즉, 블록 장치 전체 또는 그 블록 장치를 이루고 있는 파티션들을 LVM에서 사용할 수 있게 변환하는 것입니다. 예를 들어 /dev/sda1, /dev/sda2 등의 블록 스토리지를 LVM으로 쓰기위해 PV로 초기화하게 됩니다. PV는 일정한 크기의 PE(Physical Extent)들로 구성이 됩니다.

2. PE(Physical Extent)

PV를 구성하는 일정한 크기의 블록으로 LVM2에서의 기본크기는 4MB입니다. LVM은 LVM1과 LVM2이 있는데 여기서는 다루지 않습니다. 간단히 LVM2가 기능이 개선된 버전이라고 이해하시면 됩니다.

곧 설명할 LV(Logical Volume)의 LE(Logical Extent)들과 1:1로 대응됩니다. 그렇기에 항상 PE와 LE의 크기는 동일합니다.
즉, 아래 그림과 같은 모습입니다. 블록 장치(물리적 디스크)의 파티션들을 PV들로 초기화 시킨모습이며, 각각의 PV들은 동일한 크기의 PE들로 구성이됩니다.

3. VG(Volume Group)

PV들의 집합으로 LV를 할당할 수 있는 공간입니다.
즉, PV들로 초기화된 장치들은 VG로 통합되게 됩니다.
사용자는 VG안에서 원하는대로 공간을 쪼개서 LV로 만들 수 있습니다.
아래 그림과 같이 위에서 만든 PV들을 하나의 VG1로 그룹지었습니다.

4. LV(Logical Volume)

사용자가 최종적으로 다루게 되는 논리적인 스토리지입니다. 생성된 LV는 파일 시스템 및 애플리케이션(Database 등)으로 사용됩니다. 위에서도 언급했듯이, LV를 구성하는 LE들은 PV의 PE들과 맵핑하며 존재하게 됩니다.

LE와 PE가 맵핑되면서 총 3가지 유형의 LV가 생성됩니다. 

  • 선형(Linear) LV
    하나의 LV로 PV를 모으는 방법입니다. 예를들어 두개의 60GB 디스크(PV를 의미합니다.)를 가지고 120GB의 LV를 만드는 방식입니다. LV만을 사용하는 사용자의 입장에서는 120GB의 단일 장치만 있게 되는 셈입니다. (물론 LV를 여러개로 나누는 것도 가능합니다.)
  • 스트라이프(Striped)된 LV
    LV에 데이터를 기록하게되면, 파일 시스템은 PV에 데이터를 기록하게되는데(PE와 LE의 매핑대로), 스트라이프된 LV을 생성해서 데이터가 PV에 기록되는 방식을 바꿀수 있습니다.
    대량의 순차적 읽기/쓰기 작업의 경우에 효율을 높일 수 있는 방법입니다.
    Striped LV는 Round-Robin 방식으로 미리 지정된 PV들에 데이터를 분산 기록해서 성능을 높였고, 읽고/쓰기를 병렬로 실행할 수 있습니다.
    아래 그림은 LV에 데이터를 기록할 때, 각각의 PV에 번갈아가며 기록하는 Striped LV를 잘 보여줍니다.
    번갈아가는 기준은 데이터의 크기인데 이를 스트라이프 크기라고하며 Extent의 크기(PE/LE크기)를 초과할수 없습니다.
  • 미러(Mirrored)된 LV
    이름 그대로 블록 장치에 저장된 데이터의 복사본을 다른 블록 장치에 저장하는 방식입니다. 데이터가 하나의 PV에 저장될때, 이를 미러하고있는 PV에 동일한 데이터가 저장됩니다.
    이를 통해 장치에 장애가 발생하게 될경우 데이터를 보호할 수 있게됩니다. 하나의 장치에 장애가 발생하게 되면, 선형(Linear)으로 저장되어있기에 다른 장치에서 쉽게 접근이 가능해지고, 어떤 부분이 미러를 써서 동기화되었는지에 대한 로그를 디스크에 저장하게 됩니다.

5. LE(Logical Extent)

LV를 구성하는 일정한 크기의 블록으로 기본크기는 PE와 마찬가지로 4MB입니다. 아래 그림은 위에서 만든 VG1에서 사용자가 원하는 크기대로 분할해서 LV1과 LV2를 만든 모습입니다. 꼭 VG의 모든 공간을 다 써야되는건 아닙니다. 각각의 LV들은 동일한 크기의 LE로 구성이되며 PE들과 1:1로 맵핑됩니다.

이제 용어를 익혔으니 LVM 에 대해 다시 설명해 보겠습니다.

Logical volume management는 디스크나 대용량 스토리지 장치를 유연하고 확장이 가능하게 다룰 수 있는 기술이며 이를 커널에 구현한 기능을 바로 LVM(Logical Volume Manager) 라고 부릅니다. 

전통적으로 저장 장치를 사용했던 방식은 물리 디스크를 파티션이라는 단위로 나누어서 이를 OS에 마운트하여 사용했는데, 마운트를 하려면 파티션을 특정 디렉토리와 일치시켜 주어야 했습니다.

만약 특정 파티션(/home 이라 가정합니다.)에 마운트된 파티션이 용량이 일정 수준 이상 찼을 경우 다음과 같이 번거로운 작업을 수행해야 했습니다.

  • 추가 디스크를 장착
  • 추가된 디스크에 파티션 생성 및 포맷
  • 새로운 마운트 포인트(/home2) 를 만들고 추가한 파티션을 마운트
  • 기존 home 데이타를 home2 에 복사 또는 이동
  • 기존 home 파티션을 언마운트(umount)
  • home2 를 home 으로 마운트

LVM 은 이름처럼 파티션대신 볼륨이라는 단위로 저장 장치를 다룰 수 있으며, 물리 디스크를 볼륨 그룹으로 묶고 이것을 논리 볼륨으로 분할하여 관리합니다. 스토리지의 확장이나 변경시 서비스의 변경을 할 수 있으며 특정 영역의 사용량이 많아져서 저장 공간이 부족할 경우에 유연하게 대응할 수 있습니다. 아래의 그림을 보겠습니다.

LVM의 구성 예입니다.

이제 /home 영역이 거의 찼을 경우 LVM이 적용되어 있으면 다음과 같이 처리할 수 있습니다.

  • 추가 디스크를 장착
  • 추가된 디스크에 파티션을 만들어서 물리 볼륨(PV) 생성
  • 물리 볼륨을 볼륨 그룹(VG)에 추가. 여기서는 vg_data 볼륨 그룹으로 추가합니다.
  • /home 이 사용하는 논리 볼륨인 lv_home의 볼륨 사이즈를 증가

위와 같이 변경 작업을 기존 데이터의 삭제나 이동 없이 서비스가 구동중인 상태에서 유연하게 볼륨을 늘리고 줄일 수 있습니다.

PS. AWS 콘솔에서는 /dev/sdf 같은 형식으로 보이는데, EC2 인스턴스의 리눅스에서는 볼륨이 xvda, xvdf 같은 형식으로 바뀌어 보이는 것을 알고 계셨나요?

AWS는 AWS Management Console을 통해 볼륨을 연결할 때 다음 메시지 혹은 경고를 제공합니다.

노락색 칸 안의 메시지를 해석하면,

Note : 여기에 입력 된 (세부 사항에 표시된) 장치 이름이 /dev/sdf /dev/sdp 인 경우에도 최신 Linux 커널은 /dev/xvdf를 통해 장치를 /dev/xvdp로 내부적으로 바꿀 수 있습니다.

Red Hat Enterprise Linux의 일부 버전과 CentOS와 같은 Red Hat Enterprise Linux의 변형 버전에서는 뒤에 오는 문자가 변경될 수도 있습니다. 그리고 이러한 동작은 xen-blkfront 드라이버가 실행한다고 알려져 있습니다. (추가 내용은 여기를 클릭해서 확인해주세요.)

다음 시간에는 EC2 인스턴스 리눅스 환경에서 실제로 LV를 구성하는 방법에 대해 알아보겠습니다.

SA팀 황문주


이미지 출처