<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Heartbeat on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/heartbeat/</link><description>Recent content in Heartbeat on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Fri, 11 Oct 2019 06:40:55 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/heartbeat/index.xml" rel="self" type="application/rss+xml"/><item><title>Un cluster Proxmox VE avec seulement 2 machines !</title><link>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</link><pubDate>Fri, 11 Oct 2019 06:40:55 +0000</pubDate><guid>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/proxmox.webp" alt="Featured image of post Un cluster Proxmox VE avec seulement 2 machines !" /&gt;&lt;p&gt;Depuis le temps que je vous parle de clusters et de Proxmox (en gros, &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;depuis 2015&lt;/a&gt;), ou même de clusters tout court, j’ai pu vous en mettre des tartines sur le fait qu’il ne faut pas faire des clusters avec un nombre pair de machines (ou tout autre cas défavorable dans lequel deux moitiés d’un cluster peuvent se retrouver isolées l’une de l’autre). Le split brain, c’est pas bon pour votre Karma, croyez moi sur parole (ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=split" &gt;allez voir vous même&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ça me rappelle la fois où un &amp;ldquo;&amp;ldquo;&amp;ldquo;architecte&amp;rdquo;&amp;rdquo;&amp;rdquo; de chez Datacore était venu nous expliquer que sa solution de stockage à 2 pattes ne POUVAIT PAS avoir de split brain (alors que si, les ingés du support ont du repasser par derrière pour nous dire que &amp;ldquo;oui désolé vous avez évidemment raison c’est un cas possible&amp;rdquo; #LOL).&lt;/p&gt;
&lt;p&gt;Bref, et donc à force d’en parler, il fallait bien quand même que je donne un jour la solution pour le faire quand même, mais proprement. Sans trop de surprise, Corosync, la librairie qui gère les clusters Linux depuis qu’on a arrêté de faire des horreurs avec heartbeat (ou pire : &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=redhat&amp;#43;cluster&amp;#43;suite" &gt;cman+rgmanager, achevez moi&lt;/a&gt;), gère évidemment les deux possibilités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gérer soit même le membre prioritaire en cas de split brain avec un poids (ça on va pas en parler mais sachez que c’est possible)&lt;/li&gt;
&lt;li&gt;Ajouter un vote externe pour obtenir un quorum (comme tous les vrais logiciels qui font du clustering un peu sérieux quoi)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="limitations-du-corosync-external-vote-dans-pve"&gt;Limitations du &amp;ldquo;Corosync External Vote&amp;rdquo; dans PVE
&lt;/h2&gt;&lt;p&gt;La petite déception du jour viendra surtout du fait que, si la documentation de Proxmox VE indique clairement que l’option est supportée, en réalité, le support se limite aux fonctions natives de corosync, et encore pas toutes.&lt;/p&gt;
&lt;p&gt;Pas moyen de voir notre vote externe dans l’interface de Proxmox VE par exemple. A priori, le support des quorum disk n’est plus assuré non plus depuis la version 4 de PVE.&lt;/p&gt;
&lt;p&gt;Ensuite, il faut aussi savoir que pour l’instant, seul l’utilisation d’une IP pour renseigner le quorum serveur est possible. On ne peut pas utiliser un FQDN, ce qui me parait dingue comme limitation en 2019, mais bon&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ces deux points mis de côté, vous allez voir, ce n’est pas sorcier. La procédure est en bonne partie détaillée &lt;a class="link" href="https://pve.proxmox.com/wiki/Cluster_Manager#_corosync_external_vote_support" target="_blank" rel="noopener"
&gt;dans la documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour ce tutoriel, vous allez donc avoir besoin de 2 machines (a minima), déjà en cluster. Si vous ne les avez pas déjà, je vous invite à regarder &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;les moults tutoriels précédents&lt;/a&gt;, en particulier celui sur &lt;a class="link" href="https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/" &gt;la mise en place d’un cluster Proxmox VE 6&lt;/a&gt; (le plus récent).&lt;/p&gt;
&lt;p&gt;Vous allez aussi avoir besoin d’un serveur tiers (un bout de VM ou de container quelque part, en dehors de vos 2 (ou tout autres quantité de machines étant localisées dans 2 endroits distincts dont il existe un risque qu’ils puissent subitement &amp;ldquo;ne plus se voir&amp;rdquo;, d’un point de vue réseau, induisant le fameux split brain tant redouté).&lt;/p&gt;
&lt;p&gt;Fun fact, il y a &lt;a class="link" href="https://pve.proxmox.com/wiki/Raspberry_Pi_as_third_node" target="_blank" rel="noopener"
&gt;une page de wiki pour faire la même chose à la main avec un RPi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce serveur tiers n’a pas besoin de faire fonctionner Proxmox (c’est même plutôt mieux d’ailleurs car PVE n’a aucune plus-value ici). Ça doit juste être une distrib linux capable d’installer un démon corosync qnetd. Ce serveur, nous l’appellerons &amp;ldquo;quorum&amp;rdquo;, par abus de langage grossier ;-).&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Sur le serveur quorum, installer corosync qnetd. Sur une Debian like, vous avez de la chance, il existe un package présent dans les dépôts par défaut, et il faut simplement faire un :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qnetd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, sur tous les serveurs Proxmox VE de notre cluster, on va installer le package corosync-qdevice, qui va leur permettre d’interroger le quorum.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur le serveur quorum de nouveau, ajouter la clé SSH d’un des serveurs PVE (un seul suffit). Une fois que c’est fait, connecter le cluster au quorum.&lt;/p&gt;
&lt;p&gt;Cela va sans dire, mais faire la commande depuis le serveur dont on vient d’ajouter la clé, pas l’autre hein ;-p. Et remplacez &lt;QDEVICE-IP&gt; par l’IP du serveur quorum !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm qdevice setup &amp;lt;QDEVICE-IP&amp;gt;
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &amp;#34;/root/.ssh/id_rsa.pub&amp;#34;
The authenticity of host &amp;#39;x.x.x.x&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:LPaaaaaaaaaaaaaaaaaPZjaIg.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je met volontairement une grosse partie de la trace car comme ça on peut parler de ce que fait la commande &lt;em&gt;pvecm qdevice setup x.x.x.x&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, cette commande semble assez similaire à celle pour créer manuellement le cluster. A savoir, elle commence déjà par copier les clés SSH sur le serveur distant, histoire que tout le monde puisse discuter ensemble en SSH.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: initializing qnetd server
Certificate database (/etc/corosync/qnetd/nssdb) already exists. Delete it to initialize new db
INFO: copying CA cert and initializing on all nodes
node &amp;#39;pve01&amp;#39;: Creating /etc/corosync/qdevice/net/nssdb
password file contains no data
node &amp;#39;pve01&amp;#39;: Creating new key and cert db
node &amp;#39;pve01&amp;#39;: Creating new noise file /etc/corosync/qdevice/net/nssdb/noise.txt
node &amp;#39;pve01&amp;#39;: Importing CA
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, on initialise, sur tous les nodes du cluster, le qdevice, qui va permet au node de communiquer avec le quorum. Là j’élude un peu car ça parle beaucoup de certificats et de clés qui sont échangées.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: copy and import pk12 cert to all nodes&amp;lt;br&amp;gt;INFO: add QDevice to cluster configuration
INFO: start and enable corosync qdevice daemon on node &amp;#39;pve01&amp;#39;...
Synchronizing state of corosync-qdevice.service with SysV service script with /lib/systemd/systemd-sysv-install.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, si tout se passe bien, vous devriez en arriver là, une fois que tout le monde s’est bien échangé ses certificats, clés et autres joyeusetés crytographiques.&lt;/p&gt;
&lt;p&gt;Une petite commande pour vérifier l’état du bazar :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Mon Aug 26 14:49:14 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271796
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 3
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000001 1 A,V,NMW 10.0.0.1
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ça, c’est le genre de choses que j’attends d’un logiciel de clustering digne de ce nom. D’une simple commande, on peut avoir&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le nombre de nodes&lt;/li&gt;
&lt;li&gt;l’ID du node courant&lt;/li&gt;
&lt;li&gt;le nombre de votes actuels, attendus, et minimum pour que le cluster soit &amp;ldquo;QUORATE&amp;rdquo;&lt;/li&gt;
&lt;li&gt;et enfin l’état de tout le cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ici, avec 2 nodes + le quorum, on a bien 3 votes. Tant qu’on a 2 votes, on a le quorum, CQFD.&lt;/p&gt;
&lt;p&gt;Dans ce cas de figure, si on perd un nœud OU le quorum, on a toujours 2 votes et le cluster doit continuer à fonctionner &amp;ldquo;normalement&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Et c’est ce qu’on va vérifier !&lt;/p&gt;
&lt;h2 id="on-casse-un-nœud-pour-voir"&gt;On casse un nœud, pour voir
&lt;/h2&gt;&lt;p&gt;Normalement, si on a pas le serveur quorum, tout devrait être brisé (comme dirait Medieval Ops).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_medieval.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En gros les VMs doivent continuer à tourner, mais toute opération (démarrage de VM, modification quelconque) doit être bloquée (pour éviter de démarrer la même VM à 2 endroits et pleurer pour recoller les morceaux).&lt;/p&gt;
&lt;p&gt;Or ici dès que l’hôte n’est plus joignable, le nœud survivant le détecte, et comme le quorum ne voit plus lui non plus qu’un seul nœud, indique au dernier qu’il peut continuer sa vie comme si de rien n’était (c’est glauque&amp;hellip;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Thu Aug 29 11:10:31 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271820
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 2
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le nombre de vote passe bien à 2 (mais comme on est toujours égal à quorum c’est bon) et le node 1 a bien disparu :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/08/pve_down_quorate.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et la petite déception, pas de visualisation en console du vote du quorum, malgré la mention &amp;ldquo;Quorate&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Mais bon, c’est quand même cool que ça marche, et en vrai c’est bien l’essentiel ;)&lt;/p&gt;
&lt;h2 id="bonus--erreur-insserv-fatal-service-corosync-has-to-be-enabled"&gt;Bonus : Erreur insserv: FATAL: service corosync has to be enabled
&lt;/h2&gt;&lt;p&gt;Si vous rencontrez l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;insserv: FATAL: service corosync has to be enabled to use service corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Allez supprimer le fichier d’init SysV corosync sur tous les hôtes&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rm /etc/init.d/corosync-qdevice
systemctl enable corosync-qdevice
systemctl start corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source : &lt;a class="link" href="https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/" target="_blank" rel="noopener"
&gt;https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Tutoriel] Cluster Oracle 11gR2 avec Redhat Cluster Suite sur CentOS 5.4 (offline)</title><link>https://blog.zwindler.fr/2012/04/15/howto-cluster-oracle-11gr2-avec-redhat-cluster-suite-sur-centos-5-4-et-sans-acces-a-internet/</link><pubDate>Sun, 15 Apr 2012 07:54:09 +0000</pubDate><guid>https://blog.zwindler.fr/2012/04/15/howto-cluster-oracle-11gr2-avec-redhat-cluster-suite-sur-centos-5-4-et-sans-acces-a-internet/</guid><description>&lt;img src="https://blog.zwindler.fr/2014/03/lbvm1.webp" alt="Featured image of post [Tutoriel] Cluster Oracle 11gR2 avec Redhat Cluster Suite sur CentOS 5.4 (offline)" /&gt;&lt;p&gt;J’avais pour objectif de proposer une architecture sous Redhat permettant d’héberger en clustering une base de données Oracle en mode actif/passif (sans RAC donc) pour un nouveau client. L’architecture actuelle/connue était à base de serveurs HP-UX fonctionnant avec un cluster HP MCSG qui fonctionnait très bien, mais pour des raisons de support sur l’ERP le passage à Linux était obligatoire.&lt;/p&gt;
&lt;p&gt;MCSG sur Redhat n’étant pas encore (est ce que ça va changer?) supporté officiellement par Redhat et HP, et heartbeat étant une solution trop légère pour ce genre d’application critique au business, il a bien fallut que je fasse une maquette basée sur Redhat Cluster suite. Le faible nombre de blogs traitant du sujet et le nombre d’échecs parmi les rares articles que j’ai trouvés auraient du me mettre la puce à l’oreille quant à la difficulté d’installation/configuration de ce produit. Et pour cause : malgré une documentation officielle relativement bien faite, certains passages sont carrément obscur pour ceux qui rentrent dans le sujet sans expérience préalable des clusters.&lt;/p&gt;
&lt;p&gt;Ayant galérer pour faire marcher la solution dans les grandes lignes, je pense qu’il est de mon devoir (oui oui, rien que ça :-p) de faire partager la documentation que j’ai tiré de mes diverses expérimentations :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;La documentation en elle même &lt;a class="link" href="https://blog.zwindler.fr/2012/04/zwindler_redhat_cluster_suite.pdf" &gt;zwindler_redhat_cluster_suite&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Le fichier doc qui contient les &lt;a class="link" href="https://blog.zwindler.fr/2012/04/scripts.docx" &gt;scripts&lt;/a&gt;. Oui, c’est affreux mais wordpress n’autorise en upload que quelques extensions et je n’ai pas l’envie de chercher une solution de contournement&amp;hellip;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Autre chose : au début, je pensais qu’être coupé d’Internet sur les serveurs d’un admin n’était pas monnaie courante. Avec le peu de recul que j’ai aujourd’hui, je me rend compte que je subis très régulièrement cette contrainte! Ayant été obligé de me passer du net sur ma maquette, j’ai aussi indiqué les solutions de contournement que j’ai trouvé dans la documentation, au cas où certains seraient dans la même configuration.&lt;/p&gt;
&lt;p&gt;Cependant, dans tous les cas, je ne conseille pas l’utilisation de RHCS sur une prod &lt;strong&gt;si vous débutez et/ou si vous n’avez pas d’accès à Internet&lt;/strong&gt; pour effectuer des mises à jours du système : &lt;strong&gt;les bugs de cette version ainsi que les erreurs de débutant que j’ai pu faire sur ma maquette auraient assez vite corrompu la base de données d’une production&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;N’hésitez pas à me faire remonter toute imperfection dans la documentation, que je puisse corriger pour les suivants&lt;/p&gt;</description></item></channel></rss>