This is the old XigmaNAS forum in read only mode,
it will taken offline by the end of march 2021!



I like to aks Users and Admins to rewrite/take over important post from here into the new fresh main forum!
Its not possible for us to export from here and import it to the main forum!

[Obsolète] Zrep : synchroniser, failover, takeover

Moderators: velivole18, ernie, mtiburs

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

[Obsolète] Zrep : synchroniser, failover, takeover

Post by ernie »

Ce tuto est obsolète. Zrep s'installe sans mountunion, mountunion pouvant poser problème.

C'est ici : viewtopic.php?f=94&t=13974

Voici le tutoriel pour installer zrep sur vos nas. Attention il s'agit de zrep version 1.2 (valable aussi pour les suivantes).

Merci à karlandtanya qui est à l'origine de l'implémentation de zrep sur nas4free et à toutes les réponses qu il a apporté à mes questions depuis 3 semaines.

Pour toutes questions, merci d'utiliser le post suivant: http://forums.nas4free.org/viewtopic.ph ... 074#p52074

Le tuto original est ici : http://forums.nas4free.org/viewtopic.ph ... 071#p52071
Note: le tuto original peut évoluer plus vite que cette version française, d'où des différences à l'instant t.

De plus 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.

Configuration que j'ai testée:
NAS1:
Nayla-1391
x64-embedded on G3220@3GHz
MB: GIGABYTE GA-6LXGH (BIOS: R01 04/30/2014)
3 HDD @ 2To (raidz1), 1 HDD @ 2 To (spare), 1 SSD cache, 1 HDD@1To (UFS, USB)
16 Go ECC
UPS: APC Back-UPS RS 900G
TheBrig : owncloud 8.0.2 and Plex 0.9.12.0
Extensions : phpVirtualBox 4.3-2, RRDG, eGUI, BTSync,
Services : Bittorrent, UPS

NAS2:
Nayla-1391
x64-embedded on G3220 3GHz
MB: as master NAS
3 HDD @ 2To (raidz1),1 SSD cache, 1 HDD@1To (UFS)
16 Go ECC
UPS: APC Back-UPS RS 900G
Extensions : RRDG, eGUI
Services : Rsync


ETAPE 1 : PREALABLE


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 : http://forums.nas4free.org/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).

ETAPE 2 : INSTALLATION DE ZREP

Il faut installer les packages sur un endroit persistent. Dans mon cas, pool1/sup pour le nas1 (maitre) et pool1/gestion pour le nas2 (backup). 'sup' et 'gestion' sont dans mon cas des datasets. Via le webgui vous devez donc créer un répertoire ou un dataset pour y installer ensuite zrep.
Note: le nom du pool est identique sur les 2 nas car c'est clé pour les jails the brig. Voir plus loin.

L'installation qui suit permet de faire les mises à jours de nas4free sans affecter zrep.

En ligne de commande via le terminal (ou putty) (connecter en root au nas), on va créer une structure dans 'sup' (je ne parle par la suite que de l'installation sur nas1, que vous devrez faire aussi sur votre nas2). Faites une à une les commandes suivantes (adaptez le chemin avec pool1 à votre cas) :

Code: Select all

mkdir -p /mnt/pool1/sup/opt
mkdir -p /mnt/pool1/sup/opt/usr_local
mount_unionfs /mnt/pool1/sup/opt/usr_local /usr/local
puis

Code: Select all

mkdir -p /mnt/pool1/sup/opt/var_db_pkg
mkdir -p /var/db/pkg
mount_unionfs /mnt/pool1/sup/opt/var_db_pkg /var/db/pkg
La 2eme commande est bien la création du répertoire db/pkg dans le répertoire var de nas4free.

Ensuite, toujours dans le même terminal:

Code: Select all

pkg install -R ksh93
puis

Code: Select all

pkg install -R perl5
Vous aurez surement à la fin de l'installation de perl5, le message suivant:
makewhatis: not found
makewhatis: not found
pkg: POST-INSTALL script failed

Ce n'est pas critique et vous pouvez continuer.

Vous executez toujours dans le terminal la commande suivante:

Code: Select all

rehash
Ensuite on fait un lien symbolique pour ksh (pour que nas4free trouve le ksh qu'on vient d'installer):

Code: Select all

ln -s /usr/local/bin/ksh93 /usr/local/bin/ksh
Ensuite on va faire une partie très importante. On va monter au dessus d'un autre montage de données : du surmontage quoi :). A la fin du tuto je reprends une vulgarisation de karlandtanya pour l'expliquer.

Code: Select all

umount -f \<above\>\:/mnt/pool1/sup/opt/usr_local
puis

Code: Select all

umount -f \<above\>\:/mnt/pool1/sup/opt/var_db_pkg
Tapez bien correctement ces lignes telles quelles (avec les \ et les < et > et : et above,...). C'est clé.

Puis

Code: Select all

mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/usr_local /usr/local
et

Code: Select all

mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/var_db_pkg /var/db/pkg
On récupère le script de zrep (toujours dans le terminal). Dans mon cas j'ai un répertoire 'script' dans le dataset 'sup' (j'ai déjà d'autres scripts), le tout c'est que cela soit un endroit persistent (executez chaque ligne une à une):

Code: Select all

cd /mnt/pool1/sup/script
fetch http://www.bolthole.com/solaris/zrep/zrep
chmod 755 zrep
chown root:wheel zrep
On fait un lien symbolique (adaptez le chemin avec pool1 à votre cas):

Code: Select all

ln -s /mnt/pool1/sup/script/zrep /usr/local/sbin/zrep
On modifie le script de zrep pour qu'il trouve bien ksh:

Code: Select all

nano zrep
Il faut changer la première ligne :
#!/bin/ksh -p
par:

Code: Select all

#!/usr/local/bin/ksh -p
SHELL=/bin/tcsh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin
HOME=/root
Note: Ceci est très important et m'a valu beaucoup d'échanges et de tests avec karlandtanya. En effet les variables d'environnement sont présentes dans le script des premières versions de zrep. Donc le cron programmé marchera sans soucis. Avec les nouvelles versions de zrep (notamment 1.2 et la dernière), elles ont été enlevées : résultat = le cron programmé ne marche pas correctement.

Ensuite on passe au webgui pour ajouter des lignes dans Système/Avancé/Scripts de commande. Il s'agit de commandes en postinit pour qu'en cas de reboot zrep fonctionne (adaptez le chemin avec pool1 à votre cas):

Code: Select all

mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/usr_local /usr/local
et

Code: Select all

mkdir -p /var/db/pkg
et

Code: Select all

mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/var_db_pkg /var/db/pkg
et

Code: Select all

ln -s /usr/local/bin/ksh93 /usr/local/bin/ksh
et enfin

Code: Select all

ln -s /mnt/pool1/sup/script/zrep /usr/local/sbin/zrep
Voila c'est fait. Si il y a un bug ou que vous voulez désinstaller, enlevez ces lignes de commande postinit, redémarrez le nas et supprimez les répertoires. :roll:

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
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).

Vous obtenez:

Code: Select all

Setting properties on pool1/documents
nas4free: ~ # zrep -i pool1/documents hostnamenas2 pool1
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 :)

Explication du 'surmontage'
Imaginez un empilement de pièces transparentes où il y a des informations écrites.
Vous pouvez voir tout de la première couche à la dernière. Mais si vous écrivez sur la première couche, cela peut cacher les informations des couches inférieures.
Et dans notre cas on ne peut écrire que sur la première.
Donc on monte en premier un FS persistent avec la fonction 'above'.
Après, on remonte avec:
mount_unionfs -o noatime -o below
Ainsi, N4F peut fonctionner normalement. En effet la couche supérieure est en mémoire, donc au reboot elle disparait. Et la couche inférieure est persistente: c'est celle qui à les packages ksh et pearl, avec 'above'.
NAS 1&2:
System: GA-6LXGH(BIOS: R01 04/30/2014) / 16 Go ECC
XigmaNAS 12.1.0.4 - Ingva (revision 7743) embedded
NAS1: Xeon E3 1241@3.5GHz, 2HDD@8To/mirror, 1SSD cache, Zlog on mirror, 1 UFS 300 Go
NAS2: G3220@3GHz, 2x3HDD@2To/strip+raidz1, 1SSD cache, Zlog on mirror
UPS: APC Back-UPS RS 900G
Case : Fractal Design XL R2

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

Locked

Return to “Tuto”