Tutorial

Como instalar o Apache Kafka no Ubuntu 18.04

UbuntuApacheMessagingJavaUbuntu 18.04

O autor selecionou o Free and Open Source Fund para receber uma doação como parte do programa Write for DOnations.

Introdução

O Apache Kafka é um message broker popularmente distribuído projetado para lidar de forma eficiente com grandes volumes de dados em tempo real. Um cluster Kafka é não só altamente escalável e tolerante a falhas, mas ele também tem uma taxa de transferência muito mais alta comparada com outros message brokers como o ActiveMQ e o RabbitMQ. Embora ele seja geralmente usado como um sistema de mensagens publicar/assinar, muitas organizações também o usam para a agregação de registros porque ele oferece armazenamento persistente para mensagens publicadas.

Um sistema de mensagens publicar/assinar permite que um ou mais produtores publiquem mensagens sem considerar o número de consumidores ou como irão processar as mensagens. Clientes assinantes são notificados automaticamente sobre atualizações e a criação de novas mensagens. Este sistema é mais eficiente e escalável do que sistemas onde clientes questionam periodicamente para determinar se novas mensagens estão disponíveis.

Neste tutorial, você instalará e usará o Apache Kafka 2.1.1 no Ubuntu 18.04.

Pré-requisitos

Para acompanhar, você precisará de:

  • Um servidor Ubuntu 18.04 e um usuário que não seja o root com privilégios sudo. Siga os passos especificados neste guia se não tiver um usuário que não seja root configurado.
  • Pelo menos 4GB de RAM no servidor. As instalações sem essa quantidade de RAM podem fazer com que o serviço Kafka falhe, com a máquina virtual Java (JVM) que lança uma exceção “Fora de Memória” durante a inicialização.
  • OpenJDK 8 instalado no seu servidor. Para instalar essa versão, siga essas instruções sobre a instalação de versões específicas do OpenJDK. O Kafka está escrito em Java, de modo que ele exige um JVM; no entanto, o script de inicialização shell possui um erro de detecção de versão que faz com que ele não comece com versões JVM acima de 8.

Passo 1 — Criando um Usuário para o Kafka

Uma vez que o Kafka pode lidar com pedidos em uma rede, você deve criar um usuário dedicado para ele. Isso minimiza os danos na sua máquina Ubuntu caso o servidor Kafka seja comprometido. Criaremos um usuário *kafka *dedicado neste passo, mas você deve criar um usuário que não seja root para executar outras tarefas neste servidor uma vez que você tenha terminado de configurar o Kafka.

Logado como usuário sudo que não seja root, crie um usuário chamado kafka com o comando useradd:

  • sudo useradd kafka -m

A flag -m garante que um diretório home seja criada para o usuário. Este diretório home, /home/kafka, agirá como nossa pasta de trabalho para executar comandos nas seções abaixo.

Defina a senha usando passwd:

  • sudo passwd kafka

Adicione o usuário *kafka *ao grupo sudo com o comando adduser, de modo que ele tenha os privilégios necessários para instalar as dependências do Kafka:

  • sudo adduser kafka sudo

Seu usuário** kafka** agora está pronto. Logue nesta conta usando su:

  • su -l kafka

Agora que criamos o usuário específico do Kafka, podemos seguir para o download e extração dos binários Kafka.

Passo 2 — Fazendo download e Extraindo os Binários Kafka

Vamos baixar e extrair os binários Kafka em pastas dedicadas no diretório home do nosso usuário kafka.

Para começar, crie uma pasta em /home/kafka chamada Downloads para armazenar os seus downloads:

  • mkdir ~/Downloads

Use curl para baixar os binários Kafka:

  • curl "https://www.apache.org/dist/kafka/2.1.1/kafka_2.11-2.1.1.tgz" -o ~/Downloads/kafka.tgz

Crie um diretório chamado kafka e mude para este diretório. Este é o diretório base da instalação do Kafka:

  • mkdir ~/kafka && cd ~/kafka

Extraia o arquivo que você baixou usando o comando tar:

  • tar -xvzf ~/Downloads/kafka.tgz --strip 1

Especificamos a flag --strip 1 para garantir que o conteúdo do arquivo seja extraído efetivamente em ~/kafka/ e não em outro diretório (como ~/kafka/kafka_2.11-2.1.1/) dentro dele.

Agora que baixamos e extraímos os binários com sucesso, podemos começar a configurar para que o Kafka permita que deletemos tópicos.

Passo 3 — Configurando o Servidor do Kafka

O comportamento padrão do Kafka não nos permitirá excluir um um_ tópico_, a categoria, grupo ou nome do feed para os quais mensagens podem ser publicadas. Para modificar isso, vamos editar o arquivo de configuração.

As opções de configuração do Kafka são especificadas em server.properties. Abra este arquivo com o nano ou seu editor favorito:

  • nano ~/kafka/config/server.properties

Vamos adicionar um valor que nos permitirá excluir tópicos do Kafka. Adicione o seguinte ao final do arquivo:

~/kafka/config/server.properties
delete.topic.enable = true

Salve o arquivo e saia do nano. Agora que configuramos o Kafka, podemos seguir para a criação de arquivos de unidade systemd para a executá-lo e permiti-lo na inicialização.

Passo 4 — Criando Arquivos de Unidade Systemd e Iniciando o Servidor do Kafka

Nesta seção, criaremos arquivos de unidade systemd para o serviço do Kafka. Isso nos ajudará a realizar ações de serviço comuns como iniciar, parar e reiniciar o Kafka de uma maneira consistente com outros serviços do Linux.

O Zookeeper é um serviço que o Kafka usa para gerenciar seu estado de cluster e configurações. É geralmente usado em muitos sistemas distribuídos como um componente integral. Se você quer saber mais sobre isso, visite os documentos Zookeeper oficiais.

Crie o arquivo de unidade para o zookeeper:

  • sudo nano /etc/systemd/system/zookeeper.service

Digite a seguinte definição de unidade no arquivo:

/etc/systemd/system/zookeeper.service
[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

A seção [Unit] especifica que o Zookeeper exige conexão em rede e que o sistema de arquivos esteja pronto antes de começar.

A seção [Service] especifica que o systemd deve usar os arquivos de shell zookeeper-server-start.sh e zookeeper-server-start.sh para começar e parar o serviço. Ele também especifica que o Zookeeper deve ser reiniciado automaticamente se ele fechar inexplicavelmente.

A seguir, crie o arquivo de serviço systemd para o kafka:

  • sudo nano /etc/systemd/system/kafka.service

Digite a seguinte definição de unidade no arquivo:

/etc/systemd/system/kafka.service
[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

A seção [Unit] especifica que este arquivo de unidade depende do zookeeper.service. Isso irá garantir que o zookeeper seja iniciado automaticamente quando o serviço kafka começar.

A seção [Service] especifica que o systemd deve usar os arquivos de shell kafka-server-start.sh e kafka-server-stop.sh para começar e parar o serviço. Ele também especifica que o Zookeeper deve ser reiniciado automaticamente se ele fechar inexplicavelmente.

Agora que as unidades foram definidas, inicie o Kafka com o comando a seguir:

  • sudo systemctl start kafka

Para garantir que o servidor inicializou com sucesso, verifique os registros de diário para a unidade kafka:

  • sudo journalctl -u kafka

Você deve ver um resultado similar ao seguinte:

Output
Jul 17 18:38:59 kafka-ubuntu systemd[1]: Started kafka.service.

Agora, você tem um servidor do Kafka escutando na porta 9092.

Enquanto inicializávamos o serviço kafka, se nós pudéssemos reiniciar nosso servidor, ele não seria iniciado automaticamente. Para ativar o kafka na inicialização do servidor, execute:

  • sudo systemctl enable kafka

Agora que começamos e ativamos os serviços, vamos verificar a instalação.

Passo 5 — Testando a Instalação

Vamos publicar e consumir uma mensagem “Hello World” para garantir que o servidor do Kafka está se comportando corretamente. Publicando mensagens no Kafka exige:

  • Um produtor que permite a publicação de registros e dados em tópicos.
  • Um consumidor que lê mensagens e dados de tópicos.

Primeiro, crie um tópico chamado TutorialTopic digitando:

  • ~/kafka/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic TutorialTopic

Você pode criar um produtor a partir da linha de comando usando o script kafka-console-producer.sh. Ele recebe o nome do host do servidor do Kafka, porta e um nome de tópico como argumentos.

Publique o string "Hello, World" no tópico TutorialTopic digitando:

  • echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null

A seguir, você pode criar um consumidor no Kafka usando o script kafka-console-consumer.sh. Ele recebe o nome do host e porta do servidor ZooKeeper, junto com um nome de tópico como argumentos.

O comando a seguir consome mensagens do TutorialTopic. Observe o uso da flag --from-beginning que permite o consumo de mensagens que foram publicadas antes do início do consumidor:

  • ~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning

Se não houver problemas de configuração, você deve ver Hello, World no seu terminal:

Output
Hello, World

O script continuará a executar, esperando que mais mensagens sejam publicadas no tópico. Sinta-se à vontade para abrir um novo terminal e iniciar um produtor para publicar mais algumas mensagens. Você deve poder ver todas elas na saída do consumidor.

Quando você acabar os testes, pressione CTRL+C para parar o script do consumidor. Agora que testamos a instalação, vamos prosseguir para a instalação do KafkaT.

Passo 6 — Instalar o KafkaT (Opcional)

O KafkaT é uma ferramenta do Airbnb que torna mais fácil para você ver detalhes sobre seu cluster do Kafka e executar certas tarefas administrativas da linha de comando. Uma vez que é uma gem Ruby, você precisará do Ruby para usá-la. Você também precisará do pacote build-essential para poder construir outras gems das quais ele depende. Instale-os usando o apt:

  • sudo apt install ruby ruby-dev build-essential

Agora, você pode instalar o KafkaT usando o comando gem:

  • sudo gem install kafkat

O KafkaT usa .kafkatcfg como o arquivo de configuração para determinar os diretórios e registro da instalação do seu servidor do Kafka. Ele também deve ter uma entrada apontando o KafkaT para a sua instância ZooKeeper.

Crie um arquivo novo chamado .kafkatcfg:

  • nano ~/.kafkatcfg

Adicione as linhas a seguir para especificar as informações necessárias sobre o seu servidor do Kafka e a instância do Zookeeper:

~/.kafkatcfg
{
  "kafka_path": "~/kafka",
  "log_path": "/tmp/kafka-logs",
  "zk_path": "localhost:2181"
}

Agora, você está pronto para usar o KafkaT. Para um começo, veja como você usaria ele para ver os detalhes sobre todas as partições do Kafka:

  • kafkat partitions

Você verá o seguinte resultado:

Output
Topic Partition Leader Replicas ISRs TutorialTopic 0 0 [0] [0] __consumer_offsets 0 0 [0] [0] ... ...

Você verá o TutorialTopic, além de __consumer_offsets, um tópico interno usado pelo Kafka para armazenar informações relacionadas ao cliente. Você pode ignorar com segurança linhas começando com __consumer_offsets.

Para aprender mais sobre o KafkaT, consulte o seu repositório do GitHub.

Passo 7 — Configurando um Cluster Multi-Nodal (Opcional)

Se você quer criar um cluster multi-broker usando mais máquinas Ubuntu 18.04, você deve repetir o passo 1, passo 4, e o passo 5 em cada uma das novas máquinas. Além disso, você deve fazer as seguintes alterações no arquivo server.properties para cada um deles:

  • O valor da propriedade broker.id deve ser alterado de modo que ele seja único ao longo do cluster. Esta propriedade identifica separadamente cada servidor no cluster e pode ter qualquer string como seu valor. Por exemplo, "server1", "server2", etc.

  • O valor da propriedade zookeeper.connect deve ser alterado de modo que todos os nós apontem para a mesma instância do ZooKeeper. Esta propriedade especifica o endereço da instância do Zookeeper e segue o formato :<PORT>. Por exemplo, "203.0.113.0:2181", "203.0.113.1:2181" etc.

Se você quer ter várias instâncias do ZooKeeper para o seu cluster, o valor da propriedade zookeeper.connect em cada nó deve ser uma string idêntica e separada por vírgulas que listem os endereços de IP e os números de porta de todas as instâncias do ZooKeeper.

Passo 8 — Restringindo o Utilizador do Kafka

Agora que todas as instalações estão prontas, você pode remover os privilégios de admin do usuário kafka. Antes de fazer isso, saia e logue novamente como se fosse qualquer outro usuário sudo que não seja root. Se você ainda estiver executando a mesma sessão de shell com a qual você tenha iniciado este tutorial, simplesmente digite exit.

Remova o usuário kafka do grupo sudo:

  • sudo deluser kafka sudo

Para melhorar ainda mais a segurança do seu servidor Kafka, trave a senha do usuário kafka usando o comando passwd. Isso faz com que ninguém possa logar diretamente no servidor usando essa conta:

  • sudo passwd kafka -l

Neste ponto, apenas root ou um usuário sudo pode logar como kafka digitando o comando a seguir:

  • sudo su - kafka

No futuro, se você quer destravá-lo, use passwd com a opção -u:

  • sudo passwd kafka -u

Agora, você restringiu com sucesso os privilégios de admin do usuário kafka.

Conclusão

Agora, você tem o Apache Kafka funcionando com segurança no seu servidor Ubuntu. Você pode usar isso nos seus projetos criando produtores do Kafka e consumidores usando clientes do Kafka, que estão disponíveis para a maioria das linguagens de programação. Para saber mais sobre o Kafka, você também pode consultar a sua documentação.

Creative Commons License