sql >> Databasteknik >  >> RDS >> MariaDB

Databas hög tillgänglighet för Camunda BPM med MySQL eller MariaDB Galera Cluster

Camunda BPM är en arbetsflödes- och beslutsautomatiseringsplattform med öppen källkod. Camunda BPM levereras med verktyg för att skapa arbetsflödes- och beslutsmodeller, driva utplacerade modeller i produktionen och låta användare utföra arbetsflödesuppgifter som tilldelats dem.

Som standard kommer Camunda med en inbäddad databas som heter H2, som fungerar ganska bra i en Java-miljö med relativt litet minnesutrymme. Men när det kommer till skalning och hög tillgänglighet finns det andra databasbackends som kan vara mer lämpliga.

I det här blogginlägget kommer vi att distribuera Camunda BPM 7.10 Community Edition på Linux, med fokus på att uppnå databas hög tillgänglighet. Camunda stöder stora databaser genom JDBC-drivrutiner, nämligen Oracle, DB2, MySQL, MariaDB och PostgreSQL. Den här bloggen fokuserar bara på MySQL och MariaDB Galera Cluster, med olika implementeringar på var och en - en med ProxySQL som databaslastbalanserare och den andra använder JDBC-drivrutinen för att ansluta till flera databasinstanser. Observera att den här artikeln inte täcker hög tillgänglighet för själva Camunda-applikationen.

Förutsättning

Camunda BPM körs på Java. I vår CentOS 7-låda måste vi installera JDK och det bästa alternativet är att använda den från Oracle och hoppa över OpenJDK-paketen som finns i förvaret. På applikationsservern där Camunda ska köras laddar du ned det senaste Java SE Development Kit (JDK) från Oracle genom att skicka 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

Installera det på värden:

$ yum localinstall jdk-12_linux-x64_bin.rpm

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

Skapa en ny katalog och ladda ner Camunda Community för Apache Tomcat från den officiella nedladdningssidan:

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

Extrahera det:

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

Det finns ett antal beroenden vi måste konfigurera innan vi startar Camunda webbapplikation. Detta beror på den valda databasplattformen som datalagringskonfiguration, databaskoppling och CLASSPATH-miljö. Nästa avsnitt förklarar de nödvändiga stegen för MySQL Galera (med Percona XtraDB Cluster) och MariaDB Galera Cluster.

Observera att konfigurationerna som visas i den här bloggen är baserade på Apache Tomcat-miljön. Om du använder JBOSS eller Wildfly kommer datalagringskonfigurationen att vara lite annorlunda. Se Camunda-dokumentationen för detaljer.

MySQL Galera Cluster (med ProxySQL och Keepalived)

Vi kommer att använda ClusterControl för att distribuera MySQL-baserat Galera-kluster med Percona XtraDB Cluster. Det finns några Galera-relaterade begränsningar som nämns i Camunda-dokumenten kring Galera multi-writer konflikthantering och InnoDB isoleringsnivå. Om du påverkas av dessa, är det säkraste sättet att använda metoden med en skrivare, vilket är möjligt med ProxySQL-värdgruppskonfiguration. För att inte tillhandahålla en enda felpunkt kommer vi att distribuera två ProxySQL-instanser och knyta dem till en virtuell IP-adress av Keepalved.

Följande diagram illustrerar vår slutliga arkitektur:

Installera först ett Percona XtraDB Cluster 5.7 med tre noder. Installera ClusterControl, generera en SSH-nyckel och ställ in lösenordslös SSH från ClusterControl-värden till alla noder (inklusive ProxySQL). På ClusterControl-noden gör du:

$ 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

Innan vi distribuerar vårt kluster måste vi ändra MySQL-konfigurationsmallfilen som ClusterControl kommer att använda vid installation av MySQL-servrar. Mallfilens namn är my57.cnf.galera och finns under /usr/share/cmon/templates/ på ClusterControl-värden. Se till att följande rader finns under avsnittet [mysqld]:

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

Spara filen så är vi redo. Ovanstående är kraven som anges i Camunda docs, särskilt på den transaktionsisolering som stöds för Galera. Variabeln wsrep_sync_wait är inställd på 7 för att utföra klusteromfattande kausalitetskontroller för READ (inklusive SELECT, SHOW och BEGIN eller START TRANSACTION), UPDATE, DELETE, INSERT och REPLACE-satser, vilket säkerställer att satsen exekveras på en helt synkroniserad nod. Tänk på att ett annat värde än 0 kan resultera i ökad latens.

Gå till ClusterControl -> Deploy -> MySQL Galera och ange följande detaljer (om det inte nämns, använd standardvärdet):

  • SSH-användare:root
  • SSH-nyckelsökväg:/root/.ssh/id_rsa
  • Klusternamn:Percona XtraDB Cluster 5.7
  • Leverantör:Percona
  • Version:5.7
  • Admin/Root-lösenord:{specificera ett lösenord
  • Lägg till nod:192.168.0.21 (tryck på Retur), 192.168.0.22 (tryck på Retur), 192.168.0.23 (tryck på Retur)

Se till att du har alla gröna bockar, vilket indikerar att ClusterControl kan ansluta till noden utan lösenord. Klicka på "Distribuera" för att starta distributionen.

Skapa databasen, MySQL-användaren och lösenordet på en av databasnoderna:

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

Eller från ClusterControl-gränssnittet kan du använda Hantera -> Schema och användare istället:

När klustret har distribuerats installerar du ProxySQL genom att gå till ClusterControl -> Hantera -> Load Balancer -> ProxySQL -> Deploy ProxySQL och ange följande information:

  • Serveradress:192.168.0.11
  • Administrationslösenord:
  • Övervakningslösenord:
  • DB-användare:camunda
  • DB-lösenord:passw0rd
  • Använder du implicita transaktioner?:Ja

Upprepa ProxySQL-distributionssteget för den andra ProxySQL-instansen genom att ändra serveradressen värde till 192.168.0.12. Den virtuella IP-adressen som tillhandahålls av Keepalved kräver minst två ProxySQL-instanser distribuerade och igång. Slutligen, distribuera virtuell IP-adress genom att gå till ClusterControl -> Hantera -> Load Balancer -> Keepalived och välj båda ProxySQL-noderna och ange den virtuella IP-adressen och nätverksgränssnittet så att VIP:n kan lyssna:

Vår databasbackend är nu klar. Importera sedan SQL-filerna till Galera-klustret som den skapade MySQL-användaren. På applikationsservern, gå till "sql"-katalogen och importera dem till en av Galera-noderna (vi väljer 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 tillhandahåller inte MySQL-anslutning för Java eftersom dess standarddatabas är H2. På applikationsservern laddar du ner MySQL Connector/J från MySQL-nedladdningssidan och kopierar JAR-filen till Apache Tomcat bin-katalogen:

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

Ställ sedan in miljövariabeln CLASSPATH så att den inkluderar databasanslutningen. Öppna setenv.sh med textredigerare:

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

Och lägg till följande rad:

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

Öppna ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml och ändra raderna relaterade till datastore. Ange den virtuella IP-adressen som MySQL-värd i anslutningssträngen, 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"
              ...
/>

Slutligen kan vi starta Camunda-tjänsten genom att köra start-camunda.sh 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.

Se till att CLASSPATH som visas i utdata inkluderar sökvägen till MySQL Connector/J JAR-filen. Efter att initieringen är klar kan du komma åt Camundas webbappar på port 8080 på http://192.168.0.8:8080/camunda/ . Standardanvändarnamnet är demo med lösenordet 'demo':

Du kan sedan se de sammanfattade fångstfrågorna från Noder -> ProxySQL -> Top Queries , vilket indikerar att programmet interagerar korrekt med Galera-klustret:

Det finns ingen läs-skriv-delning konfigurerad för ProxySQL. Camunda använder "SET autocommit=0" på varje SQL-sats för att initiera transaktion och det bästa sättet för ProxySQL att hantera detta genom att skicka alla frågor till samma backend-servrar i målvärdgruppen. Detta är den säkraste metoden vid sidan av bättre tillgänglighet. Men alla anslutningar kan hamna i en enda server, så det finns ingen lastbalansering.

MariaDB Galera

MariaDB Connector/J kan hantera en mängd olika anslutningslägen - failover, sekventiell, replikering och aurora - men Camunda stöder bara failover och sekventiell. Taget från MariaDB Connector/J-dokumentation:

Läge Beskrivning
sekventiell
(tillgänglig sedan 1.3.0)
Det här läget stöder anslutningsfel i en multi-mastermiljö, som MariaDB Galera Cluster. Det här läget stöder inte lastbalanserande läsningar på slavar. Anslutaren kommer att försöka ansluta till värdar i den ordning som de deklarerades i anslutnings-URL, så den första tillgängliga värden används för alla frågor. Låt oss till exempel säga att anslutningsadressen är följande:
jdbc:mariadb:sequential:host1,host2,host3/testdb
När anslutningen försöker ansluta, försöker den alltid host1 först. Om den värden inte är tillgänglig kommer den att försöka host2. etc. När en värd misslyckas kommer anslutningen att försöka återansluta till värdar i samma ordning.
failover
(tillgänglig sedan 1.2.0)
Det här läget stöder anslutningsfel i en multi-mastermiljö, som MariaDB Galera Cluster. Det här läget stöder inte lastbalanserande läsningar på slavar. Anslutningen utför belastningsbalansering för alla frågor genom att slumpmässigt välja en värd från anslutningsadressen för varje anslutning, så frågor kommer att belastningsbalanseras som ett resultat av att anslutningarna fördelas slumpmässigt över alla värdar.

Att använda "failover"-läge innebär en högre potentiell risk för dödläge, eftersom skrivningar kommer att distribueras till alla backend-servrar nästan lika. Single-writer-metoden är ett säkert sätt att köra, vilket innebär att användning av sekventiellt läge borde göra jobbet ganska bra. Du kan också hoppa över lastbalanseringsnivån i arkitekturen. Med MariaDB Java-anslutningen kan vi därför distribuera vår arkitektur så enkelt som nedan:

Innan vi distribuerar vårt kluster, ändra MariaDB-konfigurationsmallfilen som ClusterControl kommer att använda vid installation av MariaDB-servrar. Mallfilens namn är my.cnf.galera och finns under /usr/share/cmon/templates/ på ClusterControl-värden. Se till att följande rader finns under avsnittet [mysqld]:

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

Spara filen så är vi redo. Lite förklaring, listan ovan är kraven som anges i Camunda docs, speciellt på den transaktionsisolering som stöds för Galera. Variabeln wsrep_sync_wait är inställd på 7 för att utföra klusteromfattande kausalitetskontroller för READ (inklusive SELECT, SHOW och BEGIN eller START TRANSACTION), UPDATE, DELETE, INSERT och REPLACE-satser, vilket säkerställer att satsen exekveras på en helt synkroniserad nod. Tänk på att ett annat värde än 0 kan resultera i ökad latens. Aktivering av Performance Schema är valfritt för ClusterControls frågeövervakningsfunktion.

Nu kan vi starta klusterdistributionsprocessen. Installera ClusterControl, generera en SSH-nyckel och ställ in lösenordslös SSH från ClusterControl-värden till alla Galera-noder. På ClusterControl-noden gör du:

$ 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å till ClusterControl -> Deploy -> MySQL Galera och ange följande detaljer (om det inte nämns, använd standardvärdet):

  • SSH-användare:root
  • SSH-nyckelsökväg:/root/.ssh/id_rsa
  • Klusternamn:MariaDB Galera 10.3
  • Leverantör:MariaDB
  • Version:10.3
  • Admin/Root-lösenord:{specificera ett lösenord
  • Lägg till nod:192.168.0.41 (tryck på Retur), 192.168.0.42 (tryck på Retur), 192.168.0.43 (tryck på Retur)

Se till att du har alla gröna bockar när du lägger till noder, vilket indikerar att ClusterControl kan ansluta till noden utan lösenord. Klicka på "Distribuera" för att starta distributionen.

Skapa databasen, MariaDB-användaren och lösenordet på en av Galera-noderna:

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

För ClusterControl-användare kan du använda ClusterControl -> Hantera -> Schema och användare istället:

Implementeringen av vårt databaskluster är nu klar. Importera sedan SQL-filerna till MariaDB-klustret. På applikationsservern, gå till "sql"-katalogen och importera dem till en av MariaDB-noderna (vi valde 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 tillhandahåller inte MariaDB-anslutningen för Java eftersom dess standarddatabas är H2. På applikationsservern, ladda ner MariaDB Connector/J från MariaDBs nedladdningssida och kopiera JAR-filen till Apache Tomcat bin-katalogen:

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

Ställ sedan in miljövariabeln CLASSPATH så att den inkluderar databasanslutningen. Öppna setenv.sh via textredigerare:

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

Och lägg till följande rad:

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

Öppna ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml och ändra raderna relaterade till datastore. Använd det sekventiella anslutningsprotokollet och lista alla Galera-noder separerade med kommatecken i anslutningssträngen:

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

Slutligen kan vi starta Camunda-tjänsten genom att köra start-camunda.sh 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.

Se till att CLASSPATH som visas i utdata inkluderar sökvägen till MariaDB Java-klientens JAR-fil. När initieringen är klar kan du komma åt Camunda webbappar på port 8080 på http://192.168.0.8:8080/camunda/ . Standardanvändarnamnet är demo med lösenordet 'demo':

Du kan se de sammanfattade fångstfrågorna från ClusterControl -> Query Monitor -> Top Queries , vilket indikerar att applikationen interagerar korrekt med MariaDB-klustret:

Med MariaDB Connector/J behöver vi ingen lastbalanseringsnivå, vilket förenklar vår övergripande arkitektur. Det sekventiella anslutningsläget borde göra susen för att undvika låsningar för flera skrivare – vilket kan hända i Galera. Denna inställning ger hög tillgänglighet med varje Camunda-instans konfigurerad med JDBC för att komma åt klustret av MySQL- eller MariaDB-noder. Galera tar hand om att synkronisera data mellan databasinstanserna i realtid.


  1. Finns det ett enkelt sätt att konvertera MySQL-data till Title Case?

  2. Hur RANK() fungerar i SQL Server

  3. Ta bort identitet från en kolumn i en tabell

  4. Vad är en anpassad körtidsbild i Java 9?