6.2. Clusterização de Pacote Genérico
6.2.1. Configurando um Cluster
Para clusterizar seu repositório GIT (VFS) no Business Central, faça o seguinte (se você não utiliza o Business Central, você pode ignorar esta seção):
- Baixe o
jboss-bpmsuite-brms-VERSION-supplementary-tools.zip
, que contém Apache Zookeeper, Apache Helix e scripts DDL do Quartz. Depois de baixar, descompacte o arquivo: o diretórioZookeeper
($ZOOKEEPER_HOME
) e o diretórioHelix
($HELIX_HOME
) são criados. - Agora, configue o ZooKeeper:
- No diretório ZooKeeper, vá para o diretório
conf
e siga as instruções a seguir:cp zoo_sample.cfg zoo.cfg
- Abra
zoo.cfg
para edição e ajuste as configurações, incluindo:# o diretório onde o instantâneo está armazenado. dataDir=$ZOOKEEPER_HOME/data/ # a porta na qual os clientes conectam clientPort=2181 server.1=server1:2888:3888 server.2=server2:2888:3888 server.3=server3:2888:3888
Certifique-se de que o local dataDir existe e está acessível. - Atribua uma ID de nó a cada membro que executará o ZooKeeper. Por exemplo, use "1", "2" e "3" para o nó 1, o nó 2 e o nó 3, respectivamente. O ZooKeeper deve ter um número ímpar de instâncias, no mínimo 3, para recuperar-se de falhas.A ID de nó é especificada em um campo chamado
myid
sob o diretório de dados do ZooKeeper em cada nó. Por exemplo, no nó 1, execute:$ echo "1" > /zookeeper/data/myid
- Configure o ZooKeeper para que você possa usá-lo quando estiver criando o cluster com Helix:
- Vá para o diretório
$ZOOKEEPER_HOME/bin/
e inicie o ZooKeeper:./zkServer.sh start
O log do ZooKeeper pode ser verificado no arquivo$ZOOKEEPER_HOME/bin/zookeeper.out
. Verifique esse log e certifique-se de que o 'ensemble' (cluster) foi formado com êxito. Um dos nós deve ser eleito o líder com os outros dois nós seguindo-o.
- Depois que o ensemble do ZooKeeper é iniciado, o próximo passo é configurar e iniciar o Helix. O Helix precisa ser configurado somente uma vez e de um único nó. A configuração é em seguida armazenada pelo ensemble do ZooKeeper e compartilhada quando conveniente.Configure o cluster com o servidor ZooKeeper como o mestre (em inglês, master) da configuração:
- Crie o cluster fornecendo a porta e o host do ZooKeeper em uma lista separada por vírgulas:
$HELIX_HOME/bin/helix-admin.sh --zkSvr ZOOKEEPER_HOST:ZOOKEEPER_PORT --addCluster CLUSTER_NAME
- Adicione os seus nós ao cluster:
$HELIX_HOME/bin/helix-admin.sh --zkSvr ZOOKEEPER_HOST:ZOOKEEPER_PORT --addNode CLUSTER_NAME NODE_NAMEUNIQUE_ID
Exemplo 6.8. Adicionando Três Nós de Cluster
./helix-admin.sh --zkSvr server1:2181,server2:2181,server3:2181 --addNode bpms-cluster nodeOne:12345 ./helix-admin.sh --zkSvr server1:2181,server2:2181,server3:2181 --addNode bpms-cluster nodeTwo:12346 ./helix-admin.sh --zkSvr server1:2181,server2:2181,server3:2181 --addNode bpms-cluster nodeThree:12347
- Adicione os recursos ao cluster:
Exemplo 6.9. Adicionando vfs-repo como Recurso
./helix-admin.sh --zkSvr server1:2181,server2:2181,server3:2181 --addResource bpms-cluster vfs-repo 1 LeaderStandby AUTO_REBALANCE
- Redistribua o cluster com os três nós.
Exemplo 6.10. Redistribuindo bpms-cluster
./helix-admin.sh --zkSvr server1:2181,server2:2181,server3:2181 --rebalance bpms-cluster vfs-repo 3
No comando acima,3
significa três nós do zookeeper. - Inicie o controlador Helix em todos os nós no cluster.
Exemplo 6.11. Iniciando o Controlador Helix
./run-helix-controller.sh --zkSvr server1:2181,server2:2181,server3:2181 --cluster bpms-cluster 2>&1 > /tmp/controller.log &
Nota
O ZooKeeper deve ter um número ímpar de instâncias, no mínimo 3, para recuperar-se de falhas. Após a ocorrência de uma falha, o número de nós restante ainda precisa constituir a maioria. Por exemplo, um cluster composto de cinco nós do ZooKeeper pode resistir à perda de dois nós e recuperar-se completamente. Uma única instância do ZooKeeper também é possível, a replicação funcionará, porém não há possibilidade de recuperação, caso ocorram falhas.
Encerrando Helix e ZooKeeper
Para encerrar os processos do Helix e o servidor do ZooKeeper, utilize o procedimento a seguir.
Procedimento 6.1. Encerrando Helix e ZooKeeper
- Encerre os processos do servidor do JBoss EAP.
- Encerre o processo do Helix que foi criado pelo
run-helix-controller.sh
, por exemplo,kill -15 <pid of HelixControllerMain>
. - Encerre o servidor do ZooKeeper usando o comando
zkServer.sh stop
.
6.2.2. Configurando o Quartz
Nota
Se você não estiver usando o Quartz (temporizadores) nos seus processos de negócios, ou se não estiver utilizando o Servidor de Execução, você pode ignorar essa seção. Observe que, caso queira replicar os temporizadores nos seus processos de negócios, você precisará usar o componente do Quartz.
Antes de configurar o banco de dados no seu servidor de aplicativos, você precisa preparar o banco de dados para o Quartz para criar as tabelas do Quartz, que manterão os dados do temporizador, e o arquivo de definição do Quartz.
Para realizar a configuração, siga as instruções a seguir:
- Configure o banco de dados. Certifique-se de usar uma das fontes de dados com suporte sem JTA. Observe que, pelo fato do Quartz precisar de uma fonte de dados sem JTA, você não pode usar a fonte de dados do Business Central. No código de exemplo, o PostgreSQL é usado com o usuário
bpms
e a senhabpms
. Esse banco de dados precisará ser conectado ao seu servidor de aplicativo, portanto mantenha um registro nas credenciais e nas informações do banco de dados. - Crie tabelas do Quartz no seu banco de dados para permitir a sincronização dos eventos do temporizador. Para fazer isso, utilize o script DDL para o seu banco de dados, disponível no arquivo zip suplementar extraído em
$QUARTZ_HOME/docs/dbTables
. - Crie o arquivo de configuração do Quartz
quartz-definition.properties
no diretório$JBOSS_HOME/PROFILE/configuration/
e defina as propriedades do Quartz.Exemplo 6.12. Arquivo de Configuração do Quartz para um Banco de Bados PostgreSQL
#============================================================================ # Configure Main Scheduler Properties #============================================================================ org.quartz.scheduler.instanceName = jBPMClusteredScheduler org.quartz.scheduler.instanceId = AUTO #============================================================================ # Configure ThreadPool #============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 5 org.quartz.threadPool.threadPriority = 5 #============================================================================ # Configure JobStore #============================================================================ org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreCMT org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate org.quartz.jobStore.useProperties=false org.quartz.jobStore.dataSource=managedDS org.quartz.jobStore.nonManagedTXDataSource=notManagedDS org.quartz.jobStore.tablePrefix=QRTZ_ org.quartz.jobStore.isClustered=true org.quartz.jobStore.clusterCheckinInterval = 20000 #============================================================================ # Configure Datasources #============================================================================ org.quartz.dataSource.managedDS.jndiURL=jboss/datasources/psbpmsDS org.quartz.dataSource.notManagedDS.jndiURL=jboss/datasources/quartzNotManagedDS
Observe as fontes de dados, que acomodarão os dois esquemas do Quartz, configuradas bem no fim do arquivo.Importante
O intervalo recomendado para a descoberta do cluster é de 20 segundos e está definido em org.quartz.jobStore.clusterCheckinInterval do arquivoquartz-definition.properties
. Leve em consideração o impacto no desempenho e modifique a sua configuração, conforme necessário.Observe também a propriedade org.quartz.jobStore.driverDelegateClass que define o dialeto DB a ser usado quando comunicando-se com o banco de dados definido (nesse caso,org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
. Quando estiver usando Oracle, utilizeorg.quartz.impl.jdbcjobstore.oracle.OracleDelegate
).