Introduzione

Apache Kafka è un popolare broker di messaggi distribuito progettato per gestire grandi volumi di dati in tempo reale. Un cluster Kafka è altamente scalabile e tollerante agli errori e ha anche un throughput molto più elevato rispetto ad altri broker di messaggi come ActiveMQ e RabbitMQ. Sebbene sia generalmente utilizzato come sistema di messaggistica di pubblicazione/sottoscrizione, molte organizzazioni lo usano anche per l'aggregazione dei registri perché offre una memorizzazione persistente per i messaggi pubblicati.

Un sistema di messaggistica di pubblicazione/sottoscrizione consente a uno o più produttori di pubblicare messaggi senza considerare il numero di consumatori o il modo in cui elaboreranno i messaggi. I client abbonati vengono avvisati automaticamente degli aggiornamenti e della creazione di nuovi messaggi.

In questo tutorial, installerai e configurerai Apache Kafka 2.1.1 su un server Debian 10. Opzionalmente installerai KafkaT per monitorare Kafka e configurare un cluster multi-nodo Kafka.

Prerequisiti

Per seguire questo tutorial, avrai bisogno di:

Nota: le installazioni senza 4 GB di RAM possono causare il fallimento del servizio Kafka. Potresti riscontrare un errore simile al seguente: Out Of Memory.

Se desideri installare Apache Kafka su un server in remoto continua a leggere, altrimenti salta il primo paragrafo "Connessione al Server" e leggi il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Passaggio 1: Creare un utente per Kafka

Poiché Kafka è in grado di gestire le richieste su una rete, è consigliabile creare un utente dedicato. Ciò riduce al minimo i danni al computer Debian nel caso in cui il server Kafka venga compromesso. In questo passaggio creerai l'utente dedicato kafka .

Effettuato l'accesso come utente sudo non root, crea un utente chiamato kafka con il comando useradd:

sudo useradd kafka -m

Il flag -m assicura che verrà creata una home directory per l'utente. Questa home directory, /home/kafka fungerà da directory dell'area di lavoro per l'esecuzione dei comandi in seguito.

Imposta la password usando passwd:

sudo passwd kafka

Inserisci la password che desideri utilizzare per questo utente.

Successivamente, aggiungi l'utente kafka al gruppo sudo con il comando adduser, in modo che disponga dei privilegi richiesti per installare le dipendenze di Kafka:

sudo adduser kafka sudo

Il tuo utente kafka è ora pronto. Accedi a questo account utilizzando su:

su -l kafka

Ora che hai creato l'utente specifico di Kafka, puoi passare al download e all'estrazione dei file binari di Kafka.

Passaggio 2: Download ed estrazione dei file binari di Kafka

In questo passaggio, scaricherai ed estrarrai i binari di Kafka in cartelle dedicate nella home directory dell'utente di kafka .

Per iniziare, crea una directory chiamata Downloads in /home/kafka per archiviare i tuoi download:

mkdir ~/Downloads

Quindi, installa curl usando in apt-get modo da poter scaricare file remoti:

sudo apt-get update && sudo apt-get install curl

Quando richiesto, digitare Y per confermare il download di curl.

Una volta installato curl, usalo per scaricare i binari di Kafka:

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

Creare una directory chiamata kafka e passare a questa directory. Questa sarà la directory di base dell'installazione di Kafka:

mkdir ~/kafka && cd ~/kafka

Estrarre l'archivio scaricato utilizzando il comando tar:

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

È stato specificato il flag --strip 1 per assicurarsi che il contenuto dell'archivio sia estratto in ~/kafka/ e non in un'altra directory al suo interno, ad esempio ~/kafka/kafka_2.12-2.1.1/.

Ora che hai scaricato ed estratto correttamente i file binari, puoi passare alla configurazione di Kafka per consentire la cancellazione dell'argomento.

Passaggio 3: Configurare il server Kafka

Il comportamento predefinito di Kafka non ci consentirà di eliminare un argomento, la categoria, il gruppo o il nome del feed in cui è possibile pubblicare i messaggi. Per modificare questo, modificherai il file di configurazione.

Le opzioni di configurazione di Kafka sono specificate in server.properties. Apri questo file con nano o il tuo editor preferito:

nano ~/kafka/config/server.properties

Aggiungiamo un'impostazione che ci permetterà di eliminare gli argomenti di Kafka. Aggiungi la seguente riga evidenziata nella parte inferiore del file:


...
group.initial.rebalance.delay.ms

delete.topic.enable = true

Salvare il file ed uscire da nano. Ora che hai configurato Kafka, puoi creare un file di unità systemd per l'esecuzione e l'abilitazione di Kafka all'avvio.

Passaggio 4: Creare un file unità Systemd e avviore il server Kafka

In questa sezione, creerai un file di unità systemd per il servizio Kafka. Questo ti aiuterà a eseguire azioni di servizio comuni come l'avvio, l'arresto e il riavvio di Kafka in modo coerente con altri servizi Linux.

ZooKeeper è un servizio che Kafka utilizza per gestire lo stato e le configurazioni del cluster. È comunemente usato nei sistemi distribuiti come componente integrale. In questo tutorial, utilizzerai Zookeeper per gestire questi aspetti di Kafka. Se desideri saperne di più, visita i documenti ufficiali di ZooKeeper.

Innanzitutto, crea il file di unità per zookeeper:

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

Immettere la seguente definizione di unità nel file:

[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

La sezione [Unit] specifica che ZooKeeper richiede il collegamento in rete e che il filesystem sia pronto prima che possa essere avviato.

La sezione [Service] specifica che è systemd necessario utilizzare i file shell zookeeper-server-start.sh e zookeeper-server-stop.sh per l'avvio e l'arresto del servizio. Specifica inoltre che ZooKeeper deve essere riavviato automaticamente se esce in modo anomalo.

Successivamente, crea il file di servizio systemd per kafka:

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

Immettere la seguente definizione di unità nel file:

[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

La sezione [Unit] specifica che questo file di unità dipende da zookeeper.service. Ciò garantirà l'avvio automatico di zookeeper all'avvio del servizio kafka.

La sezione [Service] specifica che systemd dovrebbe utilizzare i file shell kafka-server-start.sh e kafka-server-stop.sh per l'avvio e l'arresto del servizio. Specifica inoltre che Kafka deve essere riavviato automaticamente se esce in modo anomalo.

Ora che le unità sono state definite, avvia Kafka con il seguente comando:

sudo systemctl start kafka

Per assicurarsi che il server sia stato avviato correttamente, controllare i registri del journal per l'unità kafka:

sudo journalctl -u kafka

Vedrai un output simile al seguente:

-- Logs begin at Tue 2020-03-03 19:48:52 CET, end at Tue 2020-03-03 20:51:40 CET. --
Mar 03 20:51:37 TEST-SERVER-1 systemd[1]: Started kafka.service.

Ora hai un server Kafka in ascolto sulla porta 9092, che è la porta predefinita per Kafka.

Hai avviato il servizio kafka, ma se avessi riavviato il tuo server, non sarebbe stato avviato automaticamente. Per abilitare kafka all'avvio del server, eseguire:

sudo systemctl enable kafka

Ora che hai avviato e abilitato i servizi, è il momento di verificare l'installazione.

Passaggio 5: Testare l'installazione

Pubblichiamo un messaggio Hello World per assicurarci che il server Kafka si stia comportando correttamente. La pubblicazione di messaggi in Kafka richiede:

  • Un producer, che consente la pubblicazione di record e dati su argomenti.
  • Un consumer, che legge messaggi e dati dagli argomenti.

Innanzitutto, crea un argomento chiamato TutorialTopic digitando:

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

Puoi creare un producer dalla riga di comando usando lo script kafka-console-producer.sh. Si aspetta come hostname, porta e nome come argomento del server Kafka.

Pubblicare la stringa Hello, World al topic TutorialTopic digitando:

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

Il flag --broker-list determina l'elenco dei broker di messaggi a cui inviare il messaggio, in questo caso localhost:9092. --topic designa l'argomento come TutorialTopic.

Successivamente, puoi creare un consumer Kafka usando lo script kafka-console-consumer.sh. Si aspetta l'hostname e la porta del server ZooKeeper e un nome come argomenti.

Il seguente comando consuma i messaggi da TutorialTopic. Si noti l'uso del flag --from-beginning, che consente il consumo di messaggi pubblicati prima dell'avvio del consumer:

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

--bootstrap-server fornisce un elenco di ingressi nel cluster Kafka. In questo caso, stai usando localhost:9092.

Vedrai Hello, World nel tuo terminale:

Hello, World

Lo script continuerà a essere eseguito, in attesa che vengano pubblicati altri messaggi sull'argomento. Sentiti libero di aprire un nuovo terminale e avviare un producer per pubblicare qualche altro messaggio. Dovresti essere in grado di vederli tutti nell'output del consumer. Se vuoi saperne di più su come usare Kafka, consulta la documentazione ufficiale di Kafka.

Al termine del test, premere CTRL+C per interrompere lo script del consumer. Ora che hai testato l'installazione, puoi passare all'installazione di KafkaT per amministrare meglio il tuo cluster Kafka.

Passaggio 6: Installare KafkaT (opzionale)

KafkaT è uno strumento di Airbnb che semplifica la visualizzazione dei dettagli sul cluster Kafka e l'esecuzione di determinate attività amministrative dalla riga di comando. Perché è una gemma di Ruby, avrai bisogno di Ruby per usarla. Avrai anche bisogno del pacchetto build-essential per poter costruire le altre gemme da cui dipende. Installali usando apt:

sudo apt install ruby ruby-dev build-essential

Ora puoi installare KafkaT usando il comando gem:

sudo CFLAGS=-Wno-error=format-overflow gem install kafkat

L'opzione CFLAGS=-Wno-error=format-overflow disabilita gli avvisi di overflow del formato ed è necessaria per la gemma ZooKeeper, che è una dipendenza di KafkaT.

KafkaT utilizza .kafkatcfg come file di configurazione per determinare le directory di installazione e registro del server Kafka. Dovrebbe anche avere una voce che indica KafkaT all'istanza di ZooKeeper.

Crea un nuovo file chiamato .kafkatcfg:

nano ~/.kafkatcfg

Aggiungi le seguenti righe per specificare le informazioni richieste sul tuo server Kafka e sull'istanza di Zookeeper:

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

Ora sei pronto per usare KafkaT. Per cominciare, ecco come lo useresti per visualizzare i dettagli su tutte le partizioni Kafka:

kafkat partitions

Vedrai il seguente output:

OutputTopic                 Partition   Leader      Replicas        ISRs    
TutorialTopic         0             0         [0]             [0]
__consumer_offsets    0             0         [0]             [0]
...

Questo output mostra TutorialTopic, oltre a __consumer_offsets, un argomento interno utilizzato da Kafka per la memorizzazione delle informazioni relative al client. Puoi tranquillamente ignorare le linee che iniziano con __consumer_offsets.

Per saperne di più su KafkaT, consultare il repository GitHub.

Ora che hai installato KafkaT, puoi facoltativamente configurare Kafka su un cluster di server Debian 10 per creare un cluster multi-nodo.

Passaggio 7: Impostare un Cluster Multi-Node (opzionale)

Se si desidera creare un cluster multi-broker usando più server Debian 10, ripetere i passaggi 1, 4 e 5 su ciascuna delle nuove macchine. Inoltre, apporta le seguenti modifiche nel file ~/kafka/config/server.properties per ciascun server nuovo:

  • Modificare il valore della proprietà broker.id in modo che sia univoco in tutto il cluster. Questa proprietà identifica in modo univoco ciascun server nel cluster e può avere qualsiasi stringa come valore. Ad esempio, "server1", "server2", ecc, sarebbe utile come identificatori.
  • Modificare il valore della proprietà zookeeper.connect in modo tale che tutti i nodi puntino alla stessa istanza ZooKeeper. Questa proprietà specifica l'indirizzo dell'istanza ZooKeeper e segue il formato <HOSTNAME/IP_ADDRESS>:<PORT>. Per questo tutorial, useresti, your_first_server_IP:2181 sostituendolo your_first_server_IP con l'indirizzo IP del server Debian 10 che hai già impostato.

Se si desidera disporre di più istanze ZooKeeper per il cluster, il valore della proprietà zookeeper.connect su ciascun nodo deve essere una stringa identica, separata da virgole, che elenca gli indirizzi IP e i numeri di porta di tutte le istanze di ZooKeeper.

Nota: se sul server Debian 10 è attivato un firewall con Zookeeper installato, assicurarsi di aprire la porta 2181 per consentire le richieste in arrivo dagli altri nodi del cluster.

Passaggio 8: Limitare l'utente Kafka

Ora che tutte le installazioni sono state completate, puoi rimuovere i privilegi di amministratore dell'utente kafka. Prima di procedere, disconnettersi e riconnettersi come qualsiasi altro utente sudo non root. Se stai ancora eseguendo la stessa sessione di shell con cui hai iniziato questo tutorial, digita semplicemente exit.

Rimuovere l'utente kafka dal gruppo sudo:

sudo deluser kafka sudo

Per migliorare ulteriormente la sicurezza del tuo server Kafka, blocca la password dell'utente kafka utilizzando il comando passwd. Questo si assicura che nessuno possa accedere direttamente al server usando questo account:

sudo passwd kafka -l

A questo punto, solo l'utente root o sudo può accedere come kafka digitando il comando seguente:

sudo su - kafka

In futuro, se si desidera sbloccarlo, utilizzare il comando passwd con l'opzione -u:

sudo passwd kafka -u

Ora hai limitato con successo i privilegi di amministratore dell'utente kafka.

Conclusione

Ora Apache Kafka funziona in modo sicuro sul tuo server Debian. Puoi utilizzarlo nei tuoi progetti creando producer e consumer Kafka usando i client Kafka, disponibili per la maggior parte dei linguaggi di programmazione. Per saperne di più su Kafka, puoi anche consultare la documentazione di Apache Kafka.