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 Ubuntu 18.04. Opzionalmente installerai KafkaT per monitorare Kafka e configurare un cluster multi-nodo Kafka.
Prerequisiti
Per seguire questo tutorial, avrai bisogno di:
- Un server con Ubuntu 18.04 con almeno 4 GB di RAM e un utente non root con privilegi sudo.
- OpenJDK 11 installato sul tuo server. Per installare questa versione, seguire le istruzioni Come installare Java su Ubuntu 18.04. Kafka è scritto in Java, quindi richiede una JVM.
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 root@IP_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 nome_utente@IP_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 nome_utente@IP_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 Ubuntu 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=0
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 Ubuntu 18.04 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 Ubuntu 18.04, 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
sostituendoloyour_first_server_IP
con l'indirizzo IP del server Ubuntu 18.04 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 Ubuntu 18.04 è 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 Ubuntu. 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.