CentOS 7: Mettre en place du LVM Cache avec des disques HDD et SSD

De Pegasus45
Révision datée du 27 janvier 2016 à 17:07 par Admin (discussion | contributions) (Déconnexion du cache pool LV)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

Le type cache d'un LV (Logical Volume) utilise des petits mais très rapides LV afin d'améliorer les performances des gros mais lents LV. Pour cela, il stocke des blocks de données fréquemment utilisés sur le LV rapide. LVM fait référence au petit LV rapide comme cache pool LV. Le gros LV lent est appelé origin LV. Comme il s'appuie à dm-cache (un driver du Kernel), LVM éclate le cache pool LV en 2 périphériques: le cache data LV et le cache metadata LV. Le cache data LV est utilisé pour stocker une copie des blocks de données fréquemment utilisés. Le cache metadata LV stocke des informations sur les blocks pour savoir s'ils sont présents dans le cache rapide.

Termes utilisés

origin LV OriginLV gros LV lent
cache data LV CacheDataLV petit LV rapide pour le cache pool data
cache metadata LV CacheMetaLV petit LV rapide pour le cache pool metadata
cache pool LV CachePoolLV CacheDataLV + CacheMetaLV
cache LV CacheLV OriginLV + CachePoolLV


Mise en place basique

J'utilise une CentOS 7.2 avec un disque HDD (sdb) et un disque SSD (sdc).

La mise en place basique d'un cache LV est la suivante:

  • Création d'un VG
Command
pvcreate /dev/sdb1
pvcreate /dev/sdc1
vgcreate VG /dev/sdb1 /dev/sdc1


  • Création de origin LV

On crée un LV sur le disque lent qui sera le OriginLV:

Command
lvcreate -L 19G -n OriginLV VG /dev/sdb1

  • Création de cache data LV

On crée le cache data LV sur le LV rapide. Ce LV stockera les blocks de données utilisés venant de OriginLV. La taille de ce LV est la taille du cache et sera rapportée comme la taille de cache pool LV:

Command
lvcreate -L 9G -n CacheDataLV VG /dev/sdc1

  • Création de cache metadata LV

On crée le cache metadata LV sur le LV rapide. Ce LV stockera les metadonnées des blocks contenu dans le cache. La taille de ce LV doit être 1000 fois plus petite que celle du cache data LV avec un minimum de 8Mo:

Command
lvcreate -L 20M -n CacheMetaLV VG /dev/sdc1

On peut voir les 3 LV qu'on vient de créer:

Command
lvs -a VG


  LV          VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  CacheDataLV VG   -wi-a-----  9,00g
  CacheMetaLV VG   -wi-a----- 20,00m
  OriginLV    VG   -wi-a----- 19,00g

  • Création de cache pool LV

On va fusionner le cache data LV et le cache metadata LV pour former un cache pool LV. Cette fusion va modifier les LV de la façon suivante:

  1. CachePoolLV va récupérer le nom du CacheDataLV.
  2. CacheDataLV est renommé en CachePoolLV_cdata et sera invisible.
  3. CacheMetaLV est renommé en CachePoolLV_cmeta et sera invisible.
Command
lvconvert --type cache-pool --cachemode writethrough --poolmetadata VG/CacheMetaLV VG/CacheDataLV

Le mode writethrough indique qu'une écriture est considérée comme terminée lorsque la donnée a été écrite sur le LV lent ET sur le LV rapide. Le mode writeback indique que l'écriture sera faite sur le cache rapide, puis plus tard, sur le LV lent. Les performances sont améliorées mais si le cache rapide tombe en panne, les données seront donc incohérentes. Par contre, il est possible de créer un miroir (avec 2 SSD) pour le cache rapide.


On peut voir le résultat de la transformation des LV:

Command
lvs -a -o +devices


  LV                  VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices             
  CacheDataLV         VG     Cwi---C---  9,00g                                                     CacheDataLV_cdata(0)
  [CacheDataLV_cdata] VG     Cwi-------  9,00g                                                     /dev/sdc1(0)        
  [CacheDataLV_cmeta] VG     ewi------- 20,00m                                                     /dev/sdc1(2304)     
  OriginLV            VG     -wi-a----- 19,00g                                                     /dev/sdb1(0)        
  [lvol0_pmspare]     VG     ewi------- 20,00m                                                     /dev/sdb1(4864)     
  root                centos -wi-ao---- 17,51g                                                     /dev/sda2(512)      
  swap                centos -wi-ao----  2,00g                                                     /dev/sda2(0)

  • Création de cache LV

Il ne reste plus qu'à créer le cache LV en reliant le cache Pool LV (CacheDataLV + CacheMetaLV) au Origin LV. Le cache LV va prendre le nom du Origin LV alors que celui va être renommé en OriginLV_corig et sera invislble:

Command
lvconvert --type cache --cachepool VG/CacheDataLV VG/OriginLV

Pour voir le résultat:

Command
lvs -a VG


  LV                  VG   Attr       LSize  Pool          Origin           Data%  Meta%  Move Log Cpy%Sync Convert
  [CacheDataLV]       VG   Cwi---C---  9,00g                                0,00   5,82            100,00
  [CacheDataLV_cdata] VG   Cwi-ao----  9,00g
  [CacheDataLV_cmeta] VG   ewi-ao---- 20,00m
  OriginLV            VG   Cwi-a-C--- 19,00g [CacheDataLV] [OriginLV_corig] 0,00   5,82            100,00
  [OriginLV_corig]    VG   owi-aoC--- 19,00g
  [lvol0_pmspare]     VG   ewi------- 20,00m


Mise en place d'un cache en RAID1

Pour rappel, il existe 2 modes de cache:

  • writethrough: l'écriture est faite sur le cache rapide ET sur le LV lent.
  • writeback: l'écriture est d'abord sur le cache rapide, puis, plus tard, sur le LV lent.

On voit qu'avec le mode writeback, si le cache rapide tombe en panne avant qu'il ne mette à jour le LV lent, les données sont définitivement perdues. Pour cela, il est possible de mettre en RAID1 le cache rapide (data et metadata).

  • HDD: 20Go: /dev/sdd1
  • SSD: 10Go: /dev/sde1
  • SSD: 10Go: /dev/sdf1
  1. On crée les PV et le VG:
Command
pvcreate /dev/sdd1
pvcreate /dev/sde1
pvcreate /dev/sdf1
vgcreate vg /dev/sdd1 /dev/sde1 /dev/sdf1

  1. On crée le LV lent sur les HDD (/dev/:
Command
lvcreate -L 10G -n lv1 vg /dev/sdd1

  1. On crée le "cache data LV" en RADI1:
Command
lvcreate --type raid1 -m 1 -L 9G -n cache1 vg /dev/sde1 /dev/sdf1

  1. On crée le "cache metadata LV" en RADI1:
Command
lvcreate --type raid1 -m 1 -L 12M -n cache1meta vg /dev/sde1 /dev/sdf1

  1. On crée le "cache pool LV" en combinant les 2 caches (data et metadata):
Command
lvconvert --type cache-pool --cachemode writeback --poolmetadata vg/cache1meta vg/cache1

  1. On relie le cache pool LV au LV lent:
Command
lvconvert --type cache --cachepool vg/cache1 vg/lv1

  1. Au final, on a nos LV comme ceci:
Command
lvs -a vg

  LV                      VG   Attr       LSize  Pool     Origin      Data%  Meta%  Move Log Cpy%Sync Convert
  [cache1]                vg   Cwi---C---  9,00g                      0,00   9,70            100,00
  [cache1_cdata]          vg   Cwi-aor---  9,00g                                             100,00
  [cache1_cdata_rimage_0] vg   iwi-aor---  9,00g
  [cache1_cdata_rimage_1] vg   iwi-aor---  9,00g
  [cache1_cdata_rmeta_0]  vg   ewi-aor---  4,00m
  [cache1_cdata_rmeta_1]  vg   ewi-aor---  4,00m
  [cache1_cmeta]          vg   ewi-aor--- 12,00m                                             100,00
  [cache1_cmeta_rimage_0] vg   iwi-aor--- 12,00m
  [cache1_cmeta_rimage_1] vg   iwi-aor--- 12,00m
  [cache1_cmeta_rmeta_0]  vg   ewi-aor---  4,00m
  [cache1_cmeta_rmeta_1]  vg   ewi-aor---  4,00m
  lv1                     vg   Cwi-a-C--- 19,00g [cache1] [lv1_corig] 0,00   9,70            100,00
  [lv1_corig]             vg   owi-aoC--- 19,00g
  [lvol0_pmspare]         vg   ewi------- 12,00m


Déconnexion du cache pool LV

Il est possible de retirer le cache pool LV du cache LV, ce qui fait que le LV n'a plus de cache rapide. Les données contenues dans le cache seront écrites dans le LV lent avant la déconnexion:

Command
lvconvert --splitcache vg/lv1

  Flushing cache for lv1.
  Logical volume vg/lv1 is not cached and cache pool vg/cache1 is unused.