*New 11.3 series Release:
2019-10-19: XigmaNAS 11.3.0.4.7014 - released

*New 12.0 series Release:
2019-10-05: XigmaNAS 12.0.0.4.6928 - released!

*New 11.2 series Release:
2019-09-23: XigmaNAS 11.2.0.4.6881 - released!

We really need "Your" help on XigmaNAS https://translations.launchpad.net/xigmanas translations. Please help today!

Producing and hosting XigmaNAS costs money. Please consider donating for our project so that we can continue to offer you the best.
We need your support! eg: PAYPAL

[TUTO] Zrep sans mountunion

Moderators: mtiburs, velivole18, ernie

Post Reply
User avatar
ernie
Forum Moderator
Forum Moderator
Posts: 1416
Joined: 26 Aug 2012 19:09
Location: France - Val d'Oise
Status: Offline

[TUTO] Zrep sans mountunion

#1

Post by ernie » 08 Sep 2018 18:37

Zrep peut être dorénavant installé sans utiliser mountunion. Ceci évite des conflits notamment avec l extension Plex.

La procédure d installation peut être manuelle (cf ci-après) ou automatique avec OBI.

La procédure manuelle est issue de:
viewtopic.php?f=71&t=13966&p=86593#p86593

Pour toutes questions sur ce tuto: viewtopic.php?f=35&t=13975

Plein d'information sur Zrep ici : http://www.bolthole.com/solaris/zrep/

POUR RAPPEL: Zrep permet de synchroniser des systèmes ZFS entre 2 serveurs et surtout de switcher vers le serveur fonctionnel en cas de défaillance du serveur maitre. Ceci se fait manuellement ou via un script (en cours de réflexion de mon côté pour en faire un).

IMPORTANT:
- Cette installation est pour des systèmes ZFS.
- Elle est à faire sur les 2 nas.
- Les jails de TheBrig sont gérées.
- Pour les services contenu dans nas4free (cifs/smb, bittorrent,...) à voir car le serveur de backup nécessite pour le moment une activation manuelle des services du nas de destination s'il devient maitre pour remplacer le serveur maitre.
- SAUVEGARDER VOS CONFIGURATIONS ET VOS DONNEES AUPARAVANT.

PREALABLE 1:
ATTENTION : sur le nas de destination et la source il faut impérativement désactiver les autosnapshots de nas4free. Sinon Zrep est perdu avec les snapshots et il ne synchronise pas (Zrep sync). L'initialisation de Zrep marche mais c'est tout. In fine Zrep gère les snapshots.

Si des snapshots autres que ceux de Zrep ont été fait, il faut tous les supprimer. Voici un script qui supprimera tous les snapshots sauf ceux de zrep (et en une fois :)), évitant des centaines de clics sur les croix dans le webgui :? :

Code: Select all

#!/bin/bash
# this deletes all snapshots except those containing text 'zrep'

for snapshot in `zfs list -H -t snapshot | cut -f 1 | grep -v zrep`
do
    echo destroying $snapshot
    zfs destroy $snapshot
done
Mettez le sur le pool concerné et éxécutez le une fois dans le pool. Par exemple:

Code: Select all

~nas4free/mnt/pool1: ./mnt/pool1/deletesnap
PREALABLE 2:

Il faut une connexion ssh sans mot de passe entre les 2 nas et dans les 2 sens : viewtopic.php?f=94&t=8854

Ceci est clé car sinon zrep demande des confirmations de mots de passe root, et cela ne marche plus (les snapshots ne sont pas envoyés, à moins d'être devant l'ordinateur pour saisir x fois le mot de passe).

PREALABLE 3: Desinstaller Zrep utilisant mountunion

Si Zrep est déjà installé via mountunion comme expliqué ici:
viewtopic.php?f=94&t=8606

Il faut enlever les commandes lancées au démarrage.

Aller dans "System > Advanced > Command Scripts" pour enlever les lignes suivantes :

Code: Select all

mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/usr_local /usr/local
mkdir -p /var/db/pkg
mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/var_db_pkg /var/db/pkg
ln -s /usr/local/bin/ksh93 /usr/local/bin/ksh
ln -s /mnt/pool1/sup/script/zrep /usr/local/sbin/zrep
Ensuite redémarrer nas4free.

ETAPE 2 : INSTALLATION DE ZREP
Via OBI ou en line de commande ci-après :
Télécharger ici le script:
viewtopic.php?f=71&t=13966&p=86593#p86593

Décompresser le fichier et mettez le tout dans un répertoire persistent sur votre nas (avec les droits 755).

Assurer vous que le fichier zrep-init est exécutable (c est le cas par défaut si tout va bien).

Ensuite lancer le script sur votre nas, comme montré ci-après:

Code: Select all

xigmanas: ~# /mnt/dataouestcopiezrep/zrep-init -s && rehash
 Initializing... 
Extracting ksh93... 
tar: Removing leading '/' from member names 
Done! 
Extracting zrep... 
Done! 
xigmanas: ~# ksh93 --version version sh (AT&T Research) 93u+ 2012-08-01 
xigmanas: ~# zrep version 
zrep 1.7.3 
http://www.bolthole.com/solaris/zrep http://www.github.com/bolthole/zrep
http://www.github.com/bolthole/zrep 
xigmanas: ~# zrep-init -v version
 sh (AT&T Research) 93u+ 2012-08-01 
zrep 1.7.3 
http://www.bolthole.com/solaris/zrep 
http://www.github.com/bolthole/zrep zrep-addon 0.1.2 
xigmanas: ~#
Et c est fini

Dans le menu "System > Advanced > Command Scripts" la ligne suivante est ajoutée en postinit
/mnt/master/extensions/zrep/zrep-init -s

Ce qui confirme l installation.

Comme dit au début, OBI va gérer l installation d ici quelques temps.

Ne pas oublier de faire les mêmes étapes sur le nas2. 8-)

ETAPE 3 : 1er USAGE DE ZREP
Nous allons lancer maintenant la première initialisation (en gros que les 2 nas s'identifient via zrep, et quelles données il faut synchroniser). Tous les datasets ou répertoires, que vous initialiserez, se synchroniseront via une seule commande par la suite : zrep -S all ou zrep sync all

Dans mon cas j'ai initialisé les dataset 'documents', 'videos',... et 'jail' où il y a TheBrig. En tout j'ai 8 datasets d'initialiser. Cela peut être aussi des répertoires selon votre logique d'organisation.

ATTENTION : toutes les données synchronisées vers le nas2 sont en lecture seule. Elles deviennent avec leur status correct quand nas2 devient le serveur maitre (commande takeover/failover cf plus bas).


IMPORTANT : ne jamais initialiser zrep sur des répertoires imbriqués, c'est à dire:
pool/répertoire/ici
et
/pool/répertoire/ici/là


Quelles conséquences ? Je ne sais pas et je ne veux pas savoir (pas fou :mrgreen: ). Cela semble critique sur le site de zrep (section 'Caution', http://www.bolthole.com/solaris/zrep/).

Lançons les initialisations. Retourner dans le terminal (ou putty). Si vous avez fermé le terminal, relancez le et connectez vous en root au nas1 (généralement c'est le serveur maitre qu on sauvegarde :) ). Lancez la commande suivante :

Code: Select all

zrep -i pool1/documents hostnameNAS2 pool1/destinationfs
où vous adaptez la commande avec :
pool1/documents : le chemin de ce que vous voulez sauver/synchroniser
hostnameNAS2 : le hostname du nas2,
pool1 : le pool de destination sur nas2 où 'documents' sera synchronisé. J'ai pool1 aussi car c'est nécessaire pour les jails TheBrig (cf plus bas),
destinationfs : le fs de destination.

Vous obtenez:

Code: Select all

Setting properties on pool1/documents
nas4free: ~ # zrep -i pool1/documents hostnamenas2 pool1/destinationfs
Setting properties on pool1/documments
Ancient local version of ZFS detected.
Creating destination filesystem as separate step
Creating snapshot pool1/dummy2@zrep_000000
Sending initial replication stream to hostnamenas2:pool1/dummy2
Debug: Because you have old zfs support, setting remote properties by hand
Initialization copy of pool1/documents to hostnamenas2:pool1/documments complete
Réitérez la commande zrep -i sur chaque emplacement à synchroniser.

Par la suite, la commande zrep -S all (ou 'zrep sync all') synchronisera tous les données que vous avez initialisé avec zrep -i.

Rappel : les données synchronisées vers nas2 sont en lecture seule sur nas2, tant que nas2 est identifié comme destination par zrep.


ETAPE 4 : KIT DE SURVIE POUR ZREP

Une fois connecté au nas via ssh, en tapant:

Code: Select all

zrep
il s'affiche les commandes possibles. De plus le site internet de zrep (cf plus haut) donne des infos.

Les commandes utiles sont:

Code: Select all

zrep list
Cela donne la liste des datasets synchronisés

Code: Select all

zrep list -v
Cela donne la liste de tous les paramètres zrep pour tous les datasets synchronisés

Code: Select all

zrep status

Cela donne l'état : vous avez les datasets et la dernière date de synchronisation.

Code: Select all

zrep status -v

Cela donne le détail du sens de la synchronisation

Code: Select all

Zfs set zrep:savecount=XXX pool/data
Cela permet de régler le nombre (XXX) de snapshots à garder dans l'historique pour le dataset. A faire sur le nas source puis sur le nas destination. Ces snapshots seront présents dans la vue Disques|ZFS|Instantanés|Instantané du webgui.

Code: Select all

zrep sync -q 300 all
L'option -q permet de faire des pauses si zrep n'a pas fini l'action avant de commencer un autre zrep. C'est en secondes.

Si vous obtenez le message d'erreur suivant:

Code: Select all

Synchronisation de zrep
Failed to acquire global lock
Zrep n'a pas fini ou a mal fini une synchronisation. Un reboot du nas maitre delock les snapshots. J'ai pas trouvé mieux pour le moment.

Si vous obtenez un Warning comme celui-ci:

Code: Select all

Synchronisation de zrep
sending pool1/apple@zrep_000002 to hostnameNAS2:pool1/apple
WARNING: setting zrep:sent failed on hostnameNAS2:pool1/apple@zrep_000002
Using fallback. Go patch your system
Expiring zrep snaps on pool1/apple
Also running expire on hostnameNAS2:pool1/apple now...
Expiring zrep snaps on pool1/apple
Les variables d'environnement n'ont pas été mises dans le script de zrep (cf ETAPE 2).

Si zrep ne veut plus synchroniser et vous signale qu'il faut effectuer 'zrep clear' sur le dataset, voila la procédure à effectuer sur chaque nas:

Code: Select all

zrep clear pool1/dataset
et SEULEMENT SUR LE NAS DE DESTINATION (NAS2)

Code: Select all

zfs destroy pool1/datatset
Si vous souhaitez garder le dataset sur nas2 (au cas où), changer son nom au lieu de le détruire:

Code: Select all

zfs rename pool1/datatset pool1/datatset2
Ensuite relancer zrep -i pool1/dataset hostnamenas2 pool1, puis les zrep sync refonctionneront.

De plus voici le script que j'utilise pour la stratégie un 'zrep sync all' par 24 heures:

Code: Select all

#!/bin/sh
monlog=zrep_versnas2_`date +%Y-%m-%d_%Hh%Mmn`.log
echo "Synchronisation de zrep" >> ./$monlog
/usr/local/sbin/zrep sync -q 600 all >> ./$monlog
PRINTF=/usr/bin/printf
MSMTP=/usr/local/bin/msmtp
MSMTPCONF=/var/etc/msmtp.conf
# change these variables!
FROM="emailàadapter"
TO="emailàadapter"
SUBJECT="Zrep"
BODY="Zrep effectué : compte rendu"
# say you want to send the output of file /root/file.txt
#initial BODY="$(cat /mnt/pool1/sup/script/$monlog)"
BODY="$(cat $PWD/$monlog | sed 's/%/%%/g')"
# send mail
$PRINTF "From:$FROM\nTo:$TO\nSubject:$SUBJECT\n\n$BODY" | $MSMTP --file=$MSMTPCONF -t
mv $PWD/$monlog /mnt/pool1/sup/rsync/
Ceci permet d'avoir l'information détaillé des actions pour chaque dataset, du style

Code: Select all

zrep sync pool1/sup
sending pool1/sup@zrep_000018 to hostnameNAS2:pool1/sup
Expiring zrep snaps on pool1/sup
Also running expire on hostnameNAS2:pool1/sup now...
Expiring zrep snaps on pool1/sup
Un script plus synthétique en résultat sera:

Code: Select all

#!/bin/sh
monlog=zrep_versnas2_`date +%Y-%m-%d_%Hh%Mmn`.log
echo "Synchronisation de zrep" >> ./$monlog
/usr/local/sbin/zrep status >> ./$monlog
PRINTF=/usr/bin/printf
MSMTP=/usr/local/bin/msmtp
MSMTPCONF=/var/etc/msmtp.conf
# change these variables!
FROM="emailàadapter"
TO="emailàadapter"
SUBJECT="Zrep"
BODY="Zrep effectué : compte rendu"
# say you want to send the output of file /root/file.txt
#initial BODY="$(cat /mnt/pool1/sup/script/$monlog)"
BODY="$(cat $PWD/$monlog | sed 's/%/%%/g')"
# send mail
$PRINTF "From:$FROM\nTo:$TO\nSubject:$SUBJECT\n\n$BODY" | $MSMTP --file=$MSMTPCONF -t
mv $PWD/$monlog /mnt/pool1/sup/rsync/
Vous recevrez par email:

Code: Select all

pool1/apple                                    last synced Fri May  8  7:00 2015
pool1/bitorrent                                last synced Fri May  8  7:00 2015
pool1/documents                                last synced Fri May  8  7:00 2015
pool1/videos                                   last synced Fri May  8  7:01 2015
Adapter l'email ('emailàadapter') au votre.

CAS DES JAILS SOUS THEBRIG
A. installer TheBrig sur les 2 serveurs (évident :) ) et il faut que les jails aient la même configuration (ip, type, chemin (donc même nom de pool,...), sauf pour un seul point: pour 'jail start on boot', la case ne doit pas être coché pour nas 2.
Note: dans mon cas TheBrig est dans son propre dataset (jail) sur les 2 nas.
Note importante: Si sur le maitre le chemin d'installation des jails est pool1/mnt/jail/..., il faut impérativement le même nom de chemin sur le nas destination. En effet on va copier-coller nas1 sur nas2, donc tous les postinits, fstab des jails,... seront les mêmes.

Pas la peine d'installer sur NAS2 les services dans les jails (owncloud, plex,...). La synchronisation s'en occupera.

B. Sur le nas2, effacer le dataset contenant TheBrig (dans mon cas 'jail'). Ceci se fait en ligne de commande en vous connectant en root au nas2 via ssh (putty ou terminal) (executez chaque ligne une à une):

Code: Select all

     cd /mnt/pool1/jail
     chflags -R noschg *
     rm -rf *
     cd /
     zfs destroy pool1/jail
Ceci va tuer TheBrig sur nas2, mais ce n'est pas critique. Le plus important est la configuration de TheBrig. La première réplication zrep permettra de récupérer tout TheBrig de nas1 et vous retrouverez tout dans nas2. C'est pourquoi les configurations doivent être identique au niveau des jails (sauf le lancement automatique des jails).
Une fois le dataset de TheBrig effacé sur nas2, ne lancer surtout pas les jails sur nas2.

C. Lancer la synchronisation pour la jail (ou répertoire) de TheBrig (adaptez le chemin avec pool1 à votre cas):

Code: Select all

zrep init pool1/jail hostnamenas2 pool1
D. Ensuite, sur le nas1 (maître):
Tapez la commande:

Code: Select all

zrep failover pool1/jail
Ainsi un zrep status -v montrera sur nas1 (maitre) que le dataset pool1/jail n'est plus présent, et la même commande sur nas2 montre qu'il est présent:

Code: Select all

 zrep status -v
pool1/jail              ->hostnameNAS1:pool1/jail               May  8  8:33 2015
Et le sens de synchronisation est changé. La commande zrep sync all sur le NAS ne fera rien sur le dataset jail, mais fonctionnera si elle est faite sur le nas2 (synchro de nas2 (maitre) vers nas1 pour jail).

Vous pouvez eteindre le nas 1, ou eteindre les jails du nas1.

Il faut aller sur nas2, lancer les jails de TheBrig pour que vous récupériez les services de ces jails, en toute transparence pour les autres ordi. Aujourd'hui c'est manuel, dans un futur proche ou lointain, un script sera là. :mrgreen:

Pour remettre le nas1 en maitre, vous lancez la commande suivante sur le nas2 :
Ne pas oublier d'éteindre les jails sur nas2, auparavant.

Code: Select all

zrep failover pool1/jail
Surtout ne pas avoir mis de données sur nas 1 entre temps sinon nas 2 ne pourra pas envoyé les données en tant que maître.

Note: la commande takeover permet de faire ce type d'action mais cela se fait du nas2 (destination) au lieu du nas1 (source). Les informations sur le site web de zrep (documentation).

Dans mon cas, les jails plex et owncloud fonctionnent à merveille sur nas2 en suivant ce tuto. Par contre il faut activer manuellement les jails de nas2 (je réfléchis pour un script).

Failover permet de mettre en source le nas 2, et ainsi de faire des actions sur le nas1 et les services sont accessibles car le nas2 s'en occupe.

Dans mon cas, cela me permet de maintenir mon service plex et owncloud via le nas destination qui devient maitre, et de faire de la maintenance ou des modifications sur le nas maitre.

IMPORTANT: les commandes takeover et failover nécessite que zrep connaisse bien les sources et destinations. Donc si vous faites failover sur le nas source et que vous l'éteignez pour passer le pool en raidz2, les liens zrep entre source et destination vont être cassés.
Dans ce cas il faut faire ainsi, si on veut passer en raidz2 le serveur 2:
- server 1: ~ #zrep sync all
- éteindre le serveur 1
- passer le serveur 2 en raidz2 (il n'y aura aucune données)
- rallumer le server 1: ~ # zrep -i zpool/zfs server2 zpool
- maintenant ils sont synchronisés.

si il y a des jails, il faudra bien sûr les réinstaller sur le serveur 2 avant de synchroniser et suivre la procédure expliquée plus haut pour les jails.

CONCLUSION

Zrep est simple à installer mais délicat à utiliser. Une fois qu'on a pris ses marques sur des 'dummy' datasets, cela va mieux.
N'hésitez pas à créer ces datasets avec des copies de fichiers quelconques pour vous entrainer. Aucune conséquence sur vos données clés.

Via un script vous pouvez automatiser :
1) les synchronisations (voir plus haut le kit de survie)
2) la détection de problème du nas1 pour basculer automatiquement sur nas 2 (je vais y travailler)
3) peut être le lancement des services nas4free automatiquement après basculement (bittorrent, cifs/smb,...) (ou la, je sais pas encore)

Voila et n'hésitez pas à completer ce tuto.

En tout cas la synchronisation fonctionne et failover/takeover :)
NAS 1&2:
System: GA-6LXGH(BIOS: R01 04/30/2014) / 16 Go ECC
XigmaNAS 12.0.0.4.6766 embedded
NAS1: Xeon E3 1241@3.5GHz, 4HDD@2To/raidz2 (WD red), 3HDD@300Go/sas/raidz1 (Hitachi), 1SSD cache, Zlog on sas mirror
NAS2: G3220@3GHz, 3HDD@2To/raidz1 (Seagate), 1SSD cache, 1HDD@300Go/UFS
UPS: APC Back-UPS RS 900G
Case : Fractal Design XL R2

Extensions & services:
NAS1: OBI (Plex, extendedGUI, BTSync, zrep, rclone), nfs, UPS,
NAS2: OBI (extendedGUI, zrep (backup mode))

Post Reply

Return to “Tuto”