MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Alta disponibilidade de banco de dados para Camunda BPM usando MySQL ou MariaDB Galera Cluster


Camunda BPM é uma plataforma de fluxo de trabalho e automação de decisão de código aberto. O Camunda BPM vem com ferramentas para criar modelos de fluxo de trabalho e decisão, operar modelos implantados em produção e permitir que os usuários executem tarefas de fluxo de trabalho atribuídas a eles.

Por padrão, o Camunda vem com um banco de dados embutido chamado H2, que funciona de forma bastante decente em um ambiente Java com uma pegada de memória relativamente pequena. No entanto, quando se trata de dimensionamento e alta disponibilidade, existem outros back-ends de banco de dados que podem ser mais apropriados.

Nesta postagem do blog, vamos implantar o Camunda BPM 7.10 Community Edition no Linux, com foco em obter alta disponibilidade do banco de dados. Camunda suporta as principais bases de dados através de drivers JDBC, nomeadamente Oracle, DB2, MySQL, MariaDB e PostgreSQL. Este blog se concentra apenas no MySQL e no MariaDB Galera Cluster, com implementação diferente em cada um - um com ProxySQL como balanceador de carga de banco de dados e o outro usando o driver JDBC para conectar-se a várias instâncias de banco de dados. Observe que este artigo não aborda a alta disponibilidade do próprio aplicativo Camunda.

Pré-requisito


Camunda BPM roda em Java. Em nosso box do CentOS 7, temos que instalar o JDK e a melhor opção é usar o da Oracle, e pular usando os pacotes OpenJDK fornecidos no repositório. No servidor de aplicativos onde o Camunda deve ser executado, baixe o Java SE Development Kit (JDK) mais recente da Oracle enviando o cookie de aceitação:
$ wget --header "Cookie: oraclelicense=accept-securebackup-cookie" https://download.oracle.com/otn-pub/java/jdk/12+33/312335d836a34c7c8bba9d963e26dc23/jdk-12_linux-x64_bin.rpm

Instale-o no host:
$ yum localinstall jdk-12_linux-x64_bin.rpm

Verifique com:
$ 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)

Crie um novo diretório e baixe a Comunidade Camunda para Apache Tomcat na página oficial de download:
$ mkdir ~/camunda
$ cd ~/camunda
$ wget --content-disposition 'https://camunda.org/release/camunda-bpm/tomcat/7.10/camunda-bpm-tomcat-7.10.0.tar.gz'

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

Há uma série de dependências que temos que configurar antes de iniciar a aplicação web Camunda. Isso depende da plataforma de banco de dados escolhida, como configuração de armazenamento de dados, conector de banco de dados e ambiente CLASSPATH. As próximas seções explicam as etapas necessárias para MySQL Galera (usando Percona XtraDB Cluster) e MariaDB Galera Cluster.

Observe que as configurações mostradas neste blog são baseadas no ambiente Apache Tomcat. Se você estiver usando JBOSS ou Wildfly, a configuração do armazenamento de dados será um pouco diferente. Consulte a documentação do Camunda para obter detalhes.

MySQL Galera Cluster (com ProxySQL e Keepalived)


Usaremos o ClusterControl para implantar o cluster Galera baseado em MySQL com o Percona XtraDB Cluster. Existem algumas limitações relacionadas ao Galera mencionadas nos documentos do Camunda em torno do tratamento de conflitos de vários gravadores do Galera e do nível de isolamento do InnoDB. Caso você seja afetado por isso, a maneira mais segura é usar a abordagem de gravador único, que é possível com a configuração do grupo de hosts ProxySQL. Para não fornecer um único ponto de falha, implantaremos duas instâncias do ProxySQL e as vincularemos a um endereço IP virtual do Keepalived.

O diagrama a seguir ilustra nossa arquitetura final:

Primeiro, implante um Percona XtraDB Cluster 5.7 de três nós. Instale o ClusterControl, gere uma chave SSH e configure o SSH sem senha do host ClusterControl para todos os nós (incluindo ProxySQL). No nó ClusterControl, faça:
$ 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

Antes de implantar nosso cluster, temos que modificar o arquivo de modelo de configuração do MySQL que o ClusterControl usará ao instalar os servidores MySQL. O nome do arquivo de modelo é my57.cnf.galera e está localizado em /usr/share/cmon/templates/ no host ClusterControl. Certifique-se de que as seguintes linhas existam na seção [mysqld]:
[mysqld]
...
transaction-isolation=READ-COMMITTED
wsrep_sync_wait=7
...

Salve o arquivo e estamos prontos. Os requisitos acima são conforme declarados nos documentos do Camunda, especialmente no isolamento de transações com suporte para Galera. A variável wsrep_sync_wait é definida como 7 para executar verificações de causalidade em todo o cluster para instruções READ (incluindo SELECT, SHOW e BEGIN ou START TRANSACTION), UPDATE, DELETE, INSERT e REPLACE, garantindo que a instrução seja executada em um nó totalmente sincronizado. Lembre-se de que um valor diferente de 0 pode resultar em aumento da latência.

Vá para ClusterControl -> Deploy -> MySQL Galera e especifique os seguintes detalhes (se não mencionados, use o valor padrão):
  • Usuário SSH:root
  • Caminho da chave SSH:/root/.ssh/id_rsa
  • Nome do cluster:Percona XtraDB Cluster 5.7
  • Fornecedor:Percona
  • Versão:5.7
  • Senha de administrador/raiz:{especifique uma senha}
  • Adicionar nó:192.168.0.21 (pressione Enter), 192.168.0.22 (pressione Enter), 192.168.0.23 (pressione Enter)

Certifique-se de ter todos os tiques verdes, indicando que o ClusterControl pode se conectar ao nó sem senha. Clique em "Implantar" para iniciar a implantação.

Crie o banco de dados, usuário MySQL e senha em um dos nós do banco de dados:
mysql> CREATE DATABASE camunda;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON camunda.* TO [email protected]'%';

Ou na interface do ClusterControl, você pode usar Gerenciar -> Esquema e usuários em vez de:

Depois que o cluster for implantado, instale o ProxySQL acessando ClusterControl -> Manage -> Load Balancer -> ProxySQL -> Deploy ProxySQL e insira os seguintes detalhes:
  • Endereço do servidor:192.168.0.11
  • Senha de administração:
  • Senha do Monitor:
  • Usuário do banco de dados:camunda
  • Senha do banco de dados:passw0rd
  • Você está usando transações implícitas?:Sim

Repita a etapa de implantação do ProxySQL para a segunda instância do ProxySQL, alterando o Endereço do servidor valor para 192.168.0.12. O endereço IP virtual fornecido pelo Keepalived requer pelo menos duas instâncias do ProxySQL implantadas e em execução. Por fim, implante o endereço IP virtual acessando ClusterControl -> Manage -> Load Balancer -> Keepalived e escolha os dois nós ProxySQL e especifique o endereço IP virtual e a interface de rede para o VIP escutar:

Nosso back-end de banco de dados agora está completo. Em seguida, importe os arquivos SQL para o Galera Cluster como o usuário MySQL criado. No servidor de aplicativos, vá para o diretório "sql" e importe-os para um dos nós Galera (escolhemos 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 não fornece conector MySQL para Java, pois seu banco de dados padrão é H2. No servidor de aplicativos, baixe o MySQL Connector/J da página de download do MySQL e copie o arquivo JAR no diretório bin do 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/

Em seguida, defina a variável de ambiente CLASSPATH para incluir o conector de banco de dados. Abra o setenv.sh usando o editor de texto:
$ vim ~/camunda/server/apache-tomcat-9.0.12/bin/setenv.sh

E adicione a seguinte linha:
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/mysql-connector-java-8.0.15.jar

Abra ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml e altere as linhas relacionadas ao armazenamento de dados. Especifique o endereço IP virtual como o host MySQL na string de conexão, com a porta 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"
              ...
/>

Finalmente, podemos iniciar o serviço Camunda executando start-camunda.sh roteiro:
$ 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.

Certifique-se de que o CLASSPATH mostrado na saída inclua o caminho para o arquivo MySQL Connector/J JAR. Após a conclusão da inicialização, você pode acessar os aplicativos Web Camunda na porta 8080 em http://192.168.0.8:8080/camunda/ . O nome de usuário padrão é demo com a senha 'demo':

Você pode ver as consultas de captura resumidas de Nodes -> ProxySQL -> Principais consultas , indicando que o aplicativo está interagindo corretamente com o Galera Cluster:

Não há divisão de leitura/gravação configurada para ProxySQL. Camunda usa "SET autocommit=0" em cada instrução SQL para inicializar a transação e a melhor maneira para o ProxySQL lidar com isso enviando todas as consultas para os mesmos servidores backend do grupo de host de destino. Este é o método mais seguro juntamente com uma melhor disponibilidade. No entanto, todas as conexões podem chegar a um único servidor, portanto, não há balanceamento de carga.

MariaDB Galera


O MariaDB Connector/J é capaz de lidar com uma variedade de modos de conexão - failover, sequencial, replicação e aurora - mas o Camunda suporta apenas failover e sequencial. Retirado da documentação do MariaDB Connector/J:
Modo Descrição
sequencial
(disponível desde 1.3.0)
Este modo suporta failover de conexão em um ambiente multimestre, como o MariaDB Galera Cluster. Este modo não suporta leituras de balanceamento de carga em escravos. O conector tentará se conectar aos hosts na ordem em que foram declarados na URL de conexão, de modo que o primeiro host disponível seja usado para todas as consultas. Por exemplo, digamos que a URL de conexão seja a seguinte:
jdbc:mariadb:sequential:host1,host2,host3/testdb
Quando o conector tenta se conectar, ele sempre tentará o host1 primeiro. Se esse host não estiver disponível, ele tentará o host2. etc. Quando um host falha, o conector tenta se reconectar aos hosts na mesma ordem.
failover
(disponível desde 1.2.0)
Este modo suporta failover de conexão em um ambiente multimestre, como o MariaDB Galera Cluster. Este modo não suporta leituras de balanceamento de carga em escravos. O conector executa o balanceamento de carga para todas as consultas escolhendo aleatoriamente um host no URL de conexão para cada conexão, de modo que as consultas terão balanceamento de carga como resultado das conexões serem distribuídas aleatoriamente em todos os hosts.

O uso do modo "failover" apresenta um risco potencial maior de deadlock, pois as gravações serão distribuídas para todos os servidores de back-end quase igualmente. A abordagem de gravador único é uma maneira segura de executar, o que significa que o uso do modo sequencial deve fazer o trabalho muito bem. Você também pode ignorar a camada do balanceador de carga na arquitetura. Assim, com o conector Java do MariaDB, podemos implantar nossa arquitetura da forma mais simples abaixo:

Antes de implantarmos nosso cluster, modifique o arquivo de modelo de configuração do MariaDB que o ClusterControl usará ao instalar os servidores MariaDB. O nome do arquivo de modelo é my.cnf.galera e está localizado em /usr/share/cmon/templates/ no host ClusterControl. Certifique-se de que as seguintes linhas existam na seção [mysqld]:
[mysqld]
...
transaction-isolation=READ-COMMITTED
wsrep_sync_wait=7
performance_schema = ON
...

Salve o arquivo e estamos prontos. Um pouco de explicação, a lista acima são os requisitos conforme declarados nos documentos do Camunda, especialmente no isolamento de transação suportado para Galera. A variável wsrep_sync_wait é definida como 7 para executar verificações de causalidade em todo o cluster para instruções READ (incluindo SELECT, SHOW e BEGIN ou START TRANSACTION), UPDATE, DELETE, INSERT e REPLACE, garantindo que a instrução seja executada em um nó totalmente sincronizado. Lembre-se de que um valor diferente de 0 pode resultar em aumento da latência. A habilitação do Performance Schema é opcional para o recurso de monitoramento de consulta ClusterControl.

Agora podemos iniciar o processo de implantação do cluster. Instale o ClusterControl, gere uma chave SSH e configure o SSH sem senha do host ClusterControl para todos os nós Galera. No nó ClusterControl, faça:
$ 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

Vá para ClusterControl -> Deploy -> MySQL Galera e especifique os seguintes detalhes (se não mencionados, use o valor padrão):
  • Usuário SSH:root
  • Caminho da chave SSH:/root/.ssh/id_rsa
  • Nome do cluster:MariaDB Galera 10.3
  • Fornecedor:MariaDB
  • Versão:10.3
  • Senha de administrador/raiz:{especifique uma senha}
  • Adicionar nó:192.168.0.41 (pressione Enter), 192.168.0.42 (pressione Enter), 192.168.0.43 (pressione Enter)

Certifique-se de ter todos os tiques verdes ao adicionar nós, indicando que o ClusterControl pode se conectar ao nó sem senha. Clique em "Implantar" para iniciar a implantação.

Crie o banco de dados, usuário MariaDB e senha em um dos nós Galera:
mysql> CREATE DATABASE camunda;
mysql> CREATE USER [email protected]'%' IDENTIFIED BY 'passw0rd';
mysql> GRANT ALL PRIVILEGES ON camunda.* TO [email protected]'%';

Para o usuário do ClusterControl, você pode usar ClusterControl -> Manage -> Schema and Users em vez de:

Nossa implantação de cluster de banco de dados agora está concluída. Em seguida, importe os arquivos SQL para o cluster MariaDB. No servidor de aplicação, vá para o diretório "sql" e importe-os para um dos nós MariaDB (escolhemos 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

O Camunda não fornece o conector MariaDB para Java, pois seu banco de dados padrão é H2. No servidor de aplicativos, baixe o MariaDB Connector/J da página de download do MariaDB e copie o arquivo JAR no diretório bin do 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/

Em seguida, defina a variável de ambiente CLASSPATH para incluir o conector de banco de dados. Abra o setenv.sh através do editor de texto:
$ vim ~/camunda/server/apache-tomcat-9.0.12/bin/setenv.sh

E adicione a seguinte linha:
export CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/mariadb-java-client-2.4.1.jar

Abra ~/camunda/server/apache-tomcat-9.0.12/conf/server.xml e altere as linhas relacionadas ao armazenamento de dados. Use o protocolo de conexão sequencial e liste todos os nós Galera separados por vírgula na string de conexão:
<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"
              ...
/>

Finalmente, podemos iniciar o serviço Camunda executando start-camunda.sh roteiro:
$ 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.

Certifique-se de que o CLASSPATH mostrado na saída inclua o caminho para o arquivo JAR do cliente Java MariaDB. Após a conclusão da inicialização, você pode acessar os aplicativos Web Camunda na porta 8080 em http://192.168.0.8:8080/camunda/ . O nome de usuário padrão é demo com a senha 'demo':

Você pode ver as consultas de captura resumidas em ClusterControl -> Monitor de consultas -> Principais consultas , indicando que o aplicativo está interagindo corretamente com o MariaDB Cluster:

Com o MariaDB Connector/J, não precisamos da camada do balanceador de carga, o que simplifica nossa arquitetura geral. O modo de conexão sequencial deve fazer o truque para evitar deadlocks de vários gravadores - o que pode acontecer no Galera. Essa configuração fornece alta disponibilidade com cada instância do Camunda configurada com JDBC para acessar o cluster de nós MySQL ou MariaDB. O Galera se encarrega de sincronizar os dados entre as instâncias do banco de dados em tempo real.