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):
  1. 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ório Zookeeper ($ZOOKEEPER_HOME) e o diretório Helix ($HELIX_HOME) são criados.
  2. Agora, configue o ZooKeeper:
    1. No diretório ZooKeeper, vá para o diretório conf e siga as instruções a seguir:
      cp zoo_sample.cfg zoo.cfg
    2. 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.
    3. 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
  3. Configure o ZooKeeper para que você possa usá-lo quando estiver criando o cluster com Helix:
    1. 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.
  4. 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:
    1. 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
    2. 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
  5. 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
  6. 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.
  7. 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

  1. Encerre os processos do servidor do JBoss EAP.
  2. Encerre o processo do Helix que foi criado pelo run-helix-controller.sh, por exemplo, kill -15 <pid of HelixControllerMain>.
  3. 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:
  1. 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 senha bpms. 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.
  2. 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.
  3. 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 arquivo quartz-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, utilize org.quartz.impl.jdbcjobstore.oracle.OracleDelegate).