Como instalar o Apache Kafka no Ubuntu 20.04
O autor selecionou o programa Write for DOnations.
Introdução
RabbitMQ. Embora seja geralmente usado como um sistema de mensagens publish/subscribe, muitas organizações também o usam para agregação de log porque oferece armazenamento persistente para mensagens publicadas.
Um sistema de mensagens de publicação/assinatura permite que um ou mais produtores publiquem mensagens sem considerar o número de consumidores ou como eles processarão as mensagens. Os clientes inscritos são notificados automaticamente sobre atualizações e criação de novas mensagens. Esse sistema é mais eficiente e escalável do que os sistemas em que os clientes pesquisam periodicamente para determinar se novas mensagens estão disponíveis.
Neste tutorial, você instalará e configurará o Apache Kafka 2.8.2 no Ubuntu 20.04.
Pré-requisitos
Para acompanhar você vai precisar de:
- Um guia de configuração inicial do servidor se você não tiver um usuário não root configurado. Instalações com menos de 4 GB de RAM podem causar falhas no serviço Kafka.
- Como instalar o Java com APT no Ubuntu 20.04. Kafka é escrito em Java, então requer uma JVM.
Etapa 1 — Criando um usuário para Kafka
Como o Kafka pode lidar com solicitações em uma rede, sua primeira etapa é criar um usuário dedicado para o serviço. Isso minimiza os danos à sua máquina Ubuntu caso alguém comprometa o servidor Kafka. Você criará um usuário kafka
dedicado nesta etapa.
Faça login em seu servidor como seu usuário sudo
não raiz e crie um usuário chamado kafka
:
- sudo adduser kafka
Siga as instruções para definir uma senha e criar o usuário kafka
.
Em seguida, adicione o usuário kafka
ao grupo sudo
com o comando adduser
. Você precisa destes privilégios para instalar as dependências do Kafka:
- sudo adduser kafka sudo
Seu usuário kafka
agora está pronto. Faça login na conta kafka
usando su
:
- su -l kafka
Agora que você criou um usuário específico do Kafka, está pronto para baixar e extrair os binários do Kafka.
Etapa 2 — Baixando e extraindo os binários do Kafka
Nesta etapa, você fará o download e extrairá os binários do Kafka em pastas dedicadas no diretório inicial do usuário kafka
.
Para começar, crie um diretório em /home/kafka
chamado Downloads
para armazenar seus downloads:
- mkdir ~/Downloads
Use curl
para baixar os binários do Kafka:
- curl "https://downloads.apache.org/kafka/2.8.2/kafka_2.13-2.8.2.tgz" -o ~/Downloads/kafka.tgz
Crie um diretório chamado kafka
e mova para este diretório. Você usará este diretório como o diretório base da instalação do Kafka:
- mkdir ~/kafka && cd ~/kafka
Extraia o arquivo baixado usando o comando tar
:
- tar -xvzf ~/Downloads/kafka.tgz --strip 1
Você especifica o sinalizador --strip 1
para garantir que o conteúdo do arquivo seja extraído no próprio ~/kafka/
e não em outro diretório (como ~/kafka /kafka_2.13-2.8.2/
) dentro dele.
Agora que você baixou e extraiu os binários com sucesso, pode começar a configurar seu servidor Kafka.
Passo 3 — Configurando o Servidor Kafka
Um tópico Kafka é a categoria, grupo ou nome do feed no qual as mensagens podem ser publicadas. No entanto, o comportamento padrão do Kafka não permitirá que você exclua um tópico. Para modificar isso, você deve editar o arquivo de configuração, o que fará nesta etapa.
As opções de configuração do Kafka são especificadas em server.properties
. Abra este arquivo com nano
ou seu editor favorito:
- nano ~/kafka/config/server.properties
Primeiro, adicione uma configuração que permitirá excluir os tópicos do Kafka. Adicione a seguinte linha ao final do arquivo:
delete.topic.enable = true
Segundo, você mudará o diretório onde os logs do Kafka são armazenados modificando a propriedade log.dirs
. Encontre a propriedade log.dirs
e substitua a rota existente pela rota realçada:
log.dirs=/home/kafka/logs
Salve e feche o arquivo.
Agora que configurou o Kafka, você pode criar arquivos de unidade systemd
para executar e habilitar o servidor Kafka na inicialização.
Etapa 4 — Criando arquivos de unidade systemd e iniciando o servidor Kafka
Nesta seção, você criará arquivos unitários systemd
para o serviço Kafka. Esses arquivos ajudarão você a executar ações de serviço comuns, como iniciar, parar e reiniciar o Kafka de maneira consistente com outros serviços do Linux.
Kafka usa documentos oficiais do Zookeeper. Você usará o Zookeper como um serviço com esses arquivos de unidade.
Crie o arquivo unit para zookeeper
:
- sudo nano /etc/systemd/system/zookeeper.service
Insira a seguinte definição de unidade no arquivo:
[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 requer que a rede e o sistema de arquivos estejam prontos antes de iniciar.
A seção [Service]
especifica que systemd
deve usar zookeeper-server-start.sh
e zookeeper-server-stop.sh
arquivos shell para iniciar e parar o serviço. Ele também especifica que o Zookeeper deve ser reiniciado se for encerrado de forma anormal.
Depois de adicionar este conteúdo, salve e feche o arquivo.
Em seguida, crie o arquivo de serviço systemd para kafka
:
- sudo nano /etc/systemd/system/kafka.service
Insira a seguinte definição de unidade no arquivo:
[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 de zookeeper.service
, o que garantirá que o zookeeper
seja iniciado automaticamente quando o o serviço kafka
é iniciado.
A seção [Service]
especifica que systemd
deve usar kafka-server-start.sh
e kafka-server-stop.sh
arquivos shell para iniciar e parar o serviço. Ele também especifica que o Kafka deve ser reiniciado se for encerrado de forma anormal.
Salve e feche o arquivo.
Agora que você definiu as unidades, inicie o Kafka com o seguinte comando:
- sudo systemctl start kafka
Para garantir que o servidor foi iniciado com sucesso, verifique os logs do diário para a unidade kafka
:
- sudo systemctl status kafka
Você receberá uma saída como esta:
Output● kafka.service
Loaded: loaded (/etc/systemd/system/kafka.service; disabled; vendor preset>
Active: active (running) since Wed 2023-02-01 23:44:12 UTC; 4s ago
Main PID: 17770 (sh)
Tasks: 69 (limit: 4677)
Memory: 321.9M
CGroup: /system.slice/kafka.service
├─17770 /bin/sh -c /home/kafka/kafka/bin/kafka-server-start.sh /ho>
└─17793 java -Xmx1G -Xms1G -server -XX:+UseG1GC -XX:MaxGCPauseMill>
Agora você tem um servidor Kafka escutando na porta 9092
, que é a porta padrão que o servidor Kafka usa.
Você iniciou o serviço kafka
. Mas se você reiniciar seu servidor, o Kafka não reiniciará automaticamente. Para ativar o serviço kafka
na inicialização do servidor, execute o seguinte comando:
- sudo systemctl enable zookeeper
Você receberá uma resposta informando que um link simbólico foi criado:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/zookeeper.service → /etc/systemd/system/zookeeper.service.
Em seguida, execute este comando:
- sudo systemctl enable kafka
Você receberá uma resposta informando que um link simbólico foi criado:
OutputCreated symlink /etc/systemd/system/multi-user.target.wants/kafka.service → /etc/systemd/system/kafka.service.
Nesta etapa, você iniciou e ativou os serviços kafka
e zookeeper
. Na próxima etapa, você verificará a instalação do Kafka.
Etapa 5 — Testando a instalação do Kafka
Nesta etapa, você testará a instalação do Kafka. Você publicará e consumirá uma mensagem Hello World para garantir que o servidor Kafka esteja se comportando conforme o esperado.
A publicação de mensagens no Kafka requer:
- Um produtor, que permite a publicação de registros e dados em tópicos.
- Um consumidor, que lê mensagens e dados de tópicos.
Para começar, crie um tópico chamado TutorialTopic
:
- ~/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 espera o nome do host do servidor Kafka, uma porta e um tópico como argumentos.
Você receberá uma resposta informando que o tópico foi criado:
OutputCreated topic TutorialTopic.
Agora publique a string Hello, World
no tópico TutorialTopic
:
- echo "Hello, World" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
Em seguida, crie um consumidor Kafka usando o script kafka-console-consumer.sh
. Ele espera o nome de host e a porta do servidor ZooKeeper, juntamente com um nome de tópico, como argumentos. O comando a seguir consome mensagens de TutorialTopic
. Observe o uso do sinalizador --from-beginning
, que permite o consumo de mensagens que foram publicadas antes do consumidor ser iniciado:
- ~/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic TutorialTopic --from-beginning
Se não houver problemas de configuração, você receberá uma resposta Hello, World
em seu terminal:
OutputHello, World
O script continuará em execução, aguardando a publicação de mais mensagens. Para testar isso, abra uma nova janela de terminal e faça login no seu servidor. Lembre-se de fazer login como seu usuário kafka
:
- su -l kafka
Neste novo terminal, inicie um produtor para publicar uma segunda mensagem:
- echo "Hello World from Sammy at DigitalOcean!" | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic TutorialTopic > /dev/null
Esta mensagem será carregada na saída do consumidor em seu terminal original:
OutputHello, World
Hello World from Sammy at DigitalOcean!
Quando terminar o teste, pressione CTRL+C
para interromper o script do consumidor em seu terminal original.
Agora você instalou e configurou um servidor Kafka no Ubuntu 20.04. Na próxima etapa, você executará algumas tarefas rápidas para fortalecer a segurança do seu servidor Kafka.
Passo 6 — Fortalecendo o Servidor Kafka
Com a instalação concluída, você pode remover os privilégios de administrador do usuário kafka
e fortalecer o servidor Kafka.
Antes de fazer isso, efetue logout e login novamente como qualquer outro usuário sudo
não root. Se você ainda estiver executando a mesma sessão de shell com a qual iniciou este tutorial, digite exit
.
Remova o usuário kafka
do grupo sudo:
- sudo deluser kafka sudo
Para melhorar ainda mais a segurança do servidor Kafka, bloqueie a senha do usuário kafka
usando o comando passwd
. Esta ação garante que ninguém possa fazer login diretamente no servidor usando esta conta:
- sudo passwd kafka -l
O sinalizador -l
bloqueia o comando para alterar a senha de um usuário (passwd
).
Neste ponto, apenas root
ou um usuário sudo
pode efetuar login como kafka
com o seguinte comando:
- sudo su - kafka
No futuro, se você quiser desbloquear a capacidade de alterar a senha, use passwd
com a opção -u
:
- sudo passwd kafka -u
Agora você restringiu com sucesso os privilégios de administrador do usuário kafka
. Você está pronto para começar a usar o Kafka. Opcionalmente, você pode seguir a próxima etapa, que adicionará o KafkaT ao seu sistema.
Passo 7 — Instalando o KafkaT (opcional)
KafkaT foi desenvolvido para melhorar sua capacidade de visualizar detalhes sobre seu cluster Kafka e executar determinadas tarefas administrativas na linha de comando. Por ser uma gem Ruby, você precisará do Ruby para usá-la. Você também precisará do pacote build-essential
para construir as outras gems das quais KafkaT
depende.
Instale Ruby e o pacote build-essential
usando apt
:
- sudo apt install ruby ruby-dev build-essential
Agora você pode instalar o KafkaT com o comando gem
:
- sudo CFLAGS=-Wno-error=format-overflow gem install kafkat
O sinalizador de compilação Wno-error=format-overflow
é necessário para suprimir os avisos e erros do Zookeeper durante o processo de instalação do kafkat
.
Quando a instalação terminar, você receberá uma resposta informando que está concluída:
Output...
Done installing documentation for json, colored, retryable, highline, trollop, zookeeper, zk, kafkat after 3 seconds
8 gems installed
O KafkaT usa .kafkatcfg
como o arquivo de configuração para determinar os diretórios de instalação e log do seu servidor Kafka. Ele também deve ter uma entrada apontando o KafkaT para sua instância do ZooKeeper.
Crie um novo arquivo chamado .kafkatcfg
:
- nano ~/.kafkatcfg
Adicione as seguintes linhas para especificar as informações necessárias sobre o servidor Kafka e a instância do Zookeeper:
{
"kafka_path": "~/kafka",
"log_path": "/home/kafka/logs",
"zk_path": "localhost:2181"
}
Salve e feche o arquivo. Agora você está pronto para usar o KafkaT.
Para visualizar detalhes sobre todas as partições Kafka, tente executar este comando:
- kafkat partitions
Você receberá a seguinte saída:
Output[DEPRECATION] The trollop gem has been renamed to optimist and will no longer be supported. Please switch to optimist as soon as possible.
/var/lib/gems/2.7.0/gems/json-1.8.6/lib/json/common.rb:155: warning: Using the last argument as keyword parameters is deprecated
...
Topic Partition Leader Replicas ISRs
TutorialTopic 0 0 [0] [0]
__consumer_offsets 0 0 [0] [0]
...
...
A saída incluirá TutorialTopic
e __consumer_offsets
, um tópico interno usado pelo Kafka para armazenar informações relacionadas ao cliente. Você pode ignorar com segurança as linhas que começam com __consumer_offsets
.
Para saber mais sobre KafkaT, consulte seu repositório GitHub.
Conclusão
Agora você tem o Apache Kafka rodando com segurança em seu servidor Ubuntu. Você pode integrar Kafka em sua linguagem de programação favorita usando clientes Kafka.
Para saber mais sobre o Kafka, você também pode consultar sua documentação.