LVM 기본 구조 정리

LVM(Logical Volume Management)이란?

LVM 기능을 사용하지 않을 때는 파일시스템과 물리 저장소 사이를 직접 연결하였습니다. LVM은 그런 불편함을 제거하기 위한 기능으로 Linux 환경에서 파일 시스템과 물리 저장소 사이의 추상 레이어를 제공하여 볼륨을 손쉽고 유연하게 관리할 수 있는 기능을 제공합니다.

LVM은 크게 PV(Physical Volume), VG(Volume Group), LV(Logical Volume) 파트로 구분되어 있습니다.

1. PV (Physical Volume)

Alt text

PV는 실제 물리 디스크를 LVM 용도로 초기화된 물리 디스크 또는 파티션입니다. 예를 들면 /dev/sda, /dev/sda1 이나 KVM 환경에서 /dev/vda 등이 PV입니다. 또한 PV는 PE (Physical Extent)라는 단위로 나누어져 있습니다. PE의 기본값은 4MB이고 PE의 값은 볼륨 그룹을 생성할 때 지정할 수 있습니다. 데이터의 크기가 큰 파일을 자주 사용하는 경우에는 큰 사이즈의 extent가 적합하지만 반대의 경우에는 작은 사이즈의 extent로 설정하는 것이 좋습니다.

PV에서는 LVM Label과 LVM Metadata를 포함합니다. LVM Label은 물리 장치를 식별하고 순서대로 나열할 수 있도록 해줍니다. 또한 물리 볼륨의 UUID를 포함하고 블록 장치의 크기를 바이트 단위로 저장하며 LVM Metadata가 장치에 저장될 위치를 기록합니다. LVM Metadata는 LVM 볼륨 그룹에 대한 구성 정보를 포함합니다. Metadata는 ASCII로 저장됩니다.

  • PV command
    • pvscan : PV에 대한 디스크를 확인 후 이를 출력
    • pvcreate : 물리 디스크 를 PV로 초기화하기 위해 사용
    • pvdisplay : PV에 대한 세부 정보를 출력
    • pvremove : PV를 제거하기 위해 사용

2. VG (Volume Group)

Alt text

VG는 하나 이상의 PV를 가지고 만든 물리적 볼륨의 집합입니다. PV는 단 하나의 VG에만 포함될 수 있습니다. VG를 만든다는 건 논리적 볼륨을 할당할 수 있는 디스크 공간 풀 생성하는 것입니다. VG는 LE를 PE로 맵핑하는 역할을 합니다.

3. LV (Logical Volume)

LV는 사용자가 직접 다루는 논리적인 볼륨 공간입니다. 간단하게 생각하여 Windows에서 제공하는 C드라이브, D드라이브를 Linux의 LV로 생각하시면 됩니다. LV에는 여러 종류가 존재하고 각각의 LV는 장단점이 존재합니다. PV를 PE로 나누듯이 LV는 LE(Logical Extent)로 나누어져 있습니다. LE의 사이즈는 PE와 동일하게 설정됩니다. 각 LE들은 LV마다 0번부터 시작하고 PE에 맵핑되게 됩니다.

linear volume

  • VG에 할당된 PV를 하나의 LV로 모으거나 다수의 LV로 나누어 사용할 수 있도록 해줍니다.
  • 가장 기본적인 LV로 특별한 장점도 단점도 없습니다

RAID volume

Raid Volume은 Raid 0,1,4,5,6,10 을 지원하고 MD 커널 드라이버를 활용합니다. Raid Volume은 스냅샷 기능을 사용할 수 있습니다.

striped volume [raid0]

Alt text

striped 논리 볼륨은 데이터를 기록할 때 라운드-라운드 방식으로 지정된 물리 볼륨에 데이터를 작성하여 성능을 향상시킵니다. I/O를 병렬로 실행할 수 있는 장점이 있고 상황에 따라 Linear volume에 가까운 성능 향상을 기대할 수 있습니다. 단, striped 방식의 특성상 최소 2개 이상의 물리 볼륨이 필요합니다.

mirror volume [raid1]

Alt text

Mirror 논리 볼륨은 데이터의 안정성을 위하여 데이터를 다른 장치에 복사본을 저장합니다. 만약 한쪽의 장치에 장애가 발생할 경우 논리 볼륨은 다른 한쪽으로 선형 볼륨이 되어 액세스가 가능합니다.

thin volume

Alt text Alt text

Thin volume은 Thin porivisioning 기술을 이용한 볼륨입니다. Thin provision을 사용하면 가상 풀을 사용하여 효율적인 스토리지 공간 할당을 하기 때문에 사용 가능한 범위 보다 더 큰 논리 볼륨을 생성할 수 있습니다. 기존의 다른 LV들은 PV를 VG로 묶고 VG에 LV를 만들면 LE가 각각의 PE에 맵핑되어 실제로 사용하지 않고 있더라도 다른 LV로 생성할 수 없습니다. 하지만 Thin provision을 사용한다면 Thin Pool이라는 가상 풀을 만들어서 VG에는 Thin Pool만큼만 차지하고 각각의 LV들은 실제 사용량 만큼만 공간을 차지하게 됩니다. Thin LV들은 다른 논리 볼륨과 다르게 Thin pool이라는 가상풀을 사용하기 때문에 PE에 직접 맵핑되지 않고 Virtual Extent라는 가상 extent에 맵핑되게 됩니다. Thin provision의 중요한 점은 Thin Pool이 실제로 꽉 차기 전에 사용자가 적절히 확장을 해주어야 한다는 부분입니다.

4. Snapshot

스냅샷은 데이터를 백업하는 방법 중 하나로 용량이 큰 데이터를 완전히 백업할 때 많은 시간이 필요하기 때문에 스냅샷 생성을 기준으로 데이터를 그대로 유지시키는 방법입니다. 기존의 데이터는 읽기 전용 복사본으로 고정시키고 프로그램에서는 데이터를 계속 쓸 수 있도록 해주는 방법입니다. 아래는 스냅샷 방법 2가지를 설명합니다.

COW [Copy-on-Write]

Alt text

COW 방식은 구성이 끝난 후 스냅샷 공간을 할당하기 어렵기 때문에 스토리지를 구성할 때 미리 스냅샷을 위한 공간을 할당합니다. 기존 데이터에서 스냅샷을 생성하면 스냅샷은 기존 데이터를 가리키게 됩니다. 그 후 데이터의 변경이 일어날 경우에 데이터를 스냅샷 공간으로 데이터를 복사하고 스냅샷은 복사한 데이터를 가리키게 됩니다.

  • 스토리지를 구성할 때 미리 스냅샷을 위해 1~20% 공간을 할당
  • 구성이 끝난 후 스냅샷 공간을 할당하기 어려움
  • 원본 데이터가 변경될 때는 I/O 성능이 떨어지는 문제
  • 데이터가 변경되면 스냅샷 공간으로 원본 데이터를 복사

ROW [Redirect-on-Write]

Alt text

ROW 방식은 스냅샷을 위한 별도의 공간이 필요하지 않습니다. 이 방식에서 스냅샷을 생성하면 기존 데이터를 가리키는 것까지는 COW 방식과 차이가 없습니다. 다만 데이터가 변경된 이후에 스냅샷은 기존 데이터를 프리징 시키고 변경하려고 하는 데이터를 새로운 스냅샷 공간에 작성합니다.

  • 스냅샷을 위한 별도의 공간을 미리 확보하지 않아도 된다
  • 데이터가 생성되면 스토리지 OS나 LUN 컨트롤러에서 데이터의 위치를 기록하고 관리
  • 데이터가 변경되면 원본 데이터를 스냅샷 블록으로 사용하고 새로운 블록을 할당받아서 데이터를 관리

5. 전체 기본 구조도

Alt text

LVM의 전체 그림을 보면 물리 디스크를 PV로 만들고 각 PV들은 하나의 VG에 속하게 됩니다. LV는 VG를 통하여 각 LE를 PE에 용량이나 볼륨 타입에 맞게 맵핑 합니다.

이상 LVM의 기본적인 구조, 개념에 대해 알아 보았습니다. 차후에는 LVM이 실제 Linux Kernel에서 어떻게 동작 되는지 알아보도록 하겠습니다.


참고

Linux Kernel 코드 : https://www.kernel.org/

LVM 코드 : https://sourceware.org/lvm2/

LVM 기본 구조 : https://tech.cloud.nongshim.co.kr/2018/11/23/lvmlogical-volume-manager-1-%EA%B0%9C%EB%85%90/

Redhat LVM Administration guide : https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/logical_volume_manager_administration/index