Cloud/AWS

AWS Amazon Linux LVM 구성하기

Dragonfog.net 2025. 4. 22. 06:51
반응형

AWS에서 SAP 구성시 디스크 성능 향상을 위해서 LVM을 많이 구성하여 사용함

AWS의 EBS 볼륨을 Stripe로 구성하여 성능 향상을 기대할 수 있음

AWS EBS의 경우 gp3 type는 3000 IOPS 와 125MB/S 에 가까운 처리량을 제공하기에 2개의 EBS 볼륨을 Stripe LVM으로 구성 할 경우 최대 6000 IOPS / 250 MB/s에 가까운 처리량을 기대 할 수 있음

- LVM의 단점은 마운트하면 Mapper Driver를 통해 진행하는데 이런 방식은 I/O가 처리될 때 거치게되는 커널 path에 오버헤드가 생긴다. 
(radi0 mdadm 사용에 비해서)
- 인스턴스 타입에 따라 IOPS Limit이 존재한다. = 스트라이프로 성능을 무제한으로 올릴 순 없다.
  https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ebs-optimized.html#current
  
- 블럭단위로 LVM 을 구성하기 때문에, 블럭이 끊기는 지점에서 성능이 저하되고 이에따라 IOPS가 들쭉날쭉 할 수 있다. 
  최적화를 잘하면 스트라이프를 통해 50%정도의 성능향상까진 기대할 수 있다고한다.

 

## lvm을 구성하기 위한 작업 순서
1. lvm 파티션을 생성 (gdisk) : 8e00
2. pvcreate로 physical disk 생성
3. Vgcreate로 VG 생성
4. 용도에 맞게 lvcreate로 볼륨 생성 (Striped | linear | mirror)
5. 파일시스템 생성후 마운트 진행 (mkfs.xfs, mkfs.ex4, mkfs.btrfs) : df -hT로 확인한 기존 파일시스템과 동일한 타입으로 새성해줌

 

1. gdisk를 사용하여 lvm 파티션 Create

usage : gdisk /dev/[Device_Name]
gdisk /dev/sdb

output : 
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: 
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8e00 > Hex code or GUID(16진수 코드 또는 GUID) 변수에 8e00 Linux LVM code 입력
Changed type of partition to 'Linux LVM'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdb.
The operation has completed successfully.

 

2. lsblk 명령어로 파티션 정보확인

# 파티션 정보 확인
lsblk

Output :
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    8M  0 part 
├─sda2   8:2    0   18G  0 part /opt
│                               /usr/local
│                               /srv
│                               /var
│                               /tmp
│                               /home
│                               /boot/grub2/x86_64-efi
│                               /boot/grub2/i386-pc
│                               /
└─sda3   8:3    0    2G  0 part [SWAP]
sdb      8:16   0   20G  0 disk 
└─sdb1   8:17   0   20G  0 part 
sdc      8:32   0   20G  0 disk 
└─sdc1   8:33   0   20G  0 part 
sdd      8:48   0   20G  0 disk 
└─sdd1   8:49   0   20G  0 part 
sde      8:64   0   20G  0 disk 
└─sde1   8:65   0   20G  0 part 
sdf      8:80   0   20G  0 disk 
└─sdf1   8:81   0   20G  0 part 
sdg      8:96   0   20G  0 disk 
└─sdg1   8:97   0   20G  0 part  
sr0     11:0    1 15.3G  0 rom 


lsblk -f

Output : 
NAME        FSTYPE      FSVER     LABEL                           UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
sda                                                                                                                     
├─sda1                                                                                                                  
├─sda2      btrfs                                                 e8c3f6f1-7f65-42c7-aedc-151405b402f0     14.6G    17% /opt
│                                                                                                                       /usr/local
│                                                                                                                       /srv
│                                                                                                                       /var
│                                                                                                                       /tmp
│                                                                                                                       /home
│                                                                                                                       /boot/grub2/x86_64-efi
│                                                                                                                       /boot/grub2/i386-pc
│                                                                                                                       /
└─sda3      swap        1                                         34f0faf9-3d74-4b23-8093-cd1632085585                  [SWAP]
sdb                                                                                                                     
└─sdb1      LVM2_member LVM2 001                                  ff3f6b-cW0R-5sDr-jcFT-Xhd1-0hrl-qsEGpD                
  └─vg01-data_vol01
                                                                                                                        
sdc                                                                                                                     
└─sdc1      LVM2_member LVM2 001                                  eKtxUn-u8Md-kMdx-J4jf-o6AL-4CZn-fd3DYh                
  └─vg01-data_vol01
                                                                                                                        
sdd                                                                                                                     
└─sdd1      LVM2_member LVM2 001                                  aYUkXP-6q6d-snmw-jUJP-MIcN-FOf4-9THV5w                
  └─vg01-data_vol01
                                                                                                                        
sde                                                                                                                     
└─sde1      LVM2_member LVM2 001                                  PrEPrC-Xy8K-5Yz2-5w53-eCv2-aQNZ-FuVysl                
sdf                                                                                                                     
└─sdf1      LVM2_member LVM2 001                                  wrXlHO-mxys-fESZ-ATsy-owU0-TqWU-dNGKw1                
sdg                                                                                                                     
└─sdg1      LVM2_member LVM2 001                                  2NVGij-W0wl-IkpJ-Kpe4-eifK-mwoa-d9SlFE                
sr0         iso9660     Joliet Ex SLE-15-SP6-Full-x86_6493.51.001 2024-06-13-19-56-33-00

 

3. pvcreate로 명령을 실행하여 pv 생성

# PV 물리볼륨 생성
 usage : pvcreate /dev/[Volume_Name]
 pvcreate /dev/sdb1
 
 Output : 
  Physical volume "/dev/sdb1" successfully created.
# PV 물리볼륨 생성 확인
# pvs
pvs

Output : 
  PV         VG Fmt  Attr PSize  PFree 
  /dev/sdb1     lvm2 ---  20.00g 20.00g
  /dev/sdc1     lvm2 ---  20.00g 20.00g
  /dev/sdd1     lvm2 ---  20.00g 20.00g
  /dev/sde1     lvm2 ---  20.00g 20.00g
  /dev/sdf1     lvm2 ---  20.00g 20.00g
  /dev/sdg1     lvm2 ---  20.00g 20.00g
 
 # pvdisplay 
  pvdisplay
  
  Output : 
    --- Physical volume ---
  PV Name               /dev/sde1
  VG Name               vg02
  PV Size               20.00 GiB / not usable 2.98 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               PrEPrC-Xy8K-5Yz2-5w53-eCv2-aQNZ-FuVysl
   
  --- Physical volume ---
  PV Name               /dev/sdf1
  VG Name               vg02
  PV Size               20.00 GiB / not usable 2.98 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               wrXlHO-mxys-fESZ-ATsy-owU0-TqWU-dNGKw1
   
  --- Physical volume ---
  PV Name               /dev/sdg1
  VG Name               vg02
  PV Size               20.00 GiB / not usable 2.98 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               2NVGij-W0wl-IkpJ-Kpe4-eifK-mwoa-d9SlFE
   
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg01
  PV Size               20.00 GiB / not usable 2.98 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               0
  Allocated PE          5119
  PV UUID               ff3f6b-cW0R-5sDr-jcFT-Xhd1-0hrl-qsEGpD
   
  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               vg01
  PV Size               20.00 GiB / not usable 2.98 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               0
  Allocated PE          5119
  PV UUID               eKtxUn-u8Md-kMdx-J4jf-o6AL-4CZn-fd3DYh
   
  --- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               vg01
  PV Size               20.00 GiB / not usable 2.98 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               0
  Allocated PE          5119
  PV UUID               aYUkXP-6q6d-snmw-jUJP-MIcN-FOf4-9THV5w

 

4. 볼륨 그룹을 생성하고 볼륨 그룹에 PV추가

# vgcreate 명령을 실행하여 VG 생성 (vg01 생성)
usage : vgcreate [VG이름] [PV이름]
vgcreate vg01 /dev/sdb1 /dev/sdc1 /dev/sdd1
vgcreate vg02 /dev/sde1 /dev/sdf1 /dev/sdg1

# 기존 vg01 에 추가시
vgextend vg02 /dev/sdh1
# VG 생성확인
# vgs
vgs

Output :
  VG   #PV #LV #SN Attr   VSize  VFree 
  vg01   3   1   0 wz--n- 59.99g     0 
  vg02   3   0   0 wz--n- 59.99g 59.99g
  
# vgdisplay
vgdisplay

Output:
  --- Volume group ---
  VG Name               vg02
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               59.99 GiB
  PE Size               4.00 MiB
  Total PE              15357
  Alloc PE / Size       0 / 0   
  Free  PE / Size       15357 / 59.99 GiB
  VG UUID               d2v81s-1hc6-qaKv-qQFw-faLP-S3l5-SeUGG9
   
  --- Volume group ---
  VG Name               vg01
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               59.99 GiB
  PE Size               4.00 MiB
  Total PE              15357
  Alloc PE / Size       15357 / 59.99 GiB
  Free  PE / Size       0 / 0   
  VG UUID               zKeKCp-YBpg-8Iex-pqPt-WGXY-7IoG-k2mGmH

 

5. LV 생성

#lvcreate 명령으로 LV 생성 
# LVM : lvm구성으로 디스크 관리하기

: vg01 에 있는 공간을 모두 할당한 data_vol01 이름의 LV 생성
lvcreate -n data_vol01 -l +100%FREE vg01

: 9G의 용량을 가진 data_vol01 이름의 LV 생성
lvcreate -n data_vol01 -L 9G vg01

Output:
Logical volume "data_vol01" created.


#LVM : Stripe 구성으로 성능향상
#Stripe LV 생성
lvcreate -L [볼륨 용량] -i[스트라이프 개수] -I[스트라이프 사이즈] --name [LV 이름] [VG 이름] 

-L : 논리적으로 생성할 볼륨 사이즈
-i : 스트라이프 개수, VG에 포함된 PV 개수를 초과할 수 없다. (볼륨 2개로 stripe 3개 불가능)
-I : 스트라이프 사이즈로 LVM과 실제 볼륨간의 I/O의 단위라고 생각하면 될 것 같다. 최대 256KB
--name : [생성할 LV 이름] [대상 VG 이름]

lvcreate -L 10G -i3 -I256 --name stripe_vol01 vg02
lvcreate -L 10G -i3 -I256 -n stripe_vol01 vg02

Output :
  Rounding size 10.00 GiB (2560 extents) up to stripe boundary size 10.01 GiB (2562 extents).
  Logical volume "stripe_vol01" created.
lvs

Output : 
  LV           VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  data_vol01   vg01 -wi-a----- 59.99g                                                    
  stripe_vol01 vg02 -wi-a----- 10.01g      
  
  
lvs --segment

Output : 
  LV         VG   Attr       #Str Type   SSize 
  LV           VG   Attr       #Str Type    SSize 
  data_vol01   vg01 -wi-a-----    1 linear  20.00g
  data_vol01   vg01 -wi-a-----    1 linear  20.00g
  data_vol01   vg01 -wi-a-----    1 linear  20.00g
  stripe_vol01 vg02 -wi-a-----    3 striped 10.01g
  
  
  Segment Type
  linear : 여러개의 디스크를 하나의 볼륨으로 구성하는것 이상의 의미가 없음
  striped : Stripe LVM으로 구성하면 두개의 물리적인 디스크의 처리량을 합한것 만큼의 성능을 기대할 수 있다.

 

6. 볼륨 마운트

ls -l /dev/[VG이름]
ls -l /dev/vg02

Output : 
total 0
lrwxrwxrwx 1 root root 7 Apr  5 08:57 stripe_vol01 -> ../dm-1

## df -hT로 현재 사용중인 파일시스템 타입 확인 후 동일 타입으로 생성
mkfs.xfs /dev/vg02/stripe_vol01
mkfs.ext4 /dev/vg02/stripe_vol01
mkfs.btrfs /dev/vg02/stripe_vol01

 

 

7. lv용량 관리 (spripe_vol01)

> Stripe 볼륨의 경우 볼륨 증성시 stripe 수량과 동일한 device가 있어야만 증설이 가능

lvs > lv에서 사용공간 및 vg 확인
  LV           VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  data_vol01   vg01 -wi-a----- 59.99g                                                    
  stripe_vol01 vg02 -wi-a----- 10.01g

pvs > 위에서확인한 vg에 공간 확인
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb1  vg01 lvm2 a--  20.00g     0 
  /dev/sdc1  vg01 lvm2 a--  20.00g     0 
  /dev/sdd1  vg01 lvm2 a--  20.00g     0 
  /dev/sde1  vg02 lvm2 a--  20.00g 16.66g
  /dev/sdf1  vg02 lvm2 a--  20.00g 16.66g
  /dev/sdg1  vg02 lvm2 a--  20.00g 16.66g
  
  
  # VG에 여유공간이 있어 논리공간을 확장
  lvextend -L +5G /dev/vg02/stripe_vol01
  
  # VG에 있는 모든 논리공간 할당
  lvextend -l +100%FREE /dev/vg02/stripe_vol01
  
  # 파일시스템 확장
  resize2fs /dev/vg_name/lv_name  # ext4의 경우
  xfs_growfs /dev/vg_name/lv_name  # XFS의 경우
  btrfs filesystem resize max /vg02 # btrfs의 경우
  
  
  ## 물리디스크 추가시
  ## 구성시 사용한 Stripe 갯수와 동일하게 구성해서 증설해야함
  gdisk > pvcreate > vgextend > lvextend

 

 

8. lvm 제거

# 순서 LV 마운트해제 → LV 제거 → VG 제거 → PV 제거
# 이름이 생각이 안 날때에는 pvscan, vgscan, lvscan 명령어를 활용

# LV 마운트 해제
umount [경로]

# LV 제거
lvremove /dev/[VG 이름]/[LV 이름]

# VG 제거
vgremove [VG 이름]

# PV 제거
pvremove [볼륨 이름]
반응형