High Availability setup

Introduction

Ce guide présente les étapes nécessaires pour configurer une bascule automatique de service OpenSVC en utilisant OpenHA pour heartbeat. OpenHA est notre daemon heartbeat de référence car il tourne sur tous les systèmes Unix, propose plusieurs chemins de heartbeat réseau multicast ou SCSI, et implémente un système de déclencheurs souple.

Bonnes pratiques pour l'infrastructure de heartbeat :

  • Try to use more than 2 heartbeat links
  • Try to mix heartbeat drivers
  • Ne pas utiliser deux fois le même réseau

  • Ne pas utiliser des réseaux partageant un SPOF

  • De préférence, configurer un heartbeat sur un LAN dédié

Installation

OpenSVC

Ce guide se concentre sur l'ajout de la configuration HA à un service OpenSVC existant. Vous pouvez vous référer à :

En plus des instructions ci-dessus, les services gérés par un automate cluster doivent :

  • Declare a heartbeat resource in the env file: (Refer to <OSVCDOC>/template.env for detailled syntax information).
[hb#1]
type = OpenHA
name = svc1

Avertissement

Les noms de service OpenHA sont limités à 15 caractères et les noms des noeuds sont limités à 127 caractères.

  • Create an additional symlink in <OSVCETC>:
cd /etc/opensvc && ln -s ../bin/svcmgr svc1.cluster

Open-HA

Download open-ha from here. The default location of all this program's files is /usr/local/cluster. Before using any open-ha commands, you have to setup some environment variables:

# export EZ=/usr/local/cluster
# . /usr/local/cluster/env.sh

Configuration

Lister les noeuds du cluster

In file /usr/local/cluster/conf/nodes:

node108
node109

Note

  • No trailing spaces.
  • One node per line.
  • All members of this cluster must be listed.

Lister les chemins de heartbeat

OpenHA supported heartbeat types are :

  • IP Multicast (net)
  • IP Unicast (unicast)
  • Disk (dio)
  • Raw device (raw)

Heartbeats types can be mixed in the same OpenHA configuration

To setup 3 multicast heartbeats, in file /usr/local/cluster/conf/monitor:

node108  net  eth1  239.131.50.10    1780  60
node108  dio  /dev/mapper/3600512341234123412341234  0  60
node108  unicast  eth0  192.168.0.109    1700  60
node109  net  eth1  239.131.50.10    1781  60
node109  dio  /dev/mapper/3600512341234123412341234  16  60
node109  unicast  eth0  192.168.0.108    1700  60

net heartbeart parameters:

  • param#1: nom d'hôte du noeud

  • param#2: type de heartbeat

  • param#3: ip multicast

  • param#4: numéro de port

  • param#5: heartbeat timeout

unicast heartbeart parameters:

  • param#1: nom d'hôte du noeud

  • param#2: type de heartbeat

  • param#3: remote ip address
  • param#4: numéro de port

  • param#5: heartbeat timeout

dio or disk heartbeart parameters:

  • param#1: nom d'hôte du noeud

  • param#2: type de heartbeat

  • param#3: device path (block for dio, raw for raw)
  • param#4: offset of the exchanged data, in blocks
  • param#5: heartbeat timeout

With this setup :

  • the heartd process on node108 will send heartbeat data through eth1 on multicast IP 239.131.50.10 port 1780
  • the heartd_dio process on node108 will write heartbeat data on /dev/mapper/3600512341234123412341234 at offset 0
  • the heartd_unicast process on node108 will send heartbeat data through eth0 on unicast IP 192.168.0.109 port 1700
  • the heartc process on node108 will listen for heartbeat data received on eth1 on multicast IP 239.131.50.10 port 1781, with a 60 seconds timeout
  • the heartc_dio process on node108 will listen read heartbeat data on /dev/mapper/3600512341234123412341234 at offset 16, with a 60 seconds timeout
  • the heartc_unicast process on node108 will listen for heartbeat data received on eth0 on unicast IP 192.168.0.108 port 1700, with a 60 seconds timeout

Note

  • Each heartbeat end-point has a unique port number.
  • Each heartbeat path has a unique multicast IP.
  • The monitor file can be copied as-is to the other, except when Solaris IPMP is active (more listeners than senders in this case).

Ajouter des services

Without STONITH:

$EZ_BIN/service -a svc1 /etc/opensvc/svc_name.cluster node108 node109 /bin/true

With STONITH:

$EZ_BIN/service -a svc1 /etc/opensvc/svc_name.cluster node108 node109 /etc/opensvc/svc_name.stonith

Où :

  • '-a': ajouter un service open-ha

  • param#1: service name, align to OpenSVC is not required, advised anyway (15 characters maximum)
  • param#2: OpenSVC service start/stop script
  • param#3: primary node
  • param#4: secondary node
  • param#5: pre-launch checkup script
  • this script is executed before starting the service. If its return code is anything else than 0, the service startup is aborted. It is often used to trigger the STONITH

Démarrage

Make sure the heartbeat daemons are setup for startup at boot. If not, depending on your system, apply some commands similar to:

ln -s /usr/local/cluster/ezha /etc/rc3.d/S99cluster
ln -s /usr/local/cluster/ezha /etc/rc0.d/K01cluster
ln -s /usr/local/cluster/ezha /etc/rcS.d/K01cluster

Then run:

/usr/local/cluster/ezha.init start

Daemons

Le démarrage du lanceur ezha va lancer les daemons suivants :

nmond

transitionne l'état et déclenche le daemon initiateur

heartc

daemon de réception des paquets multicast, un par chemin de heartbeat multicast

heartd

daemon d'émission des paquets multicast, un par chemin de heartbeat multicast

Utilisez

Interrogation

Display the service cluster status:

# /usr/local/cluster/bin/service -s
service       owned_by  nodeA        nodeB
svc1          nodeB     FROZEN_STOP  STARTED
svc2          nodeA     STARTED      STOPPED"

Etats du service

Etat

Description
STOPPED

la dernière tentative d'arrêt du service s'est terminée en succès.

STARTED

la dernière tentative de démarrage du service s'est terminée en succès.

STOP_FAILED

la dernière tentative d'arrêt du service a renvoyé une erreur. open-ha empêche toute nouvelle commande sur le service.

START_FAILED

la dernière tentative de démarrage du service a renvoyé une erreur. open-ha empêche toute nouvelle commande sur le service.

STOPPING

la dernière tentative d'arrêt du service est toujours en cours d'exécution.

STARTING

la dernière tentative de démarrage du service est toujours en cours d'exécution.

START_READY

le noeud est prêt à reprendre le service.

FROZEN_STOP

état atteint à la suite d'une commande open-ha 'freeze-stop'. open-ha empêche de passer des commandes sur le service par la suite.

FROZEN_START

état atteint après avec gelé un service open-ha en état STOPPED. open-ha empêche de passer des commandes sur le service par la suite.

Déclenchement d'une bascule

When a service is handled to any heartbeat daemon, you must not use stop/start OpenSVC commands to drive this service: the heartbeat daemon being in charge, you must use its command set only.

On the node where the service is RUNNING:

# /usr/local/cluster/bin/service -A mysvc freeze-stop
# /usr/local/cluster/bin/service -A mysvc unfreeze

Surveillance des ressources

La surveillance des ressources peut être configurée pour déclencher la bascule du service lors d'une panne d'une des ressources : en d'autres termes, un TOC, acronyme de Transfer Of Control. Typiquement, les ressources surveillées sont les ip utilisées par les clients et les systèmes de fichier.

Marquer les ressources pour la surveillance

A subset of the service's resources can be flagged for monitoring through:

[res#1]
monitor = True

[res#2]
monitor_on = nodes

Action monitor

L'action de service resource_monitor déclencle DEFAULT.monitor_action dans les conditions suivantes :

  • le service possède une ressource heartbeat

  • ET la ressource heartbeat remonte un état up

  • ET une ou plusieurs ressources surveillées remontent un état non up

DEFAULT.monitor_action peut prendre les valeurs suivantes :

Action Description
freezestop

Indique au heartbeat OpenHA de stopper le service et de passer son état à FROZEN_STOP

reboot

Reboot rapide du noeud

crash

Crasher le noeud

Stonith

Le mécanisme de stonith est utilisé pour arbitrer les situations de schizophrénie du cluster, où les noeuds ne se voient plus et qu'ils ne peuvent déterminer si ils peuvent s'approprier le service en toute sécurité. Dans un telle situation, un noeud va couper le courrant de son pair pour être sûr que lui seul aura la responsabilité du service.

Le mécanisme de stonith est déclenché en exécutant etc/svcname.stonith. OpenHA peut être configuré pour déclencher un stonith en déclarant etc/svcname.stonith en tant que check-up script.

L'action stonith retourne 1 pour annuler la bascule, 0 sinon.

Les méthodes de stonith sont implémentés sous forme de ressources.

Pilote de stonith Ilo

In service configuration file:

[stonith#1]
type = ilo
target@node1 = node2-ilo
target@node2 = node1-ilo

The Ilo stonith driver uses key-based ssh authentication. The specific key can be pointed by the following configuration in etc/auth.conf:

[node1-ilo]
username = opensvc
key = /home/opensvc/.ssh/id_dsa

[node2-ilo]
username = opensvc
key = /home/opensvc/.ssh/id_dsa

Note

  • Some Ilo firmware versions refuse rsa authentication. To be on the safe side, use dsa keys.
  • You may also be required to remove or change the key's comment to match the ILo login username.