sql >> Database teknologi >  >> RDS >> MariaDB

Database høj tilgængelighed for Camunda BPM ved hjælp af MySQL eller MariaDB Galera Cluster

Camunda BPM er en open source-workflow- og beslutningsautomatiseringsplatform. Camunda BPM leveres med værktøjer til at skabe workflow- og beslutningsmodeller, betjene implementerede modeller i produktionen og give brugerne mulighed for at udføre workflow-opgaver, der er tildelt dem.

Som standard kommer Camunda med en indlejret database kaldet H2, som fungerer ret anstændigt i et Java-miljø med relativt lille hukommelsesfodaftryk. Men når det kommer til skalering og høj tilgængelighed, er der andre database-backends, der måske er mere passende.

I dette blogindlæg vil vi implementere Camunda BPM 7.10 Community Edition på Linux med fokus på at opnå høj tilgængelighed af databaser. Camunda understøtter store databaser gennem JDBC-drivere, nemlig Oracle, DB2, MySQL, MariaDB og PostgreSQL. Denne blog fokuserer kun på MySQL og MariaDB Galera Cluster, med forskellig implementering på hver - den ene med ProxySQL som databasebelastningsbalancer, og den anden bruger JDBC-driveren til at oprette forbindelse til flere databaseinstanser. Bemærk, at denne artikel ikke dækker høj tilgængelighed for selve Camunda-applikationen.

Forudsætning

Camunda BPM kører på Java. I vores CentOS 7-boks skal vi installere JDK, og den bedste mulighed er at bruge den fra Oracle og springe over at bruge OpenJDK-pakkerne, der er leveret i lageret. På den applikationsserver, hvor Camunda skal køre, skal du downloade det seneste Java SE Development Kit (JDK) fra Oracle ved at sende acceptcookien:

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

Installer det på værten:

$ yum localinstall jdk-12_linux-x64_bin.rpm

Bekræft med:

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

Opret en ny mappe og download Camunda Community til Apache Tomcat fra den officielle downloadside:

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

Udpak det:

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

Der er en række afhængigheder, vi skal konfigurere, før vi starter Camunda-webapplikationen. Dette afhænger af den valgte databaseplatform som datalagerkonfiguration, databaseforbindelse og CLASSPATH-miljø. De næste afsnit forklarer de nødvendige trin for MySQL Galera (ved hjælp af Percona XtraDB Cluster) og MariaDB Galera Cluster.

Bemærk, at konfigurationerne vist i denne blog er baseret på Apache Tomcat-miljøet. Hvis du bruger JBOSS eller Wildfly, vil datalagerkonfigurationen være en smule anderledes. Se Camunda-dokumentationen for detaljer.

MySQL Galera Cluster (med ProxySQL og Keepalived)

Vi vil bruge ClusterControl til at implementere MySQL-baseret Galera-klynge med Percona XtraDB Cluster. Der er nogle Galera-relaterede begrænsninger nævnt i Camunda-dokumenterne omkring Galera multi-writer konflikthåndtering og InnoDB isolationsniveau. I tilfælde af at du er berørt af disse, er den sikreste måde at bruge single-writer-tilgangen, som er opnåelig med ProxySQL-værtsgruppekonfiguration. For ikke at give et enkelt fejlpunkt vil vi implementere to ProxySQL-instanser og binde dem til en virtuel IP-adresse af Keepalved.

Følgende diagram illustrerer vores endelige arkitektur:

Først skal du implementere en tre-node Percona XtraDB Cluster 5.7. Installer ClusterControl, generer en SSH-nøgle og opsæt adgangskodefri SSH fra ClusterControl-værten til alle noder (inklusive ProxySQL). På ClusterControl-noden skal du gøre:

$ 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

Før vi implementerer vores klynge, skal vi ændre MySQL-konfigurationsskabelonfilen, som ClusterControl vil bruge, når MySQL-servere installeres. Skabelonfilnavnet er my57.cnf.galera og er placeret under /usr/share/cmon/templates/ på ClusterControl-værten. Sørg for, at følgende linjer findes under [mysqld] sektionen:

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

Gem filen, så er vi klar. Ovenstående er kravene som angivet i Camunda docs, især vedrørende den understøttede transaktionsisolering for Galera. Variablen wsrep_sync_wait er sat til 7 for at udføre klyngeomfattende kausalitetstjek for READ (inklusive SELECT, SHOW og BEGIN eller START TRANSACTION), UPDATE, DELETE, INSERT og REPLACE-sætninger, hvilket sikrer, at sætningen udføres på en fuldt synkroniseret node. Husk, at en anden værdi end 0 kan resultere i øget latenstid.

Gå til ClusterControl -> Deploy -> MySQL Galera og angiv følgende detaljer (hvis ikke nævnt, brug standardværdien):

  • SSH-bruger:root
  • SSH-nøglesti:/root/.ssh/id_rsa
  • Klyngenavn:Percona XtraDB Cluster 5.7
  • Sælger:Percona
  • Version:5.7
  • Admin/Root-adgangskode:{angiv en adgangskode
  • Tilføj node:192.168.0.21 (tryk på Enter), 192.168.0.22 (tryk på Enter), 192.168.0.23 (tryk på Enter)

Sørg for, at du har alle de grønne flueben, hvilket indikerer, at ClusterControl er i stand til at oprette forbindelse til noden uden adgangskode. Klik på "Deploy" for at starte installationen.

Opret databasen, MySQL-brugeren og adgangskoden på en af ​​databasenoderne:

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

Eller fra ClusterControl-grænsefladen kan du bruge Administrer -> Skema og brugere i stedet:

Når klyngen er implementeret, skal du installere ProxySQL ved at gå til ClusterControl -> Administrer -> Load Balancer -> ProxySQL -> Implementer ProxySQL og indtast følgende detaljer:

  • Serveradresse:192.168.0.11
  • Administrationsadgangskode:
  • Overvågningsadgangskode:
  • DB-bruger:camunda
  • DB-adgangskode:passw0rd
  • Bruger du implicitte transaktioner?:Ja

Gentag ProxySQL-implementeringstrinnet for den anden ProxySQL-instans ved at ændre serveradressen værdi til 192.168.0.12. Den virtuelle IP-adresse, der leveres af Keepalved, kræver, at mindst to ProxySQL-instanser er installeret og kører. Til sidst skal du implementere virtuel IP-adresse ved at gå til ClusterControl -> Administrer -> Load Balancer -> Keepalived og vælg begge ProxySQL-noder og angiv den virtuelle IP-adresse og netværksgrænsefladen, som VIP'en kan lytte til:

Vores database backend er nu færdig. Importer derefter SQL-filerne til Galera Cluster som den oprettede MySQL-bruger. På applikationsserveren skal du gå til "sql"-mappen og importere dem til en af ​​Galera-knuderne (vi vælger 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 leverer ikke MySQL-forbindelse til Java, da dens standarddatabase er H2. På applikationsserveren skal du downloade MySQL Connector/J fra MySQL-downloadsiden og kopiere JAR-filen til Apache Tomcat bin-mappen:

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

Indstil derefter miljøvariablen CLASSPATH til at inkludere databaseforbindelsen. Åbn setenv.sh ved hjælp af teksteditor:

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

Og tilføj følgende linje:

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

Åbn ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml og skift linjerne relateret til datalageret. Angiv den virtuelle IP-adresse som MySQL-værten i forbindelsesstrengen med 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"
              ...
/>

Endelig kan vi starte Camunda-tjenesten ved at udføre start-camunda.sh 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.

Sørg for, at CLASSPATH vist i outputtet inkluderer stien til MySQL Connector/J JAR-filen. Når initialiseringen er fuldført, kan du få adgang til Camunda webapps på port 8080 på http://192.168.0.8:8080/camunda/ . Standardbrugernavnet er demo med adgangskode 'demo':

Du kan derefter se de fordøjede capture-forespørgsler fra Noder -> ProxySQL -> Top Queries , hvilket indikerer, at applikationen interagerer korrekt med Galera Cluster:

Der er ingen læse-skriveopdeling konfigureret for ProxySQL. Camunda bruger "SET autocommit=0" på hver SQL-sætning til at initialisere transaktionen og den bedste måde for ProxySQL at håndtere dette ved at sende alle forespørgsler til de samme backend-servere i målværtsgruppen. Dette er den sikreste metode sammen med bedre tilgængelighed. Men alle forbindelser kan ende med at nå en enkelt server, så der er ingen belastningsbalancering.

MariaDB Galera

MariaDB Connector/J er i stand til at håndtere en række forskellige forbindelsestilstande - failover, sekventiel, replikering og aurora - men Camunda understøtter kun failover og sekventiel. Taget fra MariaDB Connector/J dokumentation:

Tilstand Beskrivelse
sekventiel
(tilgængelig siden 1.3.0)
Denne tilstand understøtter forbindelsesfejl i et multi-master miljø, såsom MariaDB Galera Cluster. Denne tilstand understøtter ikke belastningsbalancerende læsninger på slaver. Connectoren vil forsøge at oprette forbindelse til værter i den rækkefølge, som de blev erklæret i forbindelses-URL'en, så den første tilgængelige vært bruges til alle forespørgsler. Lad os f.eks. sige, at forbindelses-URL'en er følgende:
jdbc:mariadb:sequential:host1,host2,host3/testdb
Når stikket forsøger at oprette forbindelse, vil det altid prøve host1 først. Hvis denne vært ikke er tilgængelig, vil den prøve host2. osv. Når en vært fejler, vil forbindelsen forsøge at genoprette forbindelse til værter i samme rækkefølge.
failover
(tilgængelig siden 1.2.0)
Denne tilstand understøtter forbindelsesfejl i et multi-master miljø, såsom MariaDB Galera Cluster. Denne tilstand understøtter ikke belastningsbalancerende læsninger på slaver. Connectoren udfører belastningsbalancering for alle forespørgsler ved tilfældigt at vælge en vært fra forbindelses-URL'en for hver forbindelse, så forespørgsler vil være belastningsbalancerede som et resultat af, at forbindelserne bliver tilfældigt fordelt på tværs af alle værter.

Brug af "failover"-tilstand udgør en højere potentiel risiko for dødvande, da skrivninger vil blive distribueret til alle backend-servere næsten ligeligt. Single-writer-tilgang er en sikker måde at køre på, hvilket betyder, at brug af sekventiel tilstand burde gøre jobbet ret godt. Du kan også springe belastningsbalanceringsniveauet over i arkitekturen. Derfor kan vi med MariaDB Java-connector implementere vores arkitektur så enkelt som nedenfor:

Før vi implementerer vores klynge, skal du ændre MariaDB-konfigurationsskabelonfilen, som ClusterControl vil bruge, når MariaDB-servere installeres. Skabelonfilnavnet er my.cnf.galera og er placeret under /usr/share/cmon/templates/ på ClusterControl-værten. Sørg for, at følgende linjer findes under [mysqld] sektionen:

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

Gem filen, så er vi klar. En smule forklaring, ovenstående liste er kravene som angivet i Camunda docs, især på den understøttede transaktionsisolering for Galera. Variablen wsrep_sync_wait er sat til 7 for at udføre klyngeomfattende kausalitetstjek for READ (inklusive SELECT, SHOW og BEGIN eller START TRANSACTION), UPDATE, DELETE, INSERT og REPLACE-sætninger, hvilket sikrer, at sætningen udføres på en fuldt synkroniseret node. Husk, at en anden værdi end 0 kan resultere i øget latenstid. Aktivering af Performance Schema er valgfrit for ClusterControl-forespørgselsovervågningsfunktionen.

Nu kan vi starte klyngeimplementeringsprocessen. Installer ClusterControl, generer en SSH-nøgle og opsæt adgangskodefri SSH fra ClusterControl-værten til alle Galera-noder. På ClusterControl-noden skal du gøre:

$ 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

Gå til ClusterControl -> Deploy -> MySQL Galera og angiv følgende detaljer (hvis ikke nævnt, brug standardværdien):

  • SSH-bruger:root
  • SSH-nøglesti:/root/.ssh/id_rsa
  • Klyngenavn:MariaDB Galera 10.3
  • Sælger:MariaDB
  • Version:10.3
  • Admin/Root-adgangskode:{angiv en adgangskode
  • Tilføj node:192.168.0.41 (tryk på Enter), 192.168.0.42 (tryk på Enter), 192.168.0.43 (tryk på Enter)

Sørg for, at du har alle de grønne flueben, når du tilføjer noder, hvilket indikerer, at ClusterControl er i stand til at oprette forbindelse til noden uden adgangskode. Klik på "Deploy" for at starte installationen.

Opret databasen, MariaDB-brugeren og adgangskoden på en af ​​Galera-knuderne:

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

For ClusterControl-brugere kan du bruge ClusterControl -> Administrer -> Skema og brugere i stedet:

Udrulningen af ​​vores databaseklynge er nu færdig. Importer derefter SQL-filerne til MariaDB-klyngen. På applikationsserveren skal du gå til "sql"-mappen og importere dem til en af ​​MariaDB-noderne (vi valgte 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 leverer ikke MariaDB-forbindelse til Java, da dens standarddatabase er H2. På applikationsserveren skal du downloade MariaDB Connector/J fra MariaDB-downloadsiden og kopiere JAR-filen til Apache Tomcat bin-mappen:

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

Indstil derefter miljøvariablen CLASSPATH til at inkludere databaseforbindelsen. Åbn setenv.sh via teksteditor:

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

Og tilføj følgende linje:

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

Åbn ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml og skift linjerne relateret til datalageret. Brug den sekventielle forbindelsesprotokol og skriv alle Galera-noder adskilt af komma i forbindelsesstrengen:

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

Endelig kan vi starte Camunda-tjenesten ved at udføre start-camunda.sh 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.

Sørg for, at CLASSPATH vist i outputtet inkluderer stien til MariaDB Java-klient JAR-filen. Når initialiseringen er fuldført, kan du få adgang til Camunda webapps på port 8080 på http://192.168.0.8:8080/camunda/ . Standardbrugernavnet er demo med adgangskode 'demo':

Du kan se de fordøjede capture-forespørgsler fra ClusterControl -> Query Monitor -> Top Queries , hvilket indikerer, at applikationen interagerer korrekt med MariaDB-klyngen:

Med MariaDB Connector/J behøver vi ikke load balancer tier, hvilket forenkler vores overordnede arkitektur. Den sekventielle forbindelsestilstand burde gøre det trick for at undgå deadlocks med flere forfattere - hvilket kan ske i Galera. Denne opsætning giver høj tilgængelighed med hver Camunda-instans konfigureret med JDBC for at få adgang til klyngen af ​​MySQL- eller MariaDB-noder. Galera sørger for at synkronisere data mellem databaseforekomsterne i realtid.


  1. SQL Server System Database Vedligeholdelse

  2. Sådan optimerer du MySQL-ydelse ved hjælp af MySQLTuner

  3. Hvordan transformerer man en MSSQL CTE-forespørgsel til MySQL?

  4. Sådan fungerer ROUND() i MariaDB