sql >> Database >  >> RDS >> MariaDB

Database hoge beschikbaarheid voor Camunda BPM met MySQL of MariaDB Galera Cluster

Camunda BPM is een open-source platform voor workflow- en beslissingsautomatisering. Camunda BPM wordt geleverd met tools voor het creëren van workflow- en beslissingsmodellen, het bedienen van ingezette modellen in productie en om gebruikers in staat te stellen workflowtaken uit te voeren die aan hen zijn toegewezen.

Camunda wordt standaard geleverd met een ingesloten database genaamd H2, die redelijk goed werkt in een Java-omgeving met een relatief kleine geheugenvoetafdruk. Als het echter gaat om schalen en hoge beschikbaarheid, zijn er andere database-backends die wellicht meer geschikt zijn.

In deze blogpost gaan we Camunda BPM 7.10 Community Edition op Linux implementeren, met een focus op het bereiken van hoge beschikbaarheid van databases. Camunda ondersteunt grote databases via JDBC-stuurprogramma's, namelijk Oracle, DB2, MySQL, MariaDB en PostgreSQL. Deze blog richt zich alleen op MySQL en MariaDB Galera Cluster, met voor elk een andere implementatie - de ene met ProxySQL als load balancer voor de database en de andere met het JDBC-stuurprogramma om verbinding te maken met meerdere database-instanties. Houd er rekening mee dat dit artikel geen betrekking heeft op hoge beschikbaarheid voor de Camunda-applicatie zelf.

Vereiste

Camunda BPM draait op Java. In onze CentOS 7-box moeten we JDK installeren en de beste optie is om die van Oracle te gebruiken en het gebruik van de OpenJDK-pakketten in de repository over te slaan. Download op de applicatieserver waar Camunda moet draaien de nieuwste Java SE Development Kit (JDK) van Oracle door de acceptatiecookie te verzenden:

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

Installeer het op de host:

$ yum localinstall jdk-12_linux-x64_bin.rpm

Verifieer met:

$ 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)

Maak een nieuwe map en download Camunda Community voor Apache Tomcat van de officiële downloadpagina:

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

Pak het uit:

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

Er zijn een aantal afhankelijkheden die we moeten configureren voordat we de Camunda-webtoepassing opstarten. Dit is afhankelijk van het gekozen database platform zoals datastore configuratie, database connector en CLASSPATH omgeving. In de volgende secties worden de vereiste stappen uitgelegd voor MySQL Galera (met Percona XtraDB Cluster) en MariaDB Galera Cluster.

Merk op dat de configuraties die in deze blog worden getoond, gebaseerd zijn op de Apache Tomcat-omgeving. Als u JBOSS of Wildfly gebruikt, zal de configuratie van de datastore iets anders zijn. Raadpleeg de Camunda-documentatie voor details.

MySQL Galera-cluster (met ProxySQL en Keepalive)

We zullen ClusterControl gebruiken om op MySQL gebaseerde Galera-cluster te implementeren met Percona XtraDB Cluster. Er worden enkele Galera-gerelateerde beperkingen genoemd in de Camunda-documenten over Galera multi-writer-conflictafhandeling en InnoDB-isolatieniveau. Als u hier last van heeft, is de veiligste manier om de single-writer-benadering te gebruiken, die haalbaar is met ProxySQL-hostgroepconfiguratie. Om geen enkel storingspunt te bieden, zullen we twee ProxySQL-instanties implementeren en deze door Keepalive koppelen aan een virtueel IP-adres.

Het volgende diagram illustreert onze uiteindelijke architectuur:

Implementeer eerst een Percona XtraDB Cluster 5.7 met drie knooppunten. Installeer ClusterControl, genereer een SSH-sleutel en stel wachtwoordloze SSH in van de ClusterControl-host naar alle knooppunten (inclusief ProxySQL). Doe op het ClusterControl-knooppunt:

$ 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

Voordat we ons cluster implementeren, moeten we het MySQL-configuratiesjabloonbestand wijzigen dat ClusterControl zal gebruiken bij het installeren van MySQL-servers. De naam van het sjabloonbestand is my57.cnf.galera en bevindt zich onder /usr/share/cmon/templates/ op de ClusterControl-host. Zorg ervoor dat de volgende regels bestaan ​​in de sectie [mysqld]:

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

Sla het bestand op en we zijn klaar om te gaan. Het bovenstaande zijn de vereisten zoals vermeld in Camunda-documenten, met name over de ondersteunde transactie-isolatie voor Galera. Variabele wsrep_sync_wait is ingesteld op 7 om clusterbrede causaliteitscontroles uit te voeren voor READ (inclusief SELECT, SHOW en BEGIN of START TRANSACTION), UPDATE-, DELETE-, INSERT- en REPLACE-instructies, zodat de instructie wordt uitgevoerd op een volledig gesynchroniseerd knooppunt. Houd er rekening mee dat een andere waarde dan 0 kan leiden tot een langere latentie.

Ga naar ClusterControl -> Deploy -> MySQL Galera en specificeer de volgende details (indien niet vermeld, gebruik de standaardwaarde):

  • SSH-gebruiker:root
  • SSH-sleutelpad:/root/.ssh/id_rsa
  • Clusternaam:Percona XtraDB-cluster 5.7
  • Verkoper:Percona
  • Versie:5.7
  • Beheerder/rootwachtwoord:{specificeer een wachtwoord}
  • Node toevoegen:192.168.0.21 (druk op Enter), 192.168.0.22 (druk op Enter), 192.168.0.23 (druk op Enter)

Zorg ervoor dat u alle groene vinkjes heeft, wat aangeeft dat ClusterControl zonder wachtwoord verbinding kan maken met het knooppunt. Klik op "Deploy" om de implementatie te starten.

Maak de database, MySQL-gebruiker en wachtwoord aan op een van de databaseknooppunten:

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

Of vanuit de ClusterControl-interface kunt u Beheren -> Schema en gebruikers . gebruiken in plaats daarvan:

Nadat het cluster is geïmplementeerd, installeert u ProxySQL door naar ClusterControl -> Beheren -> Load Balancer -> ProxySQL -> ProxySQL implementeren te gaan en voer de volgende gegevens in:

  • Serveradres:192.168.0.11
  • Beheerderswachtwoord:
  • Wachtwoord bewaken:
  • DB-gebruiker:camunda
  • DB-wachtwoord:passw0rd
  • Gebruikt u impliciete transacties?:Ja

Herhaal de ProxySQL-implementatiestap voor de tweede ProxySQL-instantie door het Serveradres te wijzigen waarde naar 192.168.0.12. Het virtuele IP-adres dat door Keepalive wordt geleverd, vereist dat ten minste twee ProxySQL-instanties zijn geïmplementeerd en actief zijn. Implementeer ten slotte een virtueel IP-adres door naar ClusterControl -> Beheren -> Load Balancer -> Keepalived te gaan en kies beide ProxySQL-knooppunten en specificeer het virtuele IP-adres en de netwerkinterface zodat de VIP kan luisteren:

Onze database-backend is nu voltooid. Importeer vervolgens de SQL-bestanden in het Galera-cluster als de aangemaakte MySQL-gebruiker. Ga op de applicatieserver naar de map "sql" en importeer ze in een van de Galera-knooppunten (we kiezen 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 biedt geen MySQL-connector voor Java, aangezien de standaarddatabase H2 is. Download MySQL Connector/J op de applicatieserver van de MySQL-downloadpagina en kopieer het JAR-bestand naar de Apache Tomcat bin-map:

$ 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/

Stel vervolgens de omgevingsvariabele CLASSPATH in om de databaseconnector op te nemen. Open setenv.sh met teksteditor:

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

En voeg de volgende regel toe:

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

Open ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml en wijzig de regels met betrekking tot datastore. Specificeer het virtuele IP-adres als de MySQL-host in de verbindingsreeks, met ProxySQL-poort 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"
              ...
/>

Ten slotte kunnen we de Camunda-service starten door start-camunda.sh uit te voeren script:

$ 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.

Zorg ervoor dat het CLASSPATH dat in de uitvoer wordt weergegeven, het pad naar het MySQL Connector/J JAR-bestand bevat. Nadat de initialisatie is voltooid, hebt u toegang tot Camunda-webapps op poort 8080 op http://192.168.0.8:8080/camunda/ . De standaard gebruikersnaam is demo met wachtwoord 'demo':

U kunt dan de verteerde capture-query's zien van Nodes -> ProxySQL -> Top Queries , wat aangeeft dat de applicatie correct communiceert met de Galera Cluster:

Er is geen lees-schrijfsplitsing geconfigureerd voor ProxySQL. Camunda gebruikt "SET autocommit=0" op elke SQL-instructie om de transactie te initialiseren en de beste manier voor ProxySQL om dit af te handelen door alle vragen naar dezelfde backend-servers van de doelhostgroep te sturen. Dit is de veiligste methode naast een betere beschikbaarheid. Het is echter mogelijk dat alle verbindingen een enkele server bereiken, dus er is geen taakverdeling.

MariaDB Galera

MariaDB Connector/J kan verschillende verbindingsmodi aan - failover, sequentieel, replicatie en aurora - maar Camunda ondersteunt alleen failover en sequentieel. Genomen uit MariaDB Connector/J-documentatie:

Modus Beschrijving
sequentieel
(beschikbaar sinds 1.3.0)
Deze modus ondersteunt verbindingsfailover in een omgeving met meerdere masters, zoals MariaDB Galera Cluster. Deze modus ondersteunt geen leesbewerkingen voor taakverdeling op slaves. De connector probeert verbinding te maken met hosts in de volgorde waarin ze zijn gedeclareerd in de verbindings-URL, dus de eerste beschikbare host wordt gebruikt voor alle query's. Laten we bijvoorbeeld zeggen dat de verbindings-URL de volgende is:
jdbc:mariadb:sequential:host1,host2,host3/testdb
Wanneer de connector verbinding probeert te maken, zal hij altijd eerst host1 proberen. Als die host niet beschikbaar is, zal hij host2 proberen. enz. Als een host faalt, zal de connector in dezelfde volgorde proberen opnieuw verbinding te maken met hosts.
failover
(beschikbaar sinds 1.2.0)
Deze modus ondersteunt verbindingsfailover in een omgeving met meerdere masters, zoals MariaDB Galera Cluster. Deze modus ondersteunt geen leesbewerkingen voor taakverdeling op slaves. De connector voert taakverdeling uit voor alle query's door willekeurig een host te kiezen uit de verbindings-URL voor elke verbinding, zodat query's worden verdeeld als gevolg van het feit dat de verbindingen willekeurig over alle hosts worden verdeeld.

Het gebruik van de "failover"-modus brengt een hoger potentieel risico op een impasse met zich mee, aangezien schrijfbewerkingen vrijwel gelijkelijk naar alle backend-servers worden gedistribueerd. Single-writer-aanpak is een veilige manier om te werken, wat betekent dat het gebruik van de sequentiële modus het werk redelijk goed zou moeten doen. U kunt ook de load-balancer-laag in de architectuur overslaan. Daarom kunnen we met MariaDB Java-connector onze architectuur zo eenvoudig implementeren als hieronder:

Voordat we ons cluster implementeren, moet u het MariaDB-configuratiesjabloonbestand wijzigen dat ClusterControl zal gebruiken bij het installeren van MariaDB-servers. De naam van het sjabloonbestand is my.cnf.galera en bevindt zich onder /usr/share/cmon/templates/ op de ClusterControl-host. Zorg ervoor dat de volgende regels bestaan ​​in de sectie [mysqld]:

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

Sla het bestand op en we zijn klaar om te gaan. Een beetje uitleg, de bovenstaande lijst zijn de vereisten zoals vermeld in Camunda-documenten, vooral over de ondersteunde transactie-isolatie voor Galera. Variabele wsrep_sync_wait is ingesteld op 7 om clusterbrede causaliteitscontroles uit te voeren voor READ (inclusief SELECT, SHOW en BEGIN of START TRANSACTION), UPDATE-, DELETE-, INSERT- en REPLACE-instructies, zodat de instructie wordt uitgevoerd op een volledig gesynchroniseerd knooppunt. Houd er rekening mee dat een andere waarde dan 0 kan leiden tot een verhoogde latentie. Het inschakelen van het prestatieschema is optioneel voor de ClusterControl-functie voor het bewaken van query's.

Nu kunnen we het clusterimplementatieproces starten. Installeer ClusterControl, genereer een SSH-sleutel en stel wachtwoordloze SSH in van de ClusterControl-host naar alle Galera-knooppunten. Doe op het ClusterControl-knooppunt:

$ 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

Ga naar ClusterControl -> Deploy -> MySQL Galera en specificeer de volgende details (indien niet vermeld, gebruik de standaardwaarde):

  • SSH-gebruiker:root
  • SSH-sleutelpad:/root/.ssh/id_rsa
  • Clusternaam:MariaDB Galera 10.3
  • Verkoper:MariaDB
  • Versie:10.3
  • Beheerder/rootwachtwoord:{specificeer een wachtwoord}
  • Node toevoegen:192.168.0.41 (druk op Enter), 192.168.0.42 (druk op Enter), 192.168.0.43 (druk op Enter)

Zorg ervoor dat je alle groene vinkjes hebt bij het toevoegen van nodes, wat aangeeft dat ClusterControl in staat is om wachtwoordloos verbinding te maken met de node. Klik op "Deploy" om de implementatie te starten.

Maak de database, MariaDB-gebruiker en wachtwoord aan op een van de Galera-knooppunten:

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

Voor ClusterControl-gebruiker kunt u ClusterControl -> Beheren -> Schema en gebruikers gebruiken in plaats daarvan:

De implementatie van onze databasecluster is nu voltooid. Importeer vervolgens de SQL-bestanden in het MariaDB-cluster. Ga op de applicatieserver naar de map "sql" en importeer ze in een van de MariaDB-knooppunten (we kozen voor 192.168.0.41):

$ 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 biedt geen MariaDB-connector voor Java, aangezien de standaarddatabase H2 is. Download MariaDB Connector/J op de applicatieserver van de MariaDB-downloadpagina en kopieer het JAR-bestand naar de Apache Tomcat bin-map:

$ 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/

Stel vervolgens de omgevingsvariabele CLASSPATH in om de databaseconnector op te nemen. Open setenv.sh via teksteditor:

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

En voeg de volgende regel toe:

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

Open ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml en wijzig de regels met betrekking tot datastore. Gebruik het sequentiële verbindingsprotocol en vermeld alle Galera-knooppunten gescheiden door komma's in de verbindingsreeks:

<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"
              ...
/>

Ten slotte kunnen we de Camunda-service starten door start-camunda.sh uit te voeren script:

$ 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.

Zorg ervoor dat het CLASSPATH dat in de uitvoer wordt weergegeven, het pad naar het JAR-bestand van de MariaDB Java-client bevat. Nadat de initialisatie is voltooid, hebt u toegang tot Camunda-webapps op poort 8080 op http://192.168.0.8:8080/camunda/ . De standaard gebruikersnaam is demo met wachtwoord 'demo':

U kunt de verteerde capture-query's zien van ClusterControl -> Query Monitor -> Top Queries , wat aangeeft dat de applicatie correct communiceert met de MariaDB Cluster:

Met MariaDB Connector/J hebben we geen load balancer-laag nodig, wat onze algehele architectuur vereenvoudigt. De sequentiële verbindingsmodus zou voldoende moeten zijn om impasses met meerdere schrijvers te voorkomen - wat kan gebeuren in Galera. Deze setup biedt hoge beschikbaarheid met elke Camunda-instantie die is geconfigureerd met JDBC om toegang te krijgen tot het cluster van MySQL- of MariaDB-knooppunten. Galera zorgt voor de realtime synchronisatie van de gegevens tussen de database-instanties.


  1. SQL Server 2008 - volgorde op tekenreeksen met numeriek nummer

  2. Application_name instellen op Postgres/SQLAlchemy

  3. Index auto-increment voor Microsoft SQL Server 2008 R2

  4. Een PHP-script aanroepen vanuit een MySQL-trigger