Camunda BPM je platforma pro automatizaci pracovních postupů a rozhodování s otevřeným zdrojovým kódem. Camunda BPM se dodává s nástroji pro vytváření workflow a rozhodovacích modelů, provozování nasazených modelů v produkci a umožňující uživatelům provádět úkoly workflow, které jim byly přiděleny.
Ve výchozím nastavení je Camunda dodávána s vestavěnou databází nazvanou H2, která funguje docela slušně v prostředí Java s relativně malými nároky na paměť. Pokud však jde o škálování a vysokou dostupnost, existují další databázové backendy, které by mohly být vhodnější.
V tomto blogovém příspěvku se chystáme nasadit Camunda BPM 7.10 Community Edition na Linux se zaměřením na dosažení vysoké dostupnosti databáze. Camunda podporuje hlavní databáze prostřednictvím ovladačů JDBC, jmenovitě Oracle, DB2, MySQL, MariaDB a PostgreSQL. Tento blog se zaměřuje pouze na MySQL a MariaDB Galera Cluster s odlišnou implementací na každém - jeden s ProxySQL jako vyrovnáváním zatížení databáze a druhý pomocí ovladače JDBC pro připojení k více instancím databáze. Vezměte na vědomí, že tento článek se nezabývá vysokou dostupností samotné aplikace Camunda.
Předpoklad
Camunda BPM běží na Javě. V našem boxu CentOS 7 musíme nainstalovat JDK a nejlepší možností je použít ten od společnosti Oracle a přeskočit použití balíčků OpenJDK poskytovaných v úložišti. Na aplikačním serveru, kde by měla Camunda běžet, si stáhněte nejnovější sadu Java SE Development Kit (JDK) od společnosti Oracle zasláním souboru cookie pro přijetí:
$ wget --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/12+33/312335d836a34c7c8bba9d963e26dc23/jdk-12_linux-x64_bin.rpm
Nainstalujte jej na hostitele:
$ yum localinstall jdk-12_linux-x64_bin.rpm
Ověřte pomocí:
$ 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)
Vytvořte nový adresář a stáhněte si komunitu Camunda pro Apache Tomcat z oficiální stránky pro stahování:
$ mkdir ~/camunda
$ cd ~/camunda
$ wget --content-disposition 'https://camunda.org/release/camunda-bpm/tomcat/7.10/camunda-bpm-tomcat-7.10.0.tar.gz'
Rozbalte to:
$ tar -xzf camunda-bpm-tomcat-7.10.0.tar.gz
Před spuštěním webové aplikace Camunda musíme nakonfigurovat řadu závislostí. To závisí na zvolené databázové platformě, jako je konfigurace úložiště dat, konektor databáze a prostředí CLASSPATH. Následující části vysvětlují požadované kroky pro MySQL Galera (pomocí Percona XtraDB Cluster) a MariaDB Galera Cluster.
Všimněte si, že konfigurace zobrazené v tomto blogu jsou založeny na prostředí Apache Tomcat. Pokud používáte JBOSS nebo Wildfly, konfigurace datového úložiště bude trochu jiná. Podrobnosti naleznete v dokumentaci Camunda.
MySQL Galera Cluster (s ProxySQL a Keepalived)
Použijeme ClusterControl k nasazení clusteru Galera založeného na MySQL s Percona XtraDB Cluster. V dokumentech Camunda jsou uvedena některá omezení související s Galerou, která se týkají řešení konfliktů Galera s více zapisovači a úrovně izolace InnoDB. V případě, že se vás to týká, nejbezpečnějším způsobem je použít přístup s jedním zapisovačem, který je dosažitelný s konfigurací hostitelské skupiny ProxySQL. Abychom neposkytli jediný bod selhání, nasadíme dvě instance ProxySQL a spojíme je s virtuální IP adresou od Keepalived.
Následující diagram ilustruje naši finální architekturu:
Nejprve nasaďte tříuzlový Percona XtraDB Cluster 5.7. Nainstalujte ClusterControl, vygenerujte klíč SSH a nastavte SSH bez hesla z hostitele ClusterControl do všech uzlů (včetně ProxySQL). V uzlu ClusterControl proveďte:
$ 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
Než nasadíme náš cluster, musíme upravit soubor konfigurační šablony MySQL, který bude ClusterControl používat při instalaci serverů MySQL. Název souboru šablony je my57.cnf.galera a nachází se pod /usr/share/cmon/templates/ na hostiteli ClusterControl. Ujistěte se, že v sekci [mysqld] existují následující řádky:
[mysqld]
...
transaction-isolation=READ-COMMITTED
wsrep_sync_wait=7
...
Uložte soubor a můžeme vyrazit. Výše uvedené požadavky jsou uvedeny v dokumentech Camunda, zejména pokud jde o podporovanou izolaci transakcí pro Galera. Proměnná wsrep_sync_wait je nastavena na 7, aby prováděla kontroly kauzality v rámci celého klastru pro příkazy READ (včetně SELECT, SHOW a BEGIN nebo START TRANSACTION), UPDATE, DELETE, INSERT a REPLACE, čímž se zajistí, že se příkaz provede na plně synchronizovaném uzlu. Mějte na paměti, že hodnota jiná než 0 může vést ke zvýšení latence.
Přejděte na ClusterControl -> Deploy -> MySQL Galera a zadejte následující podrobnosti (pokud nejsou uvedeny, použijte výchozí hodnotu):
- Uživatel SSH:root
- Cesta klíče SSH:/root/.ssh/id_rsa
- Název clusteru:Percona XtraDB Cluster 5.7
- Dodavatel:Percona
- Verze:5.7
- Heslo správce/root:{specify a password}
- Přidat uzel:192.168.0.21 (stiskněte Enter), 192.168.0.22 (stiskněte Enter), 192.168.0.23 (stiskněte Enter)
Ujistěte se, že máte všechna zelená zaškrtnutí, která značí, že ClusterControl se dokáže připojit k uzlu bez hesla. Kliknutím na „Deploy“ zahájíte nasazení.
Vytvořte databázi, uživatele MySQL a heslo na jednom z uzlů databáze:
mysql> CREATE DATABASE camunda;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON camunda.* TO [email protected]'%';
Nebo z rozhraní ClusterControl můžete použít Správa -> Schéma a uživatelé místo toho:
Jakmile je cluster nasazen, nainstalujte ProxySQL tak, že přejdete na ClusterControl -> Správa -> Load Balancer -> ProxySQL -> Nasadit ProxySQL a zadejte následující podrobnosti:
- Adresa serveru:192.168.0.11
- Heslo pro správu:
- Heslo monitoru:
- Uživatel DB:camunda
- Heslo DB:passw0rd
- Používáte implicitní transakce?:Ano
Opakujte krok nasazení ProxySQL pro druhou instanci ProxySQL změnou Adresy serveru hodnotu na 192.168.0.12. Virtuální IP adresa poskytovaná Keepalived vyžaduje nasazené a spuštěné alespoň dvě instance ProxySQL. Nakonec nasaďte virtuální IP adresu tak, že přejdete na ClusterControl -> Spravovat -> Load Balancer -> Keepalived a vyberte oba uzly ProxySQL a zadejte virtuální IP adresu a síťové rozhraní, které má VIP naslouchat:
Náš databázový backend je nyní kompletní. Dále importujte soubory SQL do Galera Cluster jako vytvořený uživatel MySQL. Na aplikačním serveru přejděte do adresáře "sql" a importujte je do jednoho z uzlů Galera (vybíráme 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 neposkytuje konektor MySQL pro Javu, protože její výchozí databáze je H2. Na aplikačním serveru si stáhněte MySQL Connector/J ze stránky stahování MySQL a zkopírujte soubor JAR do adresáře Apache Tomcat bin:
$ 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/
Potom nastavte proměnnou prostředí CLASSPATH tak, aby zahrnovala konektor databáze. Otevřete setenv.sh pomocí textového editoru:
$ vim ~/camunda/server/apache-tomcat-9.0.12/bin/setenv.sh
A přidejte následující řádek:
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/mysql-connector-java-8.0.15.jar
Otevřete ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml a změňte řádky související s úložištěm dat. Zadejte virtuální IP adresu jako hostitele MySQL v připojovacím řetězci s portem ProxySQL 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"
...
/>
Nakonec můžeme spustit službu Camunda spuštěním 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.
Ujistěte se, že CLASSPATH zobrazená ve výstupu zahrnuje cestu k souboru MySQL Connector/J JAR. Po dokončení inicializace můžete přistupovat k webovým aplikacím Camunda na portu 8080 na adrese http://192.168.0.8:8080/camunda/ . Výchozí uživatelské jméno je demo s heslem 'demo':
Poté můžete vidět zpracované zachytávací dotazy z Nodes -> ProxySQL -> Top Queries , což znamená, že aplikace správně spolupracuje s Galera Cluster:
Pro ProxySQL není nakonfigurováno žádné dělení na čtení a zápis. Camunda používá "SET autocommit=0" na každém příkazu SQL k inicializaci transakce a nejlepší způsob, jak to může ProxySQL zvládnout odesláním všech dotazů na stejné backendové servery cílové skupiny hostitelů. Toto je nejbezpečnější metoda spolu s lepší dostupností. Všechna připojení však mohou nakonec dosáhnout jediného serveru, takže neexistuje žádné vyrovnávání zátěže.
MariaDB Galera
MariaDB Connector/J je schopen zpracovat různé režimy připojení – převzetí služeb při selhání, sekvenční, replikace a aurora – ale Camunda podporuje pouze převzetí služeb při selhání a sekvenční. Převzato z dokumentace MariaDB Connector/J:
Režim | Popis |
---|---|
sekvenční (k dispozici od 1.3.0) | Tento režim podporuje převzetí služeb při selhání připojení v prostředí s více mastery, jako je MariaDB Galera Cluster. Tento režim nepodporuje čtení vyvažování zátěže na podřízených zařízeních. Konektor se pokusí připojit k hostitelům v pořadí, v jakém byli deklarováni v adrese URL připojení, takže pro všechny dotazy se použije první dostupný hostitel. Řekněme například, že adresa URL připojení je následující: Když se konektor pokusí připojit, vždy nejprve zkusí hostitel1. Pokud tento hostitel není dostupný, zkusí host2. atd. Když hostitel selže, konektor se pokusí znovu připojit k hostitelům ve stejném pořadí. |
failover (k dispozici od 1.2.0) | Tento režim podporuje převzetí služeb při selhání připojení v prostředí s více mastery, jako je MariaDB Galera Cluster. Tento režim nepodporuje čtení vyvažování zátěže na podřízených zařízeních. Konektor provádí vyrovnávání zátěže pro všechny dotazy náhodným výběrem hostitele z adresy URL připojení pro každé připojení, takže dotazy budou vyrovnány zatížením v důsledku náhodného rozložení připojení mezi všechny hostitele. |
Použití režimu „failover“ představuje vyšší potenciální riziko uváznutí, protože zápisy budou distribuovány na všechny backendové servery téměř stejně. Přístup s jedním zapisovačem je bezpečný způsob spuštění, což znamená, že použití sekvenčního režimu by mělo fungovat docela dobře. V architektuře můžete také přeskočit vrstvu vyvažování zátěže. S MariaDB Java konektorem tedy můžeme nasadit naši architekturu tak jednoduše, jak je uvedeno níže:
Než nasadíme náš cluster, upravte soubor konfigurační šablony MariaDB, který ClusterControl použije při instalaci serverů MariaDB. Název souboru šablony je my.cnf.galera a nachází se pod /usr/share/cmon/templates/ na hostiteli ClusterControl. Ujistěte se, že v sekci [mysqld] existují následující řádky:
[mysqld]
...
transaction-isolation=READ-COMMITTED
wsrep_sync_wait=7
performance_schema = ON
...
Uložte soubor a můžeme vyrazit. Trochu na vysvětlení, výše uvedený seznam jsou požadavky uvedené v dokumentech Camunda, zejména pokud jde o podporovanou izolaci transakcí pro Galera. Proměnná wsrep_sync_wait je nastavena na 7, aby prováděla kontroly kauzality v rámci celého klastru pro příkazy READ (včetně SELECT, SHOW a BEGIN nebo START TRANSACTION), UPDATE, DELETE, INSERT a REPLACE, čímž se zajistí, že se příkaz provede na plně synchronizovaném uzlu. Mějte na paměti, že hodnota jiná než 0 může vést ke zvýšení latence. Povolení schématu výkonu je volitelné pro funkci sledování dotazů ClusterControl.
Nyní můžeme zahájit proces nasazení clusteru. Nainstalujte ClusterControl, vygenerujte klíč SSH a nastavte SSH bez hesla z hostitele ClusterControl do všech uzlů Galera. V uzlu ClusterControl proveďte:
$ 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
Přejděte na ClusterControl -> Deploy -> MySQL Galera a zadejte následující podrobnosti (pokud nejsou uvedeny, použijte výchozí hodnotu):
- Uživatel SSH:root
- Cesta klíče SSH:/root/.ssh/id_rsa
- Název clusteru:MariaDB Galera 10.3
- Dodavatel:MariaDB
- Verze:10.3
- Heslo správce/root:{specify a password}
- Přidat uzel:192.168.0.41 (stiskněte Enter), 192.168.0.42 (stiskněte Enter), 192.168.0.43 (stiskněte Enter)
Při přidávání uzlů se ujistěte, že máte všechna zelená zaškrtnutí, což znamená, že ClusterControl se dokáže připojit k uzlu bez hesla. Kliknutím na „Deploy“ zahájíte nasazení.
Vytvořte databázi, uživatele MariaDB a heslo na jednom z uzlů Galera:
mysql> CREATE DATABASE camunda;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON camunda.* TO [email protected]'%';
Pro uživatele ClusterControl můžete použít ClusterControl -> Správa -> Schéma a uživatelé místo toho:
Nasazení našeho databázového clusteru je nyní dokončeno. Dále importujte soubory SQL do clusteru MariaDB. Na aplikačním serveru přejděte do adresáře "sql" a importujte je do jednoho z uzlů MariaDB (vybrali jsme 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 neposkytuje konektor MariaDB pro Javu, protože její výchozí databáze je H2. Na aplikačním serveru si stáhněte MariaDB Connector/J ze stránky stahování MariaDB a zkopírujte soubor JAR do adresáře Apache Tomcat bin:
$ 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/
Potom nastavte proměnnou prostředí CLASSPATH tak, aby zahrnovala konektor databáze. Otevřete setenv.sh pomocí textového editoru:
$ vim ~/camunda/server/apache-tomcat-9.0.12/bin/setenv.sh
A přidejte následující řádek:
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/mariadb-java-client-2.4.1.jar
Otevřete ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml a změňte řádky související s úložištěm dat. Použijte protokol sekvenčního připojení a vypište všechny uzly Galera oddělené čárkou v připojovacím řetězci:
<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"
...
/>
Nakonec můžeme spustit službu Camunda spuštěním 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.
Ujistěte se, že CLASSPATH zobrazená ve výstupu zahrnuje cestu k souboru JAR klienta MariaDB Java. Po dokončení inicializace můžete přistupovat k webovým aplikacím Camunda na portu 8080 na adrese http://192.168.0.8:8080/camunda/ . Výchozí uživatelské jméno je demo s heslem 'demo':
Můžete si prohlédnout zpracované dotazy z ClusterControl -> Query Monitor -> Top Queries , což znamená, že aplikace správně spolupracuje s klastrem MariaDB:
S MariaDB Connector/J nepotřebujeme vrstvu vyrovnávání zátěže, což zjednodušuje naši celkovou architekturu. Režim sekvenčního připojení by měl stačit, aby se zabránilo zablokování multi-writer – což se může stát v Galeře. Toto nastavení poskytuje vysokou dostupnost s každou instancí Camunda nakonfigurovanou pomocí JDBC pro přístup ke clusteru uzlů MySQL nebo MariaDB. Galera se stará o synchronizaci dat mezi instancemi databáze v reálném čase.