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
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
Code: Select all
~nas4free/mnt/pool1: ./mnt/pool1/deletesnapIl 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/localCode: 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
Ensuite, toujours dans le même terminal:
Code: Select all
pkg install -R ksh93Code: Select all
pkg install -R perl5makewhatis: 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
rehashCode: Select all
ln -s /usr/local/bin/ksh93 /usr/local/bin/kshCode: Select all
umount -f \<above\>\:/mnt/pool1/sup/opt/usr_localCode: Select all
umount -f \<above\>\:/mnt/pool1/sup/opt/var_db_pkgPuis
Code: Select all
mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/usr_local /usr/localCode: Select all
mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/var_db_pkg /var/db/pkgCode: Select all
cd /mnt/pool1/sup/script
fetch http://www.bolthole.com/solaris/zrep/zrep
chmod 755 zrep
chown root:wheel zrepCode: Select all
ln -s /mnt/pool1/sup/script/zrep /usr/local/sbin/zrepCode: Select all
nano zrep#!/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=/rootEnsuite 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/localCode: Select all
mkdir -p /var/db/pkgCode: Select all
mount_unionfs -o noatime -o below /mnt/pool1/sup/opt/var_db_pkg /var/db/pkgCode: Select all
ln -s /usr/local/bin/ksh93 /usr/local/bin/kshCode: Select all
ln -s /mnt/pool1/sup/script/zrep /usr/local/sbin/zrepNe pas oublier de faire les mêmes étapes sur le nas2.
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
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
Code: Select all
zrep -i pool1/documents hostnameNAS2 pool1pool1/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
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
zrepLes commandes utiles sont:
Code: Select all
zrep listCode: Select all
zrep list -vCode: Select all
zrep statusCela donne l'état : vous avez les datasets et la dernière date de synchronisation.
Code: Select all
zrep status -vCela donne le détail du sens de la synchronisation
Code: Select all
Zfs set zrep:savecount=XXX pool/dataCode: Select all
zrep sync -q 300 allSi vous obtenez le message d'erreur suivant:
Code: Select all
Synchronisation de zrep
Failed to acquire global lockSi 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/appleSi 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/datasetCode: Select all
zfs destroy pool1/datatsetCode: Select all
zfs rename pool1/datatset pool1/datatset2De 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/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/supCode: 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/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 2015CAS DES JAILS SOUS THEBRIG
A. installer TheBrig sur les 2 serveurs (évident
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/jailUne 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 pool1Tapez la commande:
Code: Select all
zrep failover pool1/jailCode: Select all
zrep status -v
pool1/jail ->hostnameNAS1:pool1/jail May 8 8:33 2015
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à.
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/jailNote: 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'.
