Mise en Haute-Disponibilité avec RSF-1 ZFS
Introduction
RSF-1 ZFS est disponible pour FreeBSD, Debian (et d'autres Linux), OmniOSce ...
Sa licence pour une utilisation domestique est de l'ordre de 200€, beaucoup plus pour du commercial.
Il ne fonctionne qu'avec 2 serveurs. Son but est de mettre en place une haute disponibilité avec réplication des données périodique.
But
Monter 2 serveurs (s1 et s2) en un cluster de stockage avec réplication des données automatique entre les serveurs à l'intervalle voulu.
Il faut également pouvoir gérer le nombre maximal de snapshots accumulés.
Nous allons :
- Installer 2 serveurs FreeBSD 14.0 avec 3 supports de stockage par serveur (1 de 10G pour le système, 2 de 30G chacun pour le stockage)
- leur permettre de se contacter via SSH par clefs,
- installer RSF-1 ZFS sur les 2 serveurs
- Initialiser RSF-1 ZFS depuis la console web RSF de s1
- Créer le cluster HA-Cluster depuis la console web RSF de s1, en incluant s1 et s2 au cluster
- activer les heartbeats encryptés
- Créer le pool ZFS en miroir nommé 'SFTP' depuis la console web RSF de s1
- Créer le pool ZFS en miroir nommé 'SFTP' depuis la console web RSF de s2
- Mise en cluster du pool ZFS 'SFTP'
Pré-requis
- 2 serveurs FreeBSD 14.0 (attention, RSF n'est pas encore compatible avec la 14.1) avec 4G de RAM, connectés à un même réseau local (pour commencer)
- sX : 1 support de stockage système (10G) , 2 supports de stockage (pour les données) de taille identique (30G pour l'essai).
- les 2 supports de stockage pour les données seront montés en raidz miroir directement depuis la console web de RSF-1 ZFS
Préparation des serveurs
Installer les serveurs, faire les MAJ sur chacun.
Se loguer en root puis faire les MAJ :
pkg ins -y ; pkg update
Repérer l'adresse IP de chaque serveur :
ifconfig
Sur chaque noeud, y compris sur l'ordinateur hôte pour faciliter la gestion (notamment si les noeuds sont des VMs), ajouter les correspondances nom-IP dans le fichier /etc/hosts :
192.168.0.47 s1
192.168.0.48 s2
Préparation des connexions SSH entre serveurs par clef
Sur s1 et s2 : dans le fichier /etc/ssh/sshd_config, autoriser la connexion au compte root comme ceci :
PermitRootLogin yes
Relancer ssh :
service sshd restart
Sur s1, créer la paire de clefs SSH en étant root
Se loguer en tant que root puis :
ssh-keygen -t ed25519
(ne pas créer de passphrase !!)
Envoyer la clef publique à l'autre serveur (exemple ici depuis s1) :
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@s2
Initier une première connexion de test depuis s1 vers s2
ssh root@s2
exit
Refaire la manip depuis s2 (et envoyer la publique à s1)
Installer RSF-1 ZFS sur chaque serveur
Télécharger le soft sur chaque serveur directement :
fetch https://packages2.high-availability.com/offline-packages/rsf-1-offline-latest-freebsd140.pkg -o /tmp
Installer le logiciel :
pkg install -y /tmp/rsf-1-offline-latest-freebsd140.pkg
Redémarrer le serveur (impératif) :
reboot
Configuration de RSF-1 depuis la console web
Depuis un ordinateur client (ou depuis votre hôte), se connecter à l'interface web de s1
https://s1:8330
Créer l'utilisateur administrateur :
- majekla
- Nom Réel
- Mot de passe
(Il n'y a pas besoin de faire cette manip (créer cet utilisateur administrateur de la console web RSF) sur le noeud s2. Lorsque le cluster des 2 noeuds sera créé depuis la console web RSF de s1, l'utilisateur administrateur deviendra automatiquement celui de s2 aussi.)
Création du cluster
Une fois authentifié sur la console web de RSF sur s1, cliquer sur Create/Destroy cluster
- Choisir 'Shared-nothing' surtout car il s'agît de stockages distincts (chaque serveur a son propre stockage pour les données. Il ne s'agît pas d'un stockage mutualisé entre chaque serveur)
- Logiquement, les 2 noeuds apparaissent dans la section 'Node Selection' puisque nous avons correctement renseigné le fichier /etc/hosts de chaque noeud
- Il faut entrer le numéros de licence des 2 noeuds puis créer le cluster.
Activer les heartbeats encryptés
Il est fondamental d'effectuer cette opération AVANT la mise en ligne d'un service de clustering !! Galère assurée autrement.
Aller dans le menu 'Settings', 'General', 'Encrypted Heartbeats' sur 'on'. Sauvegardez le changement puis retourner dans le Dashboard pour démarrer le service.
Création des pools ZFS
Une fois le cluster créé, il nous faut créer le service de stockage.
Nous allons donc créer les pools sur s1 et s2, composés de nos 2 supports de stockage sur chaque serveur prévus à cet effet.
Note importante sur l'encryption
RSF ne permet pas, à ce jour, la création de pools et de datasets encryptés. C'est une énorme lacune du logiciel à mon sens !! (même si son objectif premier, rappelons-le, c'est la Haute Disponibilité.. pas la création des pool et datasets)
Les besoins en sécurité de ce type aujourd'hui sont fondamentaux, et cela m'a beaucoup interrogé lorsque j'ai testé ce logiciel. Il faut implémenter cette solution ! Impérativement.
Il est néanmoins tout à fait possible de réaliser les 2 étapes suivantes (création du pool et des datasets) directement en ligne de commande sur chaque serveur afin de créer ces pools encryptés puis de mettre en cluster le pool créé, c'est même la meilleure option.
Néanmoins, c'est toujours la même consigne : même nom de pool, et mêmes noms pour les datasets sur chaque serveur. Les caractéristiques doivent être rigoureusement identiques !!
Il faudra néanmoins bien réfléchir aux conséquences de l'encryption du pool et/ou des datasets lors d'un crash. Je n'ai pas pu tester cette caractéristique avec RSF, mais il est connu que les pool et datasets ZFS encryptés posent des problèmes plus particuliers lors des send/receive !
Je ferai d'ailleurs un article à ce sujet car ça n'a rien d'évident.
Création du pool sur s1
Toujours depuis la console web RSF de s1, Aller dans le menu ZFS, +Create.
- Nommer le pool 'SFTP', prendre le mode 'mirror' et choisir les 2 disques (pas le premier car c'est généralement c'est celui du système)
- Sélectionnez les disques en tant que DATA puis créer le pool ZFS.
Création du pool sur s2
Il faut à présent créer le second pool ZFS 'SFTP' (sur s2).
Se connecter à la console web RSF de s2, et faire la même manip pour créer le pool.
Attention, le nom du pool doit être IDENTIQUE (SFTP ici), le mode de pool (mirror) aussi, le type (DATA) aussi.
Une fois ce second pool créé, le pool SFTP devient soudainement 'CLUSTERABLE' en bleu. (depuis la console web RSF de s1, rafraîchissez la page web pour la console de s1 et la ligne qui était rouge devient bleue !)
(Vous pouvez fermer la console de s2, on en a plus besoin. On va faire le reste sur la console de s1)
Mise en cluster du pool ZFS 'SFTP'
Sur la console web RSF de s1, aller dans le menu 'Volumes' puis cliquer sur Actions (notre pool SFTP apparaît en bleu), 'Cluster this pool'.
Choisir le noeud préféré (s1), si vous ajoutez une VIP, attention à ne pas la nommer avec des majuscules !!! Elle ne fonctionnera pas autrement et vous allez tout faire foirer !!!! Donnez-lui un nom en minuscule et plutôt court.
Une fois créé, le pool ZFS 'SFTP' va démarrer sur chaque noeud puis afficher 'Running on s1'.
Création des datasets sur le cluster de pools
Aller dans le menu ZFS, Datasets, Cliquer sur 'CREATE DATASET'
Remplissez les champs. (Par exemple, vous pourriez dédier un dataset à un utilisateur et donc le nommer comme le nom de l'utilisateur...). Prenons USER1 par exemple
- Mountpoint path : /SFTP/USER1
- Activer la compression ('on')
Configuration des intervalles de snapshots
Par défaut, elle est fixée à 15min pour le noeud actif. C'est souvent suffisant, inutile de le descendre d'avantage. Pour changer ce réglage, aller dans 'Settings', 'Shared Nothing'.
Vous pouvez également régler le nombre de snapshots à conserver (ce qui peut être pratique si vous avez besoin de restaurer à une date précise).
Attention aux pare-feux !
Ouvrir les ports :
- 1195 (TCP & UDP)
- 4330 (TCP)
- 4331 (TCP)
- 8330 (TCP)
Comment faire pour updater dynamiquement le nom de domaine si l'un des serveurs tombe ?
Plusieurs solutions :
- Utiliser uptimerobot par exemple, qui permet de déclencher un webhook en cas de soucis (on peut alors tricher et placer l'IP de l'API de no-ip pour modifier instantanément l'enregistrement AAAA)
- Ecrire un simple script qui teste la connexion SSH entre les serveurs. Dès qu'elle n'est plus disponible, on exécute l'API de No-IP (c'est une simple URL à taper).
... ce sont les solutions pas chères ça ! Mais ça fonctionne.
Sinon, il y a la grosse artillerie avec AWS & co !
↑ Haut de page