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 vdevs : mirror-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