openHAB2 HACluster mit Pacemaker und Corosync

Rainer Rainer Follow Dec 03, 2017 · 6 mins read
openHAB2 HACluster mit Pacemaker und Corosync
Share this

Um die Verfügbarkeit von openHAB2 sicherzustellen wollte ich ein redundantes System mit Hilfe von Pacemaker und Corosync aufzubauen.
Dazu werden mindestens 2 Linux Systeme benötigt auf denen openHAB2 lauffähig ist. Von Vorteil ist eine möglichst identische Hardware, da so weniger Fallstricke bei der Konfiguration vorhanden sind. Falls dies nicht möglich ist sollte darauf geachtet werden, dass die gleichen Versionen von Pacemaker und Corosync verwendet werden.

Die eingesetzte Hardware ist ein Rapberry Pi 3 und ein Odroid C1+ . Beide besitzen einen ARMv7 mit 32Bit.

Als Linux Distribution wird DietPi verwendet, diese besitzt wenig Overhead und ist recht komfortabel zu konfigurieren. DietPi basiert auf Debian 8 (Jessie).

Alle folgende Anleitungen müssen, sofern nicht anders beschrieben, auf beiden SBCs durchgeführt werden. Die Nodes werden openhab21 (192.168.178.171) und openhab22 (192.168.178.172) sein.

Linux Setup

Auf der DietPi Seite kann die passende Distribution herunter geladen werden. Danach die heruntergeladene Datei entpacken und z.B. mit dem Win32 Disk Imager auf eine microSD Karte schreiben. Diese kann dann in den Raspi oder Odroid gesteckt werden. Die SBCs mit der Stromversorgung und dem Netzwerk verbinden und warten… Wie meistens dauert das erste Booten etwas länger. Der SSH Server startet gleich mit, d.h. man kann sich unter Windows direkt mit PuTTY oder unter MacOS/Linux mit dem Terminal einloggen.

openHAB2 Installation

Nachdem das erste Booten und ein evtl. Neustart vorüber sind kann mit der openHAB2 Installation begonnen werden. Vorbereitend für openHAB2 muss Java installiert werden. Dazu kann man nach folgender Anleitung vorgehen: http://www.webupd8.org/2014/03/how-to-install-oracle-java-8-in-debian.html

Für die openHAB2 Installation verwende ich die Debian Pakete (http://docs.openhab.org/installation/linux.html).

Mit folgenden Linux Befehle kann Java 8 und openHAB2 installiert werden:

echo "deb <a href="http://ppa.launchpad.net/webupd8team/java/ubuntu">http://ppa.launchpad.net/webupd8team/java/ubuntu</a> xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.listecho "deb-src <a href="http://ppa.launchpad.net/webupd8team/java/ubuntu">http://ppa.launchpad.net/webupd8team/java/ubuntu</a> xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
echo 'deb <a href="http://dl.bintray.com/openhab/apt-repo2">http://dl.bintray.com/openhab/apt-repo2</a> testing main' | sudo tee /etc/apt/sources.list.d/openhab2.list
apt-get update
apt-get install oracle-java8-installer
apt-get install openhab2

Danach ist openHAB2 unter <RechnerIP:8080> zu erreichen.

Pacemaker und Corosync Installation

Für die Installation von Pacemaker und Corosync wird die jessie-backports Quelle benötigt. Falls die noch nicht in /etc/apt/sources.list eingetragen ist, dann folgende Zeile hinzufügen:

deb http://ftp.debian.org/debian/ jessie-backports main contrib non-free

Danach mit:

apt-get update
apt-get -t jessie-backports install pacemaker crmsh

Pacemaker und die CRM Shell installieren. Corosync wird bei der Pacemaker Installation mit installiert.

Corosync Konfiguration

Cluster Authorization Key

Damit sich die Nodes des Clusters verbinden können müssen alle einen identischen Schlüssel besitzen. Dieser wird mit

corosync-keygen

auf einem der Cluster Nodes erzeugt und z.B. mit

scp root@openhab21:/etc/corosync/authkey /etc/corosync/

auf den 2. Server kopiert.

corosync.conf

totem {
        version: 2
        cluster_name: openhab2
        transport: udpu

        interface {
                ringnumber: 0
                bindnetaddr: 192.168.178.170
                mcastport: 5405
                broadcast: yes
        }
}

logging {
  to_logfile: yes
  logfile: /var/log/corosync/corosync.log
  to_syslog: yes
  timestamp: on
}

quorum {
  provider: corosync_votequorum
  two_node: 1
}

nodelist {
  node {
    ring0_addr: 192.168.178.171
    name: openhab21
    nodeid: 1
  }
  node {
    ring0_addr: 192.168.178.172
    name: openhab22
    nodeid: 2
  }
}

Wenn die Konfiguration auf beiden Rechnern durchgeführt wurde kann mit

crm status

überprüft werden ob der Cluster funktioniert.
Falls die Ausgabe wie folgt aussieht haben sich die Nodes erfolgreich verbunden:

root@openhab22:~# crm status
Stack: corosync
Current DC: openhab22 (version 1.1.15-e174ec8) - partition with quorum
Last updated: Sun Apr 16 22:43:57 2017 Last change: Sun Apr 16 21:39:41 2017 by root via cibadmin on openhab21
2 nodes and 0 resources configured
Online: [ openhab21 openhab22 ]

Pacemaker Konfiguration

Um Pacemaker die Kontrolle über dem openHAB2 Service zu geben mit

systemctl disable openhab2.service

der Autostart von openHAB2 deaktiviert werden.

Da hier ein Cluster mit nur 2 Nodes beschrieben wird sollten noch folgende Eigenschaften angepasst werden:

crm configure property stonith-enabled=false
crm configure property no-quorum-policy=ignore

Pacemaker soll nun so konfiguriert werden, dass der Cluster unter der IP 192.168.178.170 erreichbar ist. Der Knoten openhab21 soll priorisiert sein, d.h. wenn dieser aktiv ist soll openHAB2 auf diesem laufen und unter der genannten IP Adresse erreichbar sein.

Zuerst wird dafür eine sogenannte primitive cluster resource, die dafür sorgt, dass der aktive Node unter der Cluster IP erreichbar ist.
Dies wird mit folgendem Befehl erreicht:

crm configure primitive failover_ip ocf:heartbeat:IPaddr2 params ip="192.168.178.170" cidr_netmask="24" op monitor interval="3s"

failover_ip ist die Bezeichnung der Ressource
ocf:heartbeat:IPaddr2 ist der OCF Resource Agent
ip die IP Adresse unter der der Cluster erreichbar sein soll
cidr_netmask ist die Subnetmask (255.255.255.0)
monitor intervals definiert den Zeitabstand des Checks

Mit

crm configure show

kann die Konfiguration angezeigt werden. Diese sollte dann wie folgt aussehen:

root@openhab21:~# crm configure show
node 1: openhab21
node 2: openhab22
primitive failover_ip IPaddr2 \
params ip=192.168.178.170 cidr_netmask=24 \
op monitor interval= \
meta target-role=Started
property cib-bootstrap-options: \
have-watchdog=false \
dc-version=1.1.15-e174ec8 \
cluster-infrastructure=corosync \
cluster-name=debian \
stonith-enabled=false \
no-quorum-policy=ignore

Im folgenden habe ich noch die notwendigen Konfigurationen mit kurzen Erklärungen aufgelistet die nötig sind, damit die Übernahme und IP Zuweisung funktioniert.

Der folgende Befehl definiert die Ressource failover_openhab2, diese das init-Script /etc/init.d/openhab2 steuert/überwacht. op monitor interval=15s definiert einen „operation monitor“ mit einem Intervall von 15s. op start timeout=“40s“ definiert, dass der openhab2-Prozess 40s Zeit zum starten hat, nachdem das init-Script ausgeführt wurde. op stop timeout=“60s“ definiert die Zeit nach welcher der der stop-Befehl als fehlgeschlagen definiert ist.

crm configure primitive failover_openhab2 lsb::openhab2 op monitor interval=15s op start timeout="40s" op stop timeout="60s"

Definition der Gruppe „OPENHAB2-GROUP“, so werden die beiden Ressourcen failover_ip und failover_openhab2 verknüpft:

crm configure group OPENHAB2-GROUP failover_ip failover_openhab2

Mit dem folgenden Kommando wird die Reihenfolge definiert, wie die Ressourcen gestartet werden, d.h. die IP-Adresse (failover_ip) sollte vor dem Starten von openHAB2 (failover_openhab2) gesetzt werden.

crm configure order IP_before_openhab2 inf: failover_ip failover_openhab2:start

Außerdem muss noch mit dem Kommando:

crm configure colocation IP-with-openhab2 inf: failover_ip failover_openhab2

definiert werden, dass die failover_ip Ressource nur auf dem node mit aktiver failover_openhab2 Ressource laufen soll.

Zuletzt sagen wir Pacemaker noch, dass die Gruppe OPENHAB2-GROUP bevozugt auf dem Node openhab21 laufen soll:

crm configure location OPENHAB2-GROUP-prefer-openhab21 OPENHAB2-GROUP 50: openhab21

Update openHAB2

In meinem Setup hatte ich immer wieder Probleme, wenn ich openHAB2 mit dem Paketmanger aktualisiert habe. Das habe ich gelöst indem ich Pacemaker in den Wartungsmodus geschaltet habe:

crm configure property maintenance-mode=true
systemctl disable openhab2.service

deaktivieren.

Wenn das update vorbei ist, daran denken den Wartungsmodus auch wieder zu deaktivieren:

crm configure property maintenance-mode=false

Das Ganze habe ich bei mir noch nicht automatisiert.

So, jetzt hoffe ich, dass ich es geschafft habe die ganzen Ausführungen verständlich rüber zu bringen. Ich habe für das zusammentragen der ganzen Kommandos eine Weile benötigt und hoffe, dass es einigen die Arbeit etwas erleichtert.
Falls es Hinweise oder Fragen gibt, freue ich mich über einen Kommentar.

Quellen:

http://docs.openhab.org/installation/linux.html
https://www.digitalocean.com/community/tutorials/how-to-create-a-high-availability-setup-with-corosync-pacemaker-and-floating-ips-on-ubuntu-14-04
https://geekpeek.net/linux-cluster-resources/

Rainer
Written by Rainer Follow