ZFS terminologie et commandes de bases

Introduction

Avec ZFS on parlera de datasets, présents dans des zpools, composés de plusieurs vdev  représentant eux-même les disques concrets. Pour mieux comprendre, voici un exemple :

Nous avons quatre disques durs, de 1 Go chacun. Nous allons les utiliser de façon à avoir un pool de stockage de 2 Go répliqués :

# zpool create -f -o ashift=12 tank mirror /home/spydemon/hdd1 /home/spydemon/hdd2 mirror /home/spydemon/hdd3 /home/spydemon/hdd4
# zpool status
                                pool: tank
state: ONLINE
                                scan: none requested
config:

	NAME                     STATE     READ WRITE CKSUM
	tank                     ONLINE       0     0     0
	  mirror-0               ONLINE       0     0     0
	    /home/spydemon/hdd1  ONLINE       0     0     0
	    /home/spydemon/hdd2  ONLINE       0     0     0
	  mirror-1               ONLINE       0     0     0
	    /home/spydemon/hdd3  ONLINE       0     0     0
	    /home/spydemon/hdd4  ONLINE       0     0     0

errors: No known data errors

# sudo zfs list
NAME   USED  AVAIL  REFER  MOUNTPOINT
tank  56,5K  1,95G    19K  /tank

Nous pouvons à présent directement exploiter le zpool tank, ou alors le segmenter en différents datasets :

zfs create tank/dataset1
zfs create tank/dataset2
zfs list
NAME            USED  AVAIL  REFER  MOUNTPOINT
tank            468K  11,6G    96K  /tank
tank/dataset1    96K  11,6G    96K  /tank/dataset1
tank/dataset2    96K  11,6G    96K  /tank/dataset2

Voici un schéma pour mieux comprendre :

Nous avons conçu deux vdevsmirror-0 et mirror-1 appartenant tous les deux au zpool tank dont la taille efficace est de 2 Go. Il est monté sur tank dans l’arborescence.

Renommer et lister un dataset

Renommer un dataset :
zfs rename tank/dataset1 tank/data

Lister les datasets :
zfs list 

Snapshot en local

Création : 
zfs snapshot tank/data@one

Lister :
zfs list -t snapshot

Rendre visible le dossier snapshot :
zfs set snapdir=visible tank/data

Afficher les modifications depuis le snapshot :
zfs diff tank/data@one

Compression

État :
zfs get compression zfs_data 
NAME      PROPERTY     VALUE     SOURCE
zfs_data  compression  lz4       local

Activer :
zfs set compression=lz4 zfs_data

Znapzend (snapshot distant)

Nous allons utiliser znapzend pour envoyer les snapshot d’un serveur de production « servprod » vers un serveur de sauvegarde « servsav ».

  • Installer znapzend sur servprod
  • ensuite il faut créer un service znapzend dans le fichier /etc/init/znapzend.conf
  • puis démarrer le service : service znapzend start
  • ajouter mbuffer
  • création du dataset sur servsav : zfs create zfs_sav/TestNorbert
  • échange de clef ssh de servprod sur servsav
  • lancer le processus de backup* du dataset data,  avec la politique suivante : garde un snapshot toutes les minutes pendant 30 minutes et copie sur servsav.

*En langage ZFS, les processus de backup sont appelés PLAN de snapshot. Voir plus bas pour un PLAN plus opérationnel.

  • commande à lancer sur servprod pour exécuter le PLAN :
znapzendzetup create SRC '30min=>1min' tank/data DST '30min=>1min' root@servsav:zfs_sav/TestNorbert

Au bout de 30mn servprod à généré 30 snapshot (SRC ’30min=>1min’) . A la 31ème minutes le système supprime le snapshot le plus vieux et génère un nouveau snapshot. Ainsi il reste toujours 30 snapshot. ET ainsi de suite, la fenêtre des snapshot ce décale dans le temps. De la même manière , l’attribut  DST ’30min=>1min’ , définie la politique de rétention des snapshots sur le serveur distant.

  • lister les snapshots sur servprod :
root@servprod:/tank/data# zfs list -t snap
NAME                          USED  AVAIL  REFER  MOUNTPOINT
tank/data@one                  68K      -   108K  -
tank/data@two                  72K      -   116K  -
tank/data@2017-09-15-174200      0      -   120K  -
tank/data@2017-09-15-174300      0      -   120K  -
tank/data@2017-09-15-174400      0      -   120K  -
tank/data@2017-09-15-174500      0      -   120K  -
tank/data@2017-09-15-174600      0      -   120K  -
tank/data@2017-09-15-174700      0      -   120K  -
tank/data@2017-09-15-174800      0      -   120K  -
tank/data@2017-09-15-174900      0      -   120K  -
tank/data@2017-09-15-175000      0      -   120K  -
tank/data@2017-09-15-175100      0      -   120K  -
tank/data@2017-09-15-175200      0      -   120K  -
tank/data@2017-09-15-175300      0      -   120K  -
tank/data@2017-09-15-175400      0      -   120K  -
tank/data@2017-09-15-175500      0      -   120K  -
tank/data@2017-09-15-175600      0      -   120K  -
tank/data@2017-09-15-175700      0      -   120K  -
tank/data@2017-09-15-175800      0      -   120K  -
tank/data@2017-09-15-175900      0      -   120K  -
tank/data@2017-09-15-180000      0      -   120K  -
tank/data@2017-09-15-180100      0      -   120K  -
tank/data@2017-09-15-180200      0      -   120K  -
tank/data@2017-09-15-180300      0      -   120K  -
tank/data@2017-09-15-180400      0      -   120K  -
tank/data@2017-09-15-180500      0      -   120K  -
tank/data@2017-09-15-180600      0      -   120K  -
tank/data@2017-09-15-180700      0      -   120K  -
tank/data@2017-09-15-180800      0      -   120K  -
tank/data@2017-09-15-180900      0      -   120K  -
tank/data@2017-09-15-181000      0      -   120K  -
tank/data@2017-09-15-181100      0      -   120K  -
tank/data@2017-09-15-181200      0      -   120K  -
  • lister les snapshots sur servsav :
[root@servsav~]# zfs list -t snap | grep Norbert
zfs_sav/TestNorbert@2017-09-15-174400  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174500  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174600  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174700  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174800  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-174900  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175000  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175100  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175200  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175300  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175400  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175500  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175600  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175700  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175800  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-175900  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180000  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180100  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180200  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180300  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180400  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180500  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180600  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180700  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180800  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-180900  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-181000  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-181100  12,8K      -   230K  -
zfs_sav/TestNorbert@2017-09-15-181200  12,8K      -   230K  -
  • dernier snapshot sur servprod :
root@servprod:/tank/data# znapzendztatz -r tank/data
USED    LAST SNAPSHOT       DATASET
 268K   2017-09-15-181500   tank/data
 614K   2017-09-15-181500   root@servsav:zfs_sav/TestNorbert
  • Le programme de backup est sauvegardé dans les propriétés du dataset ZFS :
zfs get all tank/data | grep org.znapzend

tank/data  org.znapzend:dst_0          root@servsav:zfs_sav/TestNorbert  local
tank/data  org.znapzend:pre_znap_cmd   off                              local
tank/data  org.znapzend:recursive      off                              local
tank/data  org.znapzend:src_plan       30minutes=>1minutes              local
tank/data  org.znapzend:tsformat       %Y-%m-%d-%H%M%S                  local
tank/data  org.znapzend:enabled        on                               local
tank/data  org.znapzend:post_znap_cmd  off                              local
tank/data  org.znapzend:dst_0_plan     30minutes=>1minutes              local
tank/data  org.znapzend:mbuffer        off                              local
tank/data  org.znapzend:zend_delay     0                                local
tank/data  org.znapzend:mbuffer_size   1G                               
local

Autre PLAN de snapshot

En local sur servprod :

  • toutes les 6 heures pendant 2 jours : 2d=>6h
  • tous les jours pendant 1 semaine : 1w=>1d

En distant sur servsav:

  • toutes les 6 heures pendant 2 jours : 2d=>6h
  • tous les jours pendant 1 semaine : 1w=>1d
  • garder une semaine : 1m=>1w
  • garder un mois : 1y=>1m
  • garder une semaine pendant 3 mois : 3m=>1w

Et la commande linux :

znapzendzetup create SRC '2d=>6h,1w=>1d' tank/data DST '2d=>6h,1w=>1d,1m=>1w,1y=>1m,3m=>1w' root@servsav:zfs_sav/TestNorbert

Redémarrer le service znapzend pour une prise en compte de toute modification du PLAN

systemctl reload znapzend.service

Ajouter mbuffer au PLAN

znapzendzetup edit --mbuffer=/usr/bin/mbuffer SRC tank/data
recharger le plan

Ajouter le dump de la BDD au plan avant la creation des snapshots

znapzendzetup edit --pre-snap-command=/var/pgsave/bin/pg_seafile.sh SRC tank/data
recharger le plan

 

Références