Tiago Tartari

Conteúdo

Como configurar o Apache NiFi para trabalhar em cluster com Zookeeper

Neste artigo, você vai aprender como configurar o Apache NiFi para trabalhar em cluster com Zookeeper. Você vai entender o que é um cluster NiFi, e por que ele é importante para garantir a alta disponibilidade, escalabilidade e consistência dos seus fluzos de dados. Você também vai aprender como configurar o Zookeeper Embedded, que é uma opção mais simples e rápida para subir um cluster NiFi. Você também vai aprender como configurar o NiFi em cada nó, usando o arquivo nifi.properties, zookeeper.properties e state-management.xml e como iniciar o cluster NiFi.

Ao final do artigo, você será capaz de:

  • Definir o que é um cluster NiFi, e quais são as suas vantagens e desafios.
  • Conhecer o papel do Zookeeper como um serviço de coordenação externo para o cluster NiFi.
  • Configurar o Zookeeper embutido, usando o arquivo zookeeper.properties e o arquivo myid.
  • Configurar o NiFi em cada nó, usando o arquivo nifi.properties, zookeeper.properties e state-management.xml
  • Verificar o status e os detalhes do cluster NiFi, usando o ícone do cluster na interface web do NiFi.

Artigos Anteriores

Este artigo faz parte de uma série de artigos sobre arquitetura de integração com Apache NiFi. Se você ainda não leu os artigos anteriores, eu recomendo que você faça isso antes de continuar. Aqui estão os links dos artigos anteriores:

Curso de Arquitetura de Integração com Apache NiFi

Configurando o Zookeeper Embedded

A configuração do Zookeeper Embedded e tornar o NiFi como um nó do seu cluster, necessariamente precisará alterar três arquivos de configuração. Lembre-se as configurações devem ser feitas em cada nó do seu cluster.

zookeeper.properties

O arquivo zookeeper.properties define as propriedades do Zookeeper, que é um serviço de coordenação externo que o cluster NiFi usa para se comunicar e se sincronizar entre os nós. Para configurar o cluster NiFi, você precisa editar o arquivo zookeeper.properties em cada nó do cluster. As propriedades desse arquivo são:

  • dataDir: o diretório onde o Zookeeper armazena os dados persistentes. Vamos usar o diretório padrão, que é ./state/zookeeper.
  • tickTime: o tempo básico em milissegundos que o Zookeeper usa para medir o tempo.
  • initLimit: o número de ticks que o Zookeeper espera para se conectar a um líder.
  • syncLimit: o número de ticks que o Zookeeper pode ficar fora de sincronia com um líder.
  • server.X: a configuração de cada servidor do Zookeeper, onde X é um número que identifica o servidor. Cada configuração deve ter o formato server.X=hostname:peerPort:leaderPort, onde hostname é o nome ou o endereço IP do servidor, peerPort é a porta que o servidor usa para se comunicar com os outros servidores, e leaderPort é a porta que o servidor usa para se comunicar com o líder. Neste exemplo, vamos usar os seguintes valores:

Além disso, você precisa criar um arquivo chamado myid, que fica no diretório dataDir do Zookeeper. Esse arquivo deve conter um número que identifica o servidor do Zookeeper, e que deve ser o mesmo que o X da propriedade server.X.

Depois de editar o zookeeper.properties e criar o arquivo myid você deve iniciar a configuração do arquivo state-management.xml.

state-management.xml

O arquivo state-management.xml define os provedores de estado, que são responsáveis por armazenar e recuperar o estado dos componentes do NiFi, como os processadores, os controladores e os grupos de processos. Para configurar o cluster NiFi, você precisa definir um provedor de estado que usa o Zookeeper como fonte de dados. As propriedades desse provedor de estado são:

  • zk-provider: um provedor de estado que usa o Zookeeper para armazenar e recuperar o estado dos componentes do NiFi. Esse provedor é recomendado para o cluster NiFi, pois garante a consistência do estado entre os nós. As propriedades desse provedor são:
  • id: o identificador único do provedor de estado. Vamos usar o valor zk-provider.
  • class: a classe Java que implementa o provedor de estado. Vamos usar o valor org.apache.nifi.controller.state.providers.zookeeper.ZooKeeperStateProvider.
  • Connect String: a string de conexão com o Zookeeper, que deve ter o mesmo formato e valor que a propriedade nifi.zookeeper.connect.string do arquivo nifi.properties. Neste exemplo, vamos usar o valor nifi01:2181,nifi02:2181.
  • Root Node: o nó raiz do Zookeeper onde o provedor de estado armazena o estado dos componentes do NiFi. Vamos usar o valor /nifi.
  • Session Timeout: o tempo máximo em milissegundos que o provedor de estado espera para se conectar ao Zookeeper. Vamos usar o valor 10 seconds.
  • Access Control: o nível de controle de acesso que o provedor de estado aplica aos dados armazenados no Zookeeper. Vamos usar o valor Open, que significa que qualquer cliente do Zookeeper pode ler e escrever os dados.

nifi.properties

O arquivo nifi.properties define as propriedades do NiFi, que são usadas para configurar o comportamento e a aparência do NiFi. Para configurar o cluster NiFi, você precisa editar o arquivo nifi.properties em cada nó do cluster. As propriedades desse arquivo são:

Essas propriedades são usadas para configurar o NiFi para trabalhar em cluster com Zookeeper embutido. Elas significam o seguinte:

  • nifi.state.management.provider.cluster: define qual provedor de estado o NiFi usa para guardar o estado dos componentes do cluster. O valor deve ser o id de um provedor de estado que usa o Zookeeper. Neste caso usamos zk-provider.
  • nifi.state.management.embedded.zookeeper.start: define se o NiFi deve iniciar o Zookeeper embutido junto com o NiFi. O valor deve ser true ou false. Neste caso usamos true, que é mais simples e rápido.

Essas propriedades são usadas para configurar o NiFi para receber conexões remotas de outros nós do cluster. Elas significam o seguinte:

  • nifi.remote.input.host: define o endereço IP ou o nome do host que o NiFi usa para receber conexões remotas. Neste caso usamos nifi01, que é o nome do nosso nó primário.
  • nifi.remote.input.secure: define se o NiFi deve usar uma conexão segura (HTTPS) para receber conexões remotas. Neste caso usamos true, que significa que estamos usando uma conexão segura, mas que requer a configuração de certificados e chaves para o NiFi.
  • nifi.remote.input.socket.port: define a porta que o NiFi usa para receber conexões remotas. Neste caso usamos a porta 10443, que é uma porta diferente da porta padrão, que é 8081. Isso não é um problema, desde que usemos a mesma porta em todos os nós do cluster, e que a porta esteja disponível e não seja usada por outra aplicação.
  • nifi.remote.input.http.enabled: define se o NiFi deve usar uma conexão HTTP para receber conexões remotas. Neste caso usamos false, que significa que estamos desabilitando a conexão HTTP, e que requer que todos os nós do cluster usem uma conexão segura (HTTPS).

Essas propriedades são usadas para configurar o NiFi para se comunicar com a web. Elas significam o seguinte:

  • nifi.web.http.host: define o endereço IP ou o nome do host que o NiFi usa para se comunicar com a web usando o protocolo HTTP. Neste caso usamos nifi01, que é o nome do nosso nó.
  • nifi.web.http.port: define a porta que o NiFi usa para se comunicar com a web usando o protocolo HTTP. Neste caso usamos a porta padrão, que é 8080.
  • nifi.web.https.host: define o endereço IP ou o nome do host que o NiFi usa para se comunicar com a web usando o protocolo HTTPS. Neste caso deixamos em branco, o que significa que não estamos usando o protocolo HTTPS.
  • nifi.web.https.port: define a porta que o NiFi usa para se comunicar com a web usando o protocolo HTTPS. Neste caso deixamos em branco, o que significa que não estamos usando o protocolo HTTPS.
  • nifi.web.proxy.host: define o endereço IP ou o nome do host que o NiFi usa para se comunicar com a web quando o NiFi está atrás de um proxy. Neste caso usamos vários valores, separados por vírgulas, que são os endereços IP ou os nomes dos hosts que o NiFi pode usar para se comunicar com a web. Isso significa que estamos usando um proxy para o NiFi, o que é uma opção que pode melhorar a performance e a segurança do NiFi, mas que requer a configuração do proxy.

Essas propriedades são usadas para configurar o NiFi para trabalhar em cluster com outros nós. Elas significam o seguinte:

  • nifi.cluster.protocol.is.secure: define se o NiFi deve usar uma conexão segura (HTTPS) para se comunicar com o cluster. Neste caso usamos false, que significa que estamos usando uma conexão não segura (HTTP), mas que é mais simples e rápida de configurar.
  • nifi.cluster.is.node: define se o NiFi está rodando em modo cluster. Neste caso usamos true, que significa que estamos habilitando o modo cluster.
  • nifi.cluster.node.address: define o endereço IP ou o nome do host que o NiFi usa para se comunicar com o cluster. Neste caso usamos nifi01, que é o nome do nosso nó.
  • nifi.cluster.node.protocol.port: define a porta que o NiFi usa para se comunicar com o cluster. Neste caso usamos a porta 11443, que é uma porta diferente da porta padrão, que é 8081. Isso não é um problema, desde que usemos a mesma porta em todos os nós do cluster, e que a porta esteja disponível e não seja usada por outra aplicação.

Essas propriedades são usadas para configurar o NiFi para distribuir a carga de trabalho entre os nós do cluster. Elas significam o seguinte:

  • nifi.cluster.load.balance.host: define o endereço IP ou o nome do host que o NiFi usa para enviar os dados para outros nós do cluster. Neste caso usamos nifi01, que é o nome do nosso nó primário.
  • nifi.cluster.load.balance.port: define a porta que o NiFi usa para enviar os dados para outros nós do cluster. Neste caso usamos a porta 6342, que é uma porta diferente da porta padrão, que é 6341. Isso não é um problema, desde que usemos a mesma porta em todos os nós do cluster, e que a porta esteja disponível e não seja usada por outra aplicação.

Essas propriedades são usadas para configurar o NiFi para se conectar ao Zookeeper. Elas significam o seguinte:

  • nifi.zookeeper.connect.string: define a string de conexão com o Zookeeper, que deve ter o formato hostname:port,hostname:port,…, onde hostname é o nome ou o endereço IP do servidor do Zookeeper, e port é a porta que o Zookeeper usa para se comunicar com os clientes. Neste caso usamos nifi01:2181,nifi02:2181, que são os nomes e as portas dos nossos servidores do Zookeeper.
  • nifi.zookeeper.connect.timeout: define o tempo máximo em milissegundos que o NiFi espera para se conectar ao Zookeeper. Neste caso usamos 10 secs, que significa que o NiFi tenta se conectar ao Zookeeper por 10 segundos antes de desistir.
  • nifi.zookeeper.session.timeout: define o tempo máximo em milissegundos que o NiFi espera para manter uma sessão ativa com o Zookeeper. Neste caso usamos 10 secs, que significa que o NiFi mantém uma sessão com o Zookeeper por 10 segundos antes de ser considerado desconectado.
  • nifi.zookeeper.root.node: define o nó raiz do Zookeeper onde o NiFi armazena as informações do cluster, como os nós, os grupos e as versões. Neste caso usamos /nifi, que significa que o NiFi usa o nó /nifi como o nó raiz.

Com isso, você concluiu a configuração do cluster NiFi com Zookeeper embutido. Agora você pode acessar a interface web do NiFi e criar e gerenciar fluxos de dados no cluster NiFi.

Como configurar o Apache NiFi para trabalhar em cluster com Zookeeper Como configurar o Apache NiFi para trabalhar em cluster com Zookeeper

Tiago Tartari

Tiago Tartari

Eu ajudo e capacito pessoas e organizações a transformar problemas complexos em soluções práticas usando a tecnologia para atingir resultados extraordinários.

Histórias de sucesso

EximiaCo
Centauro
Braspress
Tok&Stok