MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Hochverfügbarkeit der Datenbank für Camunda BPM mit MySQL oder MariaDB Galera Cluster

Camunda BPM ist eine Open-Source-Workflow- und Entscheidungsautomatisierungsplattform. Camunda BPM wird mit Tools zum Erstellen von Workflow- und Entscheidungsmodellen, zum Betreiben bereitgestellter Modelle in der Produktion und zum Ermöglichen der Ausführung von ihnen zugewiesenen Workflow-Aufgaben durch Benutzer geliefert.

Standardmäßig wird Camunda mit einer eingebetteten Datenbank namens H2 geliefert, die in einer Java-Umgebung mit relativ geringem Speicherbedarf ziemlich anständig funktioniert. Wenn es jedoch um Skalierung und Hochverfügbarkeit geht, gibt es andere Datenbank-Backends, die möglicherweise besser geeignet sind.

In diesem Blogbeitrag werden wir die Camunda BPM 7.10 Community Edition unter Linux bereitstellen, wobei der Schwerpunkt auf der Erzielung einer hohen Datenbankverfügbarkeit liegt. Camunda unterstützt die wichtigsten Datenbanken über JDBC-Treiber, nämlich Oracle, DB2, MySQL, MariaDB und PostgreSQL. Dieser Blog konzentriert sich nur auf MySQL und MariaDB Galera Cluster mit jeweils unterschiedlicher Implementierung - eine mit ProxySQL als Datenbank-Load-Balancer und die andere mit dem JDBC-Treiber, um eine Verbindung zu mehreren Datenbankinstanzen herzustellen. Beachten Sie, dass dieser Artikel die Hochverfügbarkeit der Camunda-Anwendung selbst nicht behandelt.

Voraussetzung

Camunda BPM läuft auf Java. In unserer CentOS 7-Box müssen wir JDK installieren, und die beste Option ist, das von Oracle zu verwenden und die Verwendung der im Repository bereitgestellten OpenJDK-Pakete zu überspringen. Laden Sie auf dem Anwendungsserver, auf dem Camunda ausgeführt werden soll, das neueste Java SE Development Kit (JDK) von Oracle herunter, indem Sie das Akzeptanz-Cookie senden:

$ wget --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/12+33/312335d836a34c7c8bba9d963e26dc23/jdk-12_linux-x64_bin.rpm

Installieren Sie es auf dem Host:

$ yum localinstall jdk-12_linux-x64_bin.rpm

Bestätigen Sie mit:

$ java --version
java 12 2019-03-19
Java(TM) SE Runtime Environment (build 12+33)
Java HotSpot(TM) 64-Bit Server VM (build 12+33, mixed mode, sharing)

Erstellen Sie ein neues Verzeichnis und laden Sie die Camunda Community für Apache Tomcat von der offiziellen Download-Seite herunter:

$ mkdir ~/camunda
$ cd ~/camunda
$ wget --content-disposition 'https://camunda.org/release/camunda-bpm/tomcat/7.10/camunda-bpm-tomcat-7.10.0.tar.gz'

Extrahieren Sie es:

$ tar -xzf camunda-bpm-tomcat-7.10.0.tar.gz

Es gibt eine Reihe von Abhängigkeiten, die wir konfigurieren müssen, bevor wir die Camunda-Webanwendung starten. Dies hängt von der gewählten Datenbankplattform wie Datastore-Konfiguration, Datenbank-Connector und CLASSPATH-Umgebung ab. In den nächsten Abschnitten werden die erforderlichen Schritte für MySQL Galera (unter Verwendung von Percona XtraDB Cluster) und MariaDB Galera Cluster erläutert.

Beachten Sie, dass die in diesem Blog gezeigten Konfigurationen auf der Apache Tomcat-Umgebung basieren. Wenn Sie JBOSS oder Wildfly verwenden, ist die Datenspeicherkonfiguration etwas anders. Einzelheiten finden Sie in der Camunda-Dokumentation.

MySQL Galera Cluster (mit ProxySQL und Keepalived)

Wir werden ClusterControl verwenden, um MySQL-basierte Galera-Cluster mit Percona XtraDB Cluster bereitzustellen. Es gibt einige Einschränkungen im Zusammenhang mit Galera, die in den Camunda-Dokumenten bezüglich der Behandlung von Galera-Konflikten mit mehreren Autoren und der InnoDB-Isolationsstufe erwähnt werden. Falls Sie davon betroffen sind, ist es am sichersten, den Single-Writer-Ansatz zu verwenden, der mit der ProxySQL-Hostgruppenkonfiguration erreichbar ist. Um keinen Single-Point-of-Failure bereitzustellen, werden wir zwei ProxySQL-Instanzen bereitstellen und sie mit einer virtuellen IP-Adresse von Keepalived verknüpfen.

Das folgende Diagramm veranschaulicht unsere endgültige Architektur:

Stellen Sie zunächst einen Percona XtraDB Cluster 5.7 mit drei Knoten bereit. Installieren Sie ClusterControl, generieren Sie einen SSH-Schlüssel und richten Sie passwortloses SSH vom ClusterControl-Host zu allen Knoten (einschließlich ProxySQL) ein. Führen Sie auf dem ClusterControl-Knoten Folgendes aus:

$ whoami
root
$ ssh-keygen -t rsa
$ for i in 192.168.0.21 192.168.0.22 192.168.0.23 192.168.0.11 192.168.0.12; do ssh-copy-id $i; done

Bevor wir unseren Cluster bereitstellen, müssen wir die MySQL-Konfigurationsvorlagendatei ändern, die ClusterControl bei der Installation von MySQL-Servern verwendet. Der Name der Vorlagendatei lautet my57.cnf.galera und befindet sich unter /usr/share/cmon/templates/ auf dem ClusterControl-Host. Stellen Sie sicher, dass die folgenden Zeilen im Abschnitt [mysqld] vorhanden sind:

[mysqld]
...
transaction-isolation=READ-COMMITTED
wsrep_sync_wait=7
...

Speichern Sie die Datei und wir können loslegen. Die oben genannten Anforderungen sind in den Camunda-Dokumenten angegeben, insbesondere in Bezug auf die unterstützte Transaktionsisolierung für Galera. Die Variable wsrep_sync_wait wird auf 7 gesetzt, um clusterweite Kausalitätsprüfungen für READ- (einschließlich SELECT-, SHOW- und BEGIN- oder START TRANSACTION-), UPDATE-, DELETE-, INSERT- und REPLACE-Anweisungen durchzuführen und sicherzustellen, dass die Anweisung auf einem vollständig synchronisierten Knoten ausgeführt wird. Denken Sie daran, dass ein anderer Wert als 0 zu einer erhöhten Latenz führen kann.

Gehen Sie zu ClusterControl -> Bereitstellen -> MySQL Galera und geben Sie die folgenden Details an (falls nicht erwähnt, verwenden Sie den Standardwert):

  • SSH-Benutzer:root
  • SSH-Schlüsselpfad:/root/.ssh/id_rsa
  • Clustername:Percona XtraDB Cluster 5.7
  • Verkäufer:Percona
  • Version:5.7
  • Administrator-/Root-Passwort:{Geben Sie ein Passwort an}
  • Knoten hinzufügen:192.168.0.21 (drücken Sie die Eingabetaste), 192.168.0.22 (drücken Sie die Eingabetaste), 192.168.0.23 (drücken Sie die Eingabetaste)

Stellen Sie sicher, dass Sie alle grünen Häkchen haben, was anzeigt, dass ClusterControl sich passwortlos mit dem Knoten verbinden kann. Klicken Sie auf „Bereitstellen“, um die Bereitstellung zu starten.

Erstellen Sie die Datenbank, den MySQL-Benutzer und das Passwort auf einem der Datenbankknoten:

mysql> CREATE DATABASE camunda;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON camunda.* TO [email protected]'%';

Oder Sie können von der ClusterControl-Oberfläche aus Verwalten -> Schema und Benutzer verwenden stattdessen:

Sobald der Cluster bereitgestellt ist, installieren Sie ProxySQL, indem Sie zu ClusterControl -> Manage -> Load Balancer -> ProxySQL -> Deploy ProxySQL gehen und geben Sie die folgenden Details ein:

  • Serveradresse:192.168.0.11
  • Admin-Passwort:
  • Monitor-Passwort:
  • DB-Benutzer:camunda
  • DB-Passwort:passw0rd
  • Verwenden Sie implizite Transaktionen?:Ja

Wiederholen Sie den ProxySQL-Bereitstellungsschritt für die zweite ProxySQL-Instanz, indem Sie die Serveradresse ändern Wert auf 192.168.0.12. Die von Keepalived bereitgestellte virtuelle IP-Adresse erfordert mindestens zwei bereitgestellte und ausgeführte ProxySQL-Instanzen. Stellen Sie schließlich die virtuelle IP-Adresse bereit, indem Sie zu ClusterControl -> Manage -> Load Balancer -> Keepalived gehen und wählen Sie beide ProxySQL-Knoten aus und geben Sie die virtuelle IP-Adresse und die Netzwerkschnittstelle an, die der VIP überwachen soll:

Unser Datenbank-Backend ist nun vollständig. Als nächstes importieren Sie die SQL-Dateien als erstellter MySQL-Benutzer in den Galera-Cluster. Wechseln Sie auf dem Anwendungsserver in das Verzeichnis „sql“ und importieren Sie sie in einen der Galera-Knoten (wir wählen 192.168.0.21):

$ cd ~/camunda/sql/create
$ yum install mysql #install mysql client
$ mysql -ucamunda -p -h192.168.0.21 camunda < mysql_engine_7.10.0.sql
$ mysql -ucamunda -p -h192.168.0.21 camunda < mysql_identity_7.10.0.sql

Camunda bietet keinen MySQL-Connector für Java, da seine Standarddatenbank H2 ist. Laden Sie auf dem Anwendungsserver MySQL Connector/J von der MySQL-Downloadseite herunter und kopieren Sie die JAR-Datei in das bin-Verzeichnis von Apache Tomcat:

$ wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.15.tar.gz
$ tar -xzf mysql-connector-java-8.0.15.tar.gz
$ cd mysql-connector-java-8.0.15
$ cp mysql-connector-java-8.0.15.jar ~/camunda/server/apache-tomcat-9.0.12/bin/

Legen Sie dann die Umgebungsvariable CLASSPATH so fest, dass sie den Datenbankconnector enthält. Öffnen Sie setenv.sh mit dem Texteditor:

$ vim ~/camunda/server/apache-tomcat-9.0.12/bin/setenv.sh

Und fügen Sie die folgende Zeile hinzu:

export CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/mysql-connector-java-8.0.15.jar

Öffnen Sie ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml und ändern Sie die Zeilen, die sich auf den Datenspeicher beziehen. Geben Sie die virtuelle IP-Adresse als MySQL-Host in der Verbindungszeichenfolge an, mit ProxySQL-Port 6033:

<Resource name="jdbc/ProcessEngine"
              ...
              driverClassName="com.mysql.jdbc.Driver" 
              defaultTransactionIsolation="READ_COMMITTED"
              url="jdbc:mysql://192.168.0.10:6033/camunda"
              username="camunda"  
              password="passw0rd"
              ...
/>

Schließlich können wir den Camunda-Dienst starten, indem wir start-camunda.sh ausführen Skript:

$ cd ~/camunda
$ ./start-camunda.sh
starting camunda BPM platform on Tomcat Application Server
Using CATALINA_BASE:   ./server/apache-tomcat-9.0.12
Using CATALINA_HOME:   ./server/apache-tomcat-9.0.12
Using CATALINA_TMPDIR: ./server/apache-tomcat-9.0.12/temp
Using JRE_HOME:        /
Using CLASSPATH:       :./server/apache-tomcat-9.0.12/bin/mysql-connector-java-8.0.15.jar:./server/apache-tomcat-9.0.12/bin/bootstrap.jar:./server/apache-tomcat-9.0.12/bin/tomcat-juli.jar
Tomcat started.

Stellen Sie sicher, dass der in der Ausgabe angezeigte CLASSPATH den Pfad zur MySQL Connector/J JAR-Datei enthält. Nachdem die Initialisierung abgeschlossen ist, können Sie auf die Camunda-Webapps auf Port 8080 unter http://192.168.0.8:8080/camunda/ zugreifen . Der Standard-Benutzername ist demo mit dem Passwort „demo“:

Sie können dann die verdauten Capture-Abfragen von Nodes -> ProxySQL -> Top Queries sehen , was darauf hinweist, dass die Anwendung korrekt mit dem Galera-Cluster interagiert:

Für ProxySQL ist keine Lese-Schreib-Aufteilung konfiguriert. Camunda verwendet "SET autocommit=0" bei jeder SQL-Anweisung, um die Transaktion zu initialisieren, und der beste Weg für ProxySQL, dies zu handhaben, indem alle Abfragen an dieselben Backend-Server der Ziel-Hostgruppe gesendet werden. Dies ist neben der besseren Verfügbarkeit die sicherste Methode. Es kann jedoch vorkommen, dass alle Verbindungen einen einzigen Server erreichen, sodass kein Lastenausgleich stattfindet.

MariaDB Galera

MariaDB Connector/J ist in der Lage, eine Vielzahl von Verbindungsmodi zu handhaben – Failover, sequenziell, Replikation und Aurora – aber Camunda unterstützt nur Failover und sequenziell. Entnommen aus der MariaDB Connector/J-Dokumentation:

Modus Beschreibung
sequenziell
(verfügbar seit 1.3.0)
Dieser Modus unterstützt Verbindungs-Failover in einer Multi-Master-Umgebung, wie z. B. MariaDB Galera Cluster. Dieser Modus unterstützt keine Lastausgleichs-Lesevorgänge auf Slaves. Der Connector versucht, eine Verbindung zu Hosts in der Reihenfolge herzustellen, in der sie in der Verbindungs-URL angegeben wurden, sodass der erste verfügbare Host für alle Abfragen verwendet wird. Nehmen wir beispielsweise an, dass die Verbindungs-URL die folgende ist:
jdbc:mariadb:sequential:host1,host2,host3/testdb
Wenn der Connector versucht, eine Verbindung herzustellen, versucht er immer zuerst host1. Wenn dieser Host nicht verfügbar ist, wird es mit host2 versucht. usw. Wenn ein Host ausfällt, versucht der Connector, sich in derselben Reihenfolge wieder mit den Hosts zu verbinden.
Failover
(verfügbar seit 1.2.0)
Dieser Modus unterstützt Verbindungs-Failover in einer Multi-Master-Umgebung, wie z. B. MariaDB Galera Cluster. Dieser Modus unterstützt keine Lastausgleichs-Lesevorgänge auf Slaves. Der Konnektor führt einen Lastenausgleich für alle Abfragen durch, indem er zufällig einen Host aus der Verbindungs-URL für jede Verbindung auswählt, sodass Abfragen einen Lastenausgleich erhalten, da die Verbindungen zufällig auf alle Hosts verteilt werden.

Die Verwendung des „Failover“-Modus birgt ein höheres potenzielles Deadlock-Risiko, da Schreibvorgänge fast gleichmäßig auf alle Back-End-Server verteilt werden. Der Single-Writer-Ansatz ist eine sichere Ausführungsmethode, was bedeutet, dass die Verwendung des sequentiellen Modus die Aufgabe ziemlich gut erfüllen sollte. Sie können auch die Load-Balancer-Ebene in der Architektur überspringen. Daher können wir mit dem MariaDB Java Connector unsere Architektur so einfach wie folgt bereitstellen:

Bevor wir unseren Cluster bereitstellen, ändern Sie die MariaDB-Konfigurationsvorlagendatei, die ClusterControl bei der Installation von MariaDB-Servern verwendet. Der Name der Vorlagendatei lautet my.cnf.galera und befindet sich unter /usr/share/cmon/templates/ auf dem ClusterControl-Host. Stellen Sie sicher, dass die folgenden Zeilen im Abschnitt [mysqld] vorhanden sind:

[mysqld]
...
transaction-isolation=READ-COMMITTED
wsrep_sync_wait=7
performance_schema = ON
...

Speichern Sie die Datei und wir können loslegen. Eine kleine Erklärung, die obige Liste sind die Anforderungen, die in den Camunda-Dokumenten angegeben sind, insbesondere in Bezug auf die unterstützte Transaktionsisolation für Galera. Die Variable wsrep_sync_wait wird auf 7 gesetzt, um clusterweite Kausalitätsprüfungen für READ- (einschließlich SELECT-, SHOW- und BEGIN- oder START TRANSACTION-), UPDATE-, DELETE-, INSERT- und REPLACE-Anweisungen durchzuführen und sicherzustellen, dass die Anweisung auf einem vollständig synchronisierten Knoten ausgeführt wird. Beachten Sie, dass ein anderer Wert als 0 zu einer erhöhten Latenz führen kann. Das Aktivieren des Leistungsschemas ist für die ClusterControl-Abfrageüberwachungsfunktion optional.

Jetzt können wir den Clusterbereitstellungsprozess starten. Installieren Sie ClusterControl, generieren Sie einen SSH-Schlüssel und richten Sie passwortloses SSH vom ClusterControl-Host zu allen Galera-Knoten ein. Führen Sie auf dem ClusterControl-Knoten Folgendes aus:

$ whoami
root
$ ssh-keygen -t rsa
$ for i in 192.168.0.41 192.168.0.42 192.168.0.43; do ssh-copy-id $i; done

Gehen Sie zu ClusterControl -> Bereitstellen -> MySQL Galera und geben Sie die folgenden Details an (falls nicht erwähnt, verwenden Sie den Standardwert):

  • SSH-Benutzer:root
  • SSH-Schlüsselpfad:/root/.ssh/id_rsa
  • Clustername:MariaDB Galera 10.3
  • Anbieter:MariaDB
  • Version:10.3
  • Administrator-/Root-Passwort:{Geben Sie ein Passwort an}
  • Knoten hinzufügen:192.168.0.41 (drücken Sie die Eingabetaste), 192.168.0.42 (drücken Sie die Eingabetaste), 192.168.0.43 (drücken Sie die Eingabetaste)

Stellen Sie sicher, dass Sie beim Hinzufügen von Knoten alle grünen Häkchen haben, die anzeigen, dass ClusterControl sich passwortlos mit dem Knoten verbinden kann. Klicken Sie auf „Bereitstellen“, um die Bereitstellung zu starten.

Erstellen Sie die Datenbank, den MariaDB-Benutzer und das Passwort auf einem der Galera-Knoten:

mysql> CREATE DATABASE camunda;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON camunda.* TO [email protected]'%';

Für ClusterControl-Benutzer können Sie ClusterControl -> Manage -> Schema and Users verwenden stattdessen:

Unsere Datenbank-Cluster-Bereitstellung ist jetzt abgeschlossen. Importieren Sie als Nächstes die SQL-Dateien in den MariaDB-Cluster. Wechseln Sie auf dem Anwendungsserver in das Verzeichnis „sql“ und importieren Sie sie in einen der MariaDB-Knoten (wir haben 192.168.0.41 gewählt):

$ cd ~/camunda/sql/create
$ yum install mysql #install mariadb client
$ mysql -ucamunda -p -h192.168.0.41 camunda < mariadb_engine_7.10.0.sql
$ mysql -ucamunda -p -h192.168.0.41 camunda < mariadb_identity_7.10.0.sql

Camunda stellt keinen MariaDB-Konnektor für Java bereit, da seine Standarddatenbank H2 ist. Laden Sie auf dem Anwendungsserver MariaDB Connector/J von der MariaDB-Downloadseite herunter und kopieren Sie die JAR-Datei in das Bin-Verzeichnis von Apache Tomcat:

$ wget https://downloads.mariadb.com/Connectors/java/connector-java-2.4.1/mariadb-java-client-2.4.1.jar
$ cp mariadb-java-client-2.4.1.jar ~/camunda/server/apache-tomcat-9.0.12/bin/

Legen Sie dann die Umgebungsvariable CLASSPATH so fest, dass sie den Datenbankconnector enthält. setenv.sh über Texteditor öffnen:

$ vim ~/camunda/server/apache-tomcat-9.0.12/bin/setenv.sh

Und fügen Sie die folgende Zeile hinzu:

export CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/mariadb-java-client-2.4.1.jar

Öffnen Sie ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml und ändern Sie die Zeilen, die sich auf den Datenspeicher beziehen. Verwenden Sie das sequentielle Verbindungsprotokoll und listen Sie alle Galera-Knoten durch Kommas getrennt in der Verbindungszeichenfolge auf:

<Resource name="jdbc/ProcessEngine"
              ...
              driverClassName="org.mariadb.jdbc.Driver" 
              defaultTransactionIsolation="READ_COMMITTED"
              url="jdbc:mariadb:sequential://192.168.0.41:3306,192.168.0.42:3306,192.168.0.43:3306/camunda"
              username="camunda"  
              password="passw0rd"
              ...
/>

Schließlich können wir den Camunda-Dienst starten, indem wir start-camunda.sh ausführen Skript:

$ cd ~/camunda
$ ./start-camunda.sh
starting camunda BPM platform on Tomcat Application Server
Using CATALINA_BASE:   ./server/apache-tomcat-9.0.12
Using CATALINA_HOME:   ./server/apache-tomcat-9.0.12
Using CATALINA_TMPDIR: ./server/apache-tomcat-9.0.12/temp
Using JRE_HOME:        /
Using CLASSPATH:       :./server/apache-tomcat-9.0.12/bin/mariadb-java-client-2.4.1.jar:./server/apache-tomcat-9.0.12/bin/bootstrap.jar:./server/apache-tomcat-9.0.12/bin/tomcat-juli.jar
Tomcat started.

Stellen Sie sicher, dass der in der Ausgabe angezeigte CLASSPATH den Pfad zur JAR-Datei des MariaDB-Java-Clients enthält. Nachdem die Initialisierung abgeschlossen ist, können Sie auf die Camunda-Webapps auf Port 8080 unter http://192.168.0.8:8080/camunda/ zugreifen . Der Standardbenutzername ist demo mit dem Passwort 'demo':

Sie können die verdauten Capture-Abfragen unter ClusterControl -> Query Monitor -> Top Queries sehen , was darauf hinweist, dass die Anwendung korrekt mit dem MariaDB-Cluster interagiert:

Mit MariaDB Connector/J benötigen wir keine Load-Balancer-Ebene, was unsere Gesamtarchitektur vereinfacht. Der sequentielle Verbindungsmodus sollte ausreichen, um Multi-Writer-Deadlocks zu vermeiden - was bei Galera passieren kann. Dieses Setup bietet Hochverfügbarkeit mit jeder Camunda-Instanz, die mit JDBC konfiguriert ist, um auf den Cluster von MySQL- oder MariaDB-Knoten zuzugreifen. Galera kümmert sich um die Synchronisation der Daten zwischen den Datenbankinstanzen in Echtzeit.