LVM2, thin-provisioning et sauvegardes performantes (partie 1)

March 2018

linux lvm2 thinprovisioning lzop

Depuis de nombreuses années, j’héberge un certain nombre de machines virtuelles en utilisant LVM2 comme principal outil de gestion des volumes de stockage.

Le but de cet article est de présenter une façon de réaliser des sauvegardes de ces volumes de manière atomique et performante.

Pour les impatients

# Sous Debian GNU/Linux
apt install lvm2
# création du physicalvolume
pvcreate /dev/sdxx
# volume group lvm2 classique
vgcreate rootvg /dev/sdxx
# création du pool
lvcreate --size 1G --thin rootvg/thinpool
# création d'un volume "thin provisioning"
lvcreate --name tvol1 -T rootvg/thinpool -V 256M
# Pour créer un snapshot, il n'est pas nécessaire de spécifier la taille,
# c'est la taille globale du pool qui sera utilisée
lvcreate -s --name tvolsnap1 rootvg/thinpol

Thin Provisioning

LVM2, et DM (Device Mapper) sont liés dans le noyau linux. Depuis quelque années, il est possible de créer des volumes logiques avec LVM en utilisant la technologie “thin provisioning”.

Non seulement thin-provisioning permet de réaliser une allocation encore plus flexible que des volumes logique classique, mais a aussi des avantages sur les performances lors de la rélaisation de snapshots.

Pour plus d’information, je recommande la documentation de RedHat qui est bien réalisée à ce sujet. RedHat thin-provisioning

Une histoire de snapshot

Sous LVM, lorsque l’on créée un snapshot d’un volume logique, un nouveau volume logique est ajouté, lié à sa source.

Lorsqu’une écriture interviens, sur le snapshot lui même, ou sur la source (le plus probable), LVM doit copier les données à un autre endroit, afin de conserver les données inchangées par rapport au moment ou le snapshot à été lancé.

Avec des volumes logique classique, LVM nécessite de réaliser plusieurs opérations lors d’une écriture:

  1. Lecture du bloc de donnée concernée par l’écriture
  2. Copie du bloc “dans” le snapshot
  3. Copie/Écriture des métadonnées dans le snapshot
  4. Écriture sur le volume source
  5. Écriture des métadonnées sur le volume source
                   LVOL1            LVOL1 (SNAP)

+------+         +------+   read     +------+
|      |   write |     +------------->      |
| WOW +----------->HELL |   write    | HELL |
|      |         |      |            |      |
+------+         +------+            +------+
                 |      |            |      |
                 | IAM  +------------+      |
                 |      |            |      |
                 +------+            +------+
                 |      |            |      |
                 |  ON  +------------+      |
                 |      |            |      |
                 +------+            +------+
                 |      |            |      |
                 | DISK +------------+      |
                 |      |            |      |
                 +------+            +------+
                 | meta | write      | meta | write
                 +------+            +------+

Voici un article expliquant plus en détails l’amplification d’écriture avec LVM.

A noter que toute ces opérations sont cumulées au fur et à mesure que l’on ajoute des snapshot.

Avec thin-provisioning, les choses sont différentes. Les données ne sont pas stockées dans un volume, puis copiées dans un snapshot.

Un pool de donnée est créée, et tous les volumes (y compris la source) ont une table qui associe le disque vers ce pool de donnée.

Schéma simplifié:

TVOL1 (SNAP)         TPOOL               TLVOL 1

 +------+           +------+            +------+
 |      |           |      |            |      |
 |    +-------------> WOW <---------------+    |
 |      |           |      |            |      |
 +------+           +------+            +------+
 |      |           |      |            |      |
 |    +-------------> IAM <---------------+    |
 |      |           |      |            |      |
 +------+           +------+            +------+
 |      |           |      |            |      |
 |    +------------->  ON <--  remove +--+     |
 |      |           |      |          | |      |
 +------+           +------+          | +------+
 |      |           |      |          | |      |
 |    +-------------> DISK <-------------+     |
 |      |           |      |          | |      |
 +------+           +------+          | +------+
                    |      |          |
                    | NOT <-----------+
                    |      |
                    +------+

Ainsi, un volume “thin provisioning” ne comporte pas réllement de donnée, il contiens une table de pointeur vers le pool.

Cette methodologie de stockage ne provoque pas d’étape supperflue lorsque l’on utilise des snapshot.

Par exemple, lorsque l’on écrie des données alors qu’un volume dispose d’un snapshot:

  1. Allocation et écriture d’un block dans le pool
  2. Association du block dans les métadonnées du volume

Il n’y a pas d’amplification d’écriture ou de lecture avec l’utilisation des snapshot LVM thin-provisioning.

Dans la prochaine partie, on verra comment réaliser des sauvegardes des volumes logiques sans (trop) perturber une machine en production.