LVM Thin Provisioning and Over Provisioning

W moim poprzednim blogu przyjrzeliśmy się migawkom LVM . Kolejną zaawansowaną funkcją, na którą możemy spojrzeć w LVM2, jest Thin Provisioning. Jest to funkcja powszechna w większości specjalistycznego sprzętu pamięci masowej, która jest również częścią LVM2. Tworzenie woluminów LVM z alokacją elastyczną pozwala na udostępnienie większej ilości miejsca, niż faktycznie może znajdować się w systemie. Chociaż może to wydawać się szalone, może być korzystne. To ludzka cecha, że ​​prosimy o więcej, niż potrzebujemy. Dotyczy to wymagań dotyczących miejsca do przechowywania. Można więc mówić o 15 TB danych, ale tak naprawdę każdy korzysta z 3 TB. Korzystanie z Thin Provisioning w LVM2 umożliwi wdrażanie woluminów o większej ilości miejsca, niż faktycznie jest w systemie. Dzięki temu użytkownicy są zadowoleni. Musimy jednak upewnić się, że odpowiednio monitorujemy system, aby niedobory podaży nie stały się problemem. W następnej lekcji przyjrzymy się migracji danych LVM

Zainstaluj wymagane oprogramowanie

Może być konieczne zainstalowanie narzędzi do zarządzania Thin Provisioning w LVM. Pakiet to narzędzia do alokacji elastycznej w Arch Linux i Ubuntu, a w CentOS pakiet to urządzenia-mapper-persistent-data. Możemy sprawdzić, czy istnieje jedno z narzędzi, jeśli go tam nie ma, możemy zainstalować wymagany pakiet:

Zainstaluj Debian / Ubuntu

apt-get install -y narzędzia-thin-provisioning-tools

Tworzenie cienkiej puli

Rozwiązanie LVM Thin Provisioning wymaga, aby woluminy alokowane elastycznie znajdowały się w tzw. cienkiej puli. Cienka pula to po prostu specjalny rodzaj woluminu logicznego. Cienka pula określa, ile miejsca jest udostępniane woluminom alokowanym elastycznie. Bardzo ważne jest, abyśmy monitorowali dostępną przestrzeń w tej puli.

root@deb12:~# lvcreate --size 5g --thinpool think-pool sdb_lvm
  Thin pool volume with chunk size 64,00 KiB can address at most <15,88 TiB of data.
  Logical volume "think-pool" created.

Cienka pula jest tworzona poprzez określenie opcji –thinpool podczas tworzenia specjalnego LV. Nadaliśmy nazwę think-pool i jest ona tworzona w grupie woluminów sdb_lvm. Celowo ustawiliśmy mały rozmiar 5GB, abyśmy mogli zademonstrować nadmierne udostępnianie i potrzebę monitorowania cienkiej puli. Do monitorowania puli Thin Pool możemy użyć lvdisplay.

root@deb12:~# lvdisplay /dev/sdb_lvm/think-pool
  --- Logical volume ---
  LV Name                think-pool
  VG Name                sdb_lvm
  LV UUID                Qo0R3U-GpJA-PxSG-ZPgr-nvMz-PIsd-BOJfrV
  LV Write Access        read/write
  LV Creation host, time deb12, 2024-03-01 10:36:57 +0100
  LV Pool metadata       think-pool_tmeta
  LV Pool data           think-pool_tdata
  LV Status              available
  # open                 0
  LV Size                5,00 GiB
  Allocated pool data    0,00%
  Allocated metadata     10,64%
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           254:3

Co najważniejsze, musimy monitorować wartość danych przydzielonej puli. Ponieważ nie utworzyliśmy jeszcze żadnych wartości LV ani nie dodaliśmy danych, jest to świetne rozwiązanie przy zużyciu 0%. Do monitorowania tej wartości możemy również użyć polecenia lvs:

root@deb12:~# lvs
  LV         VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  samba      sdb_lvm -wi-ao---- 11,00g
  think-pool sdb_lvm twi-a-tz--  5,00g             0,00   10,64

root@deb12:~# lsblk
NAME                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                           8:0    0   20G  0 disk
├─sdb_lvm-samba             254:0    0   11G  0 lvm  /mnt/samba
├─sdb_lvm-think--pool_tmeta 254:1    0    8M  0 lvm
│ └─sdb_lvm-think--pool     254:3    0    5G  0 lvm
└─sdb_lvm-think--pool_tdata 254:2    0    5G  0 lvm
  └─sdb_lvm-think--pool     254:3    0    5G  0 lvm
sdb                           8:16   0   60G  0 disk
├─sdb1                        8:17   0   59G  0 part /
├─sdb2                        8:18   0    1K  0 part
└─sdb5                        8:21   0  975M  0 part [SWAP]
sr0                          11:0    1  628M  0 

Krytyczną kolumną jest Data%. Możemy również spojrzeć na atrybuty używane w puli:

Dla tpool atrybuty są następujące

Attr 
 -wi-ao—-

  • Volume Type: Thin pool / cienka pula
  • Permissions: Writable / Możliwość zapisu
  • Allocation Policy: Inherited from the Volume Group / Dziedziczone z Volume Group
  • Fixed minor number is not set / Stały numer mniejszości nie jest ustawiony
  • State: Is marked as active / Jest oznaczony jako aktywny
  • Device: Is not open or mounted / Nie jest otwarty ani zamontowany
  • Target type: Is marked as thin provisioning / Jest oznaczony jako thin provisioning
  • Zeroed: Newly allocated blocks will be overwritten with zeros before use. / Nowo przydzielone bloki zostaną nadpisane zerami przed ich użyciem.

Tworzenie cienkich woluminów w LVM2

Teraz, gdy mamy Thin Pool, możemy przydzielić miejsce Thin Volumes. Pamiętaj, że w rzeczywistości jesteśmy ograniczeni do śmiesznie małych 5GB. Nie powstrzymuje nas to od zapewnienia większej przestrzeni. Odbywa się to przy założeniu, że żądana przestrzeń prawdopodobnie nie będzie równa potrzebnej przestrzeni. Zasada Urban Penguin dla użytkowników IT obowiązuje:

Wymagana przestrzeń!= Potrzebna przestrzeń

Nawet jeśli rzeczywiście będą potrzebować żądanej przestrzeni, prawdopodobnie na początku nie będzie ona w całości potrzebna. Później można dodać więcej miejsca do grupy woluminów i cienkiej puli.

root@deb12:~# lvcreate -V 100G --thin -n tnin_volume sdb_lvm/think-pool
  WARNING: Sum of all thin volume sizes (100,00 GiB) exceeds the size of thin pool sdb_lvm/think-pool and the size of whole volume group (<20,00 GiB).
  WARNING: You have not turned on protection against thin pools running out of space.
  WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
  Logical volume "tnin_volume" created.

Widzimy, że pojawia się ostrzeżenie informujące nas o przekroczeniu aprowizacji. Informuje nas również, że w razie potrzeby możemy włączyć automatyczny rozwój puli. Bardzo podobnie jak w przypadku snapshotów

Przynajmniej użytkownicy są zadowoleni, mają wolumin 100 GiB, nie wiedząc, że trochę ich oszukaliśmy.

Jeśli ponownie spojrzymy na wynik polecenia lvs, zobaczymy nowy wolumin:


root@deb12:~# lvs
  LV          VG      Attr       LSize   Pool       Origin Data%  Meta%  Move Log Cpy%Sync Convert
  samba       sdb_lvm -wi-ao----  11,00g
  think-pool  sdb_lvm twi-aotz--   5,00g                   0,00   10,69
  tnin_volume sdb_lvm Vwi-a-tz-- 100,00g think-pool        0,00

root@deb12:~# lsblk
NAME                          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda                             8:0    0   20G  0 disk
├─sdb_lvm-samba               254:0    0   11G  0 lvm  /mnt/samba
├─sdb_lvm-think--pool_tmeta   254:1    0    8M  0 lvm
│ └─sdb_lvm-think--pool-tpool 254:3    0    5G  0 lvm
│   ├─sdb_lvm-think--pool     254:4    0    5G  1 lvm
│   └─sdb_lvm-tnin_volume     254:5    0  100G  0 lvm
└─sdb_lvm-think--pool_tdata   254:2    0    5G  0 lvm
  └─sdb_lvm-think--pool-tpool 254:3    0    5G  0 lvm
    ├─sdb_lvm-think--pool     254:4    0    5G  1 lvm
    └─sdb_lvm-tnin_volume     254:5    0  100G  0 lvm
sdb                             8:16   0   60G  0 disk
├─sdb1                          8:17   0   59G  0 part /
├─sdb2                          8:18   0    1K  0 part
└─sdb5                          8:21   0  975M  0 part [SWAP]
sr0                            11:0    1  628M  0 rom

Widzimy, że rozmiar cienkiego_woluminu wynosi 1 GiB. Atrybuty pokazują trochę więcej szczegółów:

Dla cienkiej_objętości atrybuty brzmią:

  • Volume Type: Thin Volume
  • Permissions: Writable
  • Allocation Policy: Inherited from the Volume Group
  • Fixed minor number is not set
  • State: Is marked as active
  • Device: Is not open or mounted
  • Target type: Is marked as thin provisioning
  • Zeroed: Newly allocated blocks will be overwritten with zeros before use.

 

  • Typ wolumenu: Cienka objętość
  • Uprawnienia: Zapisywalne
  • Zasady alokacji: Dziedziczone z grupy woluminów
  • Naprawiono numer drugorzędny, który nie jest ustawiony
  • Stan: Jest oznaczony jako aktywny
  • Urządzenie: nie jest otwarte ani zamontowane
  • Typ docelowy: jest oznaczony jako alokacja elastyczna
  • Zeroed: Nowo przydzielone bloki zostaną nadpisane zerami przed użyciem.

Uwaga: ponieważ pool jest obecnie używany, jest oznaczony jako otwarty.

Monitorowanie wykorzystania puli

Jak już wspomnieliśmy, wirtualny rozmiar cienkiego woluminu wynosi 100 GiB. Jeśli spróbujemy sformatować to za pomocą systemu plików ext4, proces zapisze wystarczającą ilość metadanych, aby obsłużyć wolumin o rozmiarze 100 GiB. Ponieważ pamięć fizyczna zajmuje zaledwie 5 MiB, zauważymy, że wykorzystywane miejsce znacznie wzrasta po samym sformatowaniu LV.

root@deb12:~# mkfs.ext4 /dev/sdb_lvm/tnin_volume
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 26214400 4k blocks and 6553600 inodes
Filesystem UUID: d9bd0648-3039-4741-9c0c-41115146d8aa
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

Używając polecenia lvs, możemy zobaczyć, że metadane systemu plików zajmują 12,40% miejsca na dysku w woluminie cienkim i 0,51% miejsca w puli cienkiej. Musimy bardzo uważać na cienką przestrzeń basenu, aby nie zabrakło jej miejsca:

root@deb12:~# lvs
  LV          VG      Attr       LSize   Pool       Origin Data%  Meta%  Move Log Cpy%Sync Convert
  samba       sdb_lvm -wi-ao----  11,00g
  think-pool  sdb_lvm twi-aotz--   5,00g                   10,16  12,40
  tnin_volume sdb_lvm Vwi-a-tz-- 100,00g think-pool        0,51

Konfigurowanie automatycznego rozszerzania cienkiej puli

Edycja ustawień w pliku /etc/lvm/lvm.conf może w razie potrzeby umożliwić automatyczne powiększanie cienkiej puli. Domyślnie próg wynosi 100%, co oznacza, że ​​pula nie będzie rosła. Jeśli ustawimy tę opcję na 75%, Cienka Pula będzie się automatycznie rozszerzać, gdy pula zostanie zapełniona w 75%. Zwiększy się o domyślny procent 20%, jeśli wartość nie zostanie zmieniona. Możemy zobaczyć te ustawienia za pomocą polecenia grep w stosunku do pliku.


root@deb12:~# grep -E thin_pool_auto /etc/lvm/lvm.conf
        # Configuration option activation/thin_pool_autoextend_threshold.
        # Also see thin_pool_autoextend_percent.
        # thin_pool_autoextend_threshold = 70
        # thin_pool_autoextend_threshold = 100
        # Configuration option activation/thin_pool_autoextend_percent.
        # thin_pool_autoextend_percent = 20
        # thin_pool_autoextend_percent = 20

Źródło: Link