KRaft în Kafka 4.0: Adio ZooKeeper, controlor de cvorum și migrare
Kafka 4.0 (martie 2025) a eliminat definitiv ZooKeeper după trei ani de coexistență cu KRaft. Acest ghid aprofundat explică modul în care funcționează noul controler de cvorum bazat pe Raft, Path de migrare obligatorie pentru cei care provin din Kafka 3.x, beneficiile operaționale reale și capcanele de evitat în timpul trecerii în producţie.
Problema cu ZooKeeper
De aproape zece ani, fiecare cluster Apache Kafka a necesitat un ansamblu Apache ZooKeeper separat pentru a gestiona metadatele: ce brokeri au fost activi, care broker a fost lider pentru ce partiție, subiect și metadate ACL. ZooKeeper este un sistem de coordonare distribuit robust și fiabil, dar a introdus o serie de probleme operaționale semnificative:
- Complexitate operațională dublă: Fiecare echipă care gestionează Kafka a trebuit să gestioneze, de asemenea, un cluster ZooKeeper separat (de obicei 3 sau 5 noduri), cu propria sa monitorizare, ciclu de upgrade și configurație distinctă.
- Scalabilitate limitată a metadatelor: ZooKeeper a arătat o degradare a performanței peste ~200.000 de partiții pe cluster, deoarece metadatele fiecărei partiții au fost scrise ca noduri ZooKeeper separate.
- Alegerea lentă a controlorului: Când controlerul brokerului Kafka a căzut, noul controler a trebuit să citească întregul starea clusterului de la ZooKeeper înainte de a putea funcționa, un proces care ar putea dura zeci de secunde pentru clusterele mari.
- Dificultate în recuperarea în caz de dezastru: recuperarea unui cluster Kafka în caz de pierdere a datelor pe ZooKeeper a fost un proces manual complex și riscant.
Cronologie KRaft
- KIP-500 (2020): Propunere originală de a elimina ZooKeeper din Kafka
- Kafka 2.8 (aprilie 2021): prima versiune cu KRaft în acces anticipat (doar pentru testare)
- Kafka 3.3 (octombrie 2022): KRaft a fost declarat gata de producție pentru noi clustere
- Kafka 3.5 (iunie 2023): instrument de migrare ZooKeeper la KRaft disponibil
- Kafka 3.7 (martie 2024): modul ZooKeeper este depreciat
- Kafka 4.0 (martie 2025): modul ZooKeeper a fost eliminat definitiv
Cum funcționează KRaft: Jurnalul de consens Raft
Conceptul jurnalului de metadate
Soluția adoptată în KRaft (Kafka Raft) este elegantă: în loc să depindă de un sistem extern pentru metadate,
Kafka își gestionează metadatele ca a Subiect intern Kafka numit @metadata.
Acest subiect este replicat printr-un protocol Raft între nodurile controlerului.
În KRaft, brokerii de cluster își asumă unul dintre cele două roluri (sau ambele, în grupuri mici):
- Controlorii: Gestionează metadatele clusterului. Într-un cluster de producție, se recomandă un cvorum de 3 controlere. Controlorul activ (leaderul Raft) procesează toate modificările metadatelor și le reproduce altor controlori.
- Broker: gestionează jurnalele de partiții, deservește producătorii și consumatorii. Brokerii păstrează o copie memoria cache a metadatelor primite de la controler, actualizată în flux.
Protocolul plutei de la Kafka
Raft este un algoritm de consens distribuit conceput pentru a fi de înțeles (spre deosebire de Paxos). Pe scurt: dintre toate nodurile de cvorum, unul este ales lider. Conducătorul primește toate scripturile, le propagă adepților, iar când majoritatea nodurilor au confirmat scrierea, o consideră săvârșită.
În KRaft, acest lucru se traduce astfel:
- O operație de metadate (crearea unui subiect, atribuirea liderului partiției etc.) ajunge la controlerul lider
- Controlerul lider scrie operația în jurnalul de metadate ca un eveniment serializat
- Evenimentul este replicat la adepții controlerului prin intermediul protocolului
FETCH(folosind codul Kafka existent) - Când majoritatea controlorilor au confirmat (cvorum), operațiunea este comisă
- Brokerii primesc actualizări de metadate transmise de controlerul activ prin
MetadataUpdate
# Struttura di una directory dati KRaft (broker+controller combinato)
# /var/lib/kafka/data/
/var/lib/kafka/data/
meta.properties # cluster.id, node.id, version
__cluster_metadata-0/ # il metadata log (partizione 0)
00000000000000000000.log
00000000000000000000.index
00000000000000000000.timeindex
leader-epoch-checkpoint
ordini-effettuati-0/ # log di una partizione normale
ordini-effettuati-1/
...
# meta.properties esempio:
node.id=1
version=1
cluster.id=MkU3OEVBNTcwNTJENDM2Qk
Controller de cvorum: Dimensiune
Controlorul de cvorum urmează regulile de consens: a tolera f eșec, sunt necesare 2f+1 noduri.
- 3 controlere: tolerează 1 defecțiune (configurație minimă pentru producție)
- 5 controlere: tolerează 2 defecțiuni simultane (recomandat pentru clustere critice)
- 1 controler: Numai pentru dezvoltare/testare locală, fără toleranță la erori
Controlorii pot fi dedicat (numai rolul de controler, nu gestionați partițiile utilizator) sau combinate (aceleași mașini care acționează și ca brokeri). Pentru grupuri mici (< 10 brokeri) controlorii combinate sunt bine. Pentru clusterele mari sau cu debit mare, controlerele dedicate izolează sarcina de gestionare metadate din încărcarea I/O a partițiilor.
Configurarea unui cluster KRaft de la zero
# server.properties per un nodo controller+broker combinato (cluster single-node per dev)
# ─── Identity ─────────────────────────────────────────────────────────────────
# In KRaft ogni nodo ha un node.id unico nel cluster (sostituisce broker.id)
node.id=1
# Ruoli: "broker" | "controller" | "broker,controller"
process.roles=broker,controller
# Indirizzo del quorum controller: formato node.id@host:port
controller.quorum.voters=1@localhost:9093
# ─── Listeners ────────────────────────────────────────────────────────────────
# KAFKA: listener per producer/consumer
# CONTROLLER: listener per comunicazione KRaft interna
listeners=KAFKA://localhost:9092,CONTROLLER://localhost:9093
advertised.listeners=KAFKA://localhost:9092
listener.security.protocol.map=KAFKA:PLAINTEXT,CONTROLLER:PLAINTEXT
inter.broker.listener.name=KAFKA
controller.listener.names=CONTROLLER
# ─── Storage ──────────────────────────────────────────────────────────────────
log.dirs=/var/lib/kafka/data
# ─── Replication defaults ─────────────────────────────────────────────────────
default.replication.factor=1 # 1 per dev, 3 per produzione
min.insync.replicas=1 # 1 per dev, 2 per produzione
offsets.topic.replication.factor=1
# ─── Retention ────────────────────────────────────────────────────────────────
log.retention.hours=168 # 7 giorni
log.segment.bytes=1073741824 # 1GB per segmento
# Inizializzare il cluster KRaft (una tantum)
# Step 1: generare un cluster UUID univoco
KAFKA_CLUSTER_ID=$(kafka-storage.sh random-uuid)
echo "Cluster ID: $KAFKA_CLUSTER_ID"
# Step 2: formattare la directory storage con il cluster ID
kafka-storage.sh format \
--config /etc/kafka/server.properties \
--cluster-id "$KAFKA_CLUSTER_ID"
# Output:
# Formatting /var/lib/kafka/data with metadata.version 4.0-IV3.
# Step 3: avviare il broker
kafka-server-start.sh /etc/kafka/server.properties
Important: ID-ul clusterului este imuabil
Il cluster.id generat atunci când formatul este scris în fișier meta.properties a fiecărui nod
și în jurnalul de metadate. Nu poate fi schimbat după inițializare. Dacă pierdeți acest fișier și doriți să adăugați un nod
la clusterul existent, trebuie să utilizați procedura de bootstrap corespunzătoare. Stocați ID-ul clusterului într-un sistem de gestionare a secretelor.
Docker Compose: KRaft Cluster for Local Development
# docker-compose.yml per cluster Kafka 4.0 KRaft (3 broker)
# Immagine: apache/kafka:4.0.0 (immagine ufficiale Apache, non Confluent)
version: "3.9"
services:
kafka1:
image: apache/kafka:4.0.0
container_name: kafka1
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: "broker,controller"
KAFKA_LISTENERS: "PLAINTEXT://kafka1:9092,CONTROLLER://kafka1:9093"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka1:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka1:9093,2@kafka2:9093,3@kafka3:9093"
KAFKA_INTER_BROKER_LISTENER_NAME: "PLAINTEXT"
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
CLUSTER_ID: "MkU3OEVBNTcwNTJENDM2Qk"
volumes:
- kafka1-data:/var/lib/kafka/data
kafka2:
image: apache/kafka:4.0.0
container_name: kafka2
environment:
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: "broker,controller"
KAFKA_LISTENERS: "PLAINTEXT://kafka2:9092,CONTROLLER://kafka2:9093"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka2:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka1:9093,2@kafka2:9093,3@kafka3:9093"
KAFKA_INTER_BROKER_LISTENER_NAME: "PLAINTEXT"
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
CLUSTER_ID: "MkU3OEVBNTcwNTJENDM2Qk"
volumes:
- kafka2-data:/var/lib/kafka/data
kafka3:
image: apache/kafka:4.0.0
container_name: kafka3
environment:
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: "broker,controller"
KAFKA_LISTENERS: "PLAINTEXT://kafka3:9092,CONTROLLER://kafka3:9093"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka3:9092"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT"
KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"
KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka1:9093,2@kafka2:9093,3@kafka3:9093"
KAFKA_INTER_BROKER_LISTENER_NAME: "PLAINTEXT"
KAFKA_DEFAULT_REPLICATION_FACTOR: 3
KAFKA_MIN_INSYNC_REPLICAS: 2
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
CLUSTER_ID: "MkU3OEVBNTcwNTJENDM2Qk"
volumes:
- kafka3-data:/var/lib/kafka/data
volumes:
kafka1-data:
kafka2-data:
kafka3-data:
Migrarea de la Kafka 3.x cu ZooKeeper la KRaft
Dacă gestionați un cluster Kafka 3.x în modul ZooKeeper și trebuie să migrați la KRaft (necesar pentru a utiliza Kafka 4.0), procesul se numește Migrare KRaft și este acceptat oficial începând cu versiunea 3.5. Vestea bună: Migrația are loc fără timp de nefuncţionare pentru producători și consumatori.
Fazele migrației
Procesul oficial este împărțit în 6 etape:
-
Verificați cerințele preliminare: upgrade la Kafka 3.7 (cea mai recentă versiune cu suport pentru scriere dublă ZooKeeper+KRaft),
verificați dacă toți brokerii au
metadata.versionaliniat. - Implementarea controlerului KRaft: Porniți nodurile de control KRaft (3 noduri noi sau brokeri existenți cu rol suplimentar). Controlorii obțin metadatele inițiale de la ZooKeeper prin instrumentul de migrare.
- Mod de scriere dublă: Brokerii scriu metadate atât în ZooKeeper, cât și în jurnalul de metadate KRaft. În această fază, sistemul este pe deplin operațional.
- Migrația s-a încheiat: toți brokerii migrează, ZooKeeper devine doar pentru citire pentru Kafka. Producătorii și consumatorii nu percep nicio întrerupere.
- Finalizator ZooKeeper: rulați finalizatorul care curăță metadatele Kafka din ZooKeeper.
- Închideți ZooKeeper: Dezafectați ansamblul ZooKeeper. Cluster complet KRaft.
# Step 1: Verifica metadata.version attuale del cluster
# (da eseguire con Kafka 3.7)
kafka-features.sh --bootstrap-server kafka1:9092 describe
# Output:
# Feature: metadata.version
# SupportedMinVersion: 3.0-IV1
# SupportedMaxVersion: 3.7-IV4
# FinalizedVersion: 3.7-IV4
# Step 2: Avvia i controller KRaft con la migration config speciale
# In server.properties dei controller KRaft:
process.roles=controller
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181 # ancora necessario in fase di migrazione
controller.quorum.voters=10@kc1:9093,11@kc2:9093,12@kc3:9093
# Step 3: Avvia la migration (da eseguire una volta soli i controller KRaft sono up)
# Modifica server.properties di OGNI broker Kafka esistente:
# Aggiunge il parametro:
zookeeper.metadata.migration.enable=true
controller.quorum.voters=10@kc1:9093,11@kc2:9093,12@kc3:9093
# Riavvia i broker uno alla volta (rolling restart, zero downtime)
# I broker entrano in migration mode automaticamente
# Step 4: Monitora lo stato della migrazione
kafka-metadata-shell.sh \
--snapshot /var/lib/kafka/data/__cluster_metadata-0/00000000000000000000.snapshot
# Step 5: Finalizza (dopo che tutti i broker sono migrati)
kafka-features.sh --bootstrap-server kafka1:9092 upgrade \
--metadata 3.7-IV4 # o la versione target
# Step 6: Rimuovi zookeeper.connect dai server.properties e riavvia i broker
Notificări importante pentru migrare
- Nu te întoarce ușor: Odată ce migrarea KRaft este completă și ZooKeeper este eliminat, rollback-ul este foarte complex. Migrați mai întâi într-un mediu de procesare identic cu cel de producție.
- ACL-uri și configurații: ACL-urile și configurațiile dinamice gestionate prin ZooKeeper sunt migrate automat în jurnalul de metadate, dar verificați dacă acestea sunt prezente după migrare.
- Conector Kafka Connect: conectori care folosesc clusterul Kafka ca backend pentru stare (group.id, offsets) continuă să funcționeze neschimbat.
- MirrorMaker 2: Dacă utilizați MM2 pentru replicare geografică, actualizați clusterele la distanță în același fereastra de întreținere pentru a evita incompatibilitățile versiunilor.
KRaft cu configurație avansată: controlere dedicate
Pentru clustere cu debit mare sau care gestionează un număr mare de partiții (>50.000), se recomanda separarea controlorilor de brokeri (controlere dedicate). Ca asta operațiunile de metadate (crearea subiectului, alegerea liderului, schimbarea configurației) nu concurează cu jurnalul de partiție I/O pe aceleași discuri.
# server.properties per un CONTROLLER DEDICATO (non gestisce partizioni utente)
node.id=10
process.roles=controller
controller.quorum.voters=10@kc1:9093,11@kc2:9093,12@kc3:9093
listeners=CONTROLLER://kc1:9093
listener.security.protocol.map=CONTROLLER:PLAINTEXT
controller.listener.names=CONTROLLER
log.dirs=/var/lib/kafka/metadata
# server.properties per un BROKER PURO (non è controller)
node.id=1
process.roles=broker
controller.quorum.voters=10@kc1:9093,11@kc2:9093,12@kc3:9093
listeners=KAFKA://kafka1:9092
advertised.listeners=KAFKA://kafka1:9092
listener.security.protocol.map=KAFKA:PLAINTEXT
inter.broker.listener.name=KAFKA
controller.listener.names=CONTROLLER
log.dirs=/var/lib/kafka/data
# Con questa configurazione:
# - 3 macchine controller dedicati (leggeri, poca RAM, poca CPU)
# - N broker puri (ottimizzati per I/O disco)
# - Nessuna competizione di risorse tra metadata ops e I/O partizioni
În Confluent Cloud și în medii gestionate, cum ar fi Amazon MSK (care a adoptat KRaft începând cu versiunea 3.6), separarea controlor/broker are loc automat și este transparentă pentru utilizator.
Beneficiile operaționale ale KRaft
Pornire și recuperare mai rapidă
Cu ZooKeeper, când controlerul brokerului Kafka a repornit, a trebuit să citească întreaga stare a clusterului de la ZooKeeper înainte de a putea opera. Pentru clustere cu peste 100.000 de partiții, acest lucru ar putea dura 30-90 de secunde indisponibilitatea controlerului.
Cu KRaft, controlerul lider păstrează jurnalul de metadate deja în memorie și pe discul local. Un failover de controler necesită de obicei mai puțin de 5 secunde, chiar și pentru grupuri mari. Un studiu de caz a unei companii fintech (Confluent Engineering Blog, 2025) documentează o reducere cu 40% a timpului de configurare după migrarea la KRaft.
Scalabilitate metadate
ZooKeeper avea o limită practică de aproximativ 200.000 de partiții per cluster (indiferent de performanță a operațiunilor cu metadate degradate semnificativ). KRaft gestionează jurnalul de metadate ca de obicei Bușteni Kafka cu compactare și a fost testat cu milioane de partiții pe cluster.
Simplitate operațională
Eliminarea ZooKeeper înseamnă:
- Un sistem de monitorizat în loc de două
- Un ciclu de upgrade în loc de două (de multe ori ZooKeeper și Kafka aveau constrângeri complexe de versiune)
- Implementare mai ușoară pe Kubernetes (mai puțin StatefulSet, mai puțin PVC)
- Recuperare în caz de dezastru mai ușoară (starea clusterului este în jurnalul de metadate, nu este distribuită între Kafka și ZooKeeper)
KRaft pe Kubernetes cu Strimzi
Strimzi este cel mai popular operator Kubernetes pentru gestionarea Kafka. Din versiunea 0.38, Strimzi acceptă nativ KRaft:
# Kafka cluster KRaft con Strimzi Operator (Kubernetes)
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
namespace: kafka
annotations:
# Abilita KRaft mode (richiede Strimzi 0.38+)
strimzi.io/kraft: enabled
spec:
kafka:
version: 4.0.0
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
config:
# KRaft-specific
default.replication.factor: 3
min.insync.replicas: 2
offsets.topic.replication.factor: 3
transaction.state.log.replication.factor: 3
transaction.state.log.min.isr: 2
# Retention
log.retention.hours: 168
log.segment.bytes: 1073741824
storage:
type: persistent-claim
size: 100Gi
class: fast-ssd
# Controller separato (produzione: controller dedicati)
# Ometti questa sezione per controller combinati (default)
# entityOperator gestisce topic e utenti tramite CRD
entityOperator:
topicOperator: {}
userOperator: {}
# Creare un topic con Strimzi CRD (invece di kafka-topics.sh)
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaTopic
metadata:
name: ordini-effettuati
namespace: kafka
labels:
strimzi.io/cluster: my-cluster
spec:
partitions: 6
replicas: 3
config:
retention.ms: "604800000"
min.insync.replicas: "2"
compression.type: snappy
Verificarea stării Clusterului KRaft
# Verificare chi è il controller leader attuale
kafka-metadata-quorum.sh \
--bootstrap-server kafka1:9092 \
describe --status
# Output:
# ClusterId: MkU3OEVBNTcwNTJENDM2Qk
# LeaderId: 1
# LeaderEpoch: 42
# HighWatermark: 156789
# MaxFollowerLag: 0
# MaxFollowerLagTimeMs: 12
# CurrentVoters: [{"nodeId":1,"logEndOffset":156789,"lag":0},
# {"nodeId":2,"logEndOffset":156789,"lag":0},
# {"nodeId":3,"logEndOffset":156789,"lag":0}]
# CurrentObservers: []
# Verificare i dettagli del quorum
kafka-metadata-quorum.sh \
--bootstrap-server kafka1:9092 \
describe --replication
# Leggere il metadata log (per debugging)
kafka-dump-log.sh \
--files /var/lib/kafka/data/__cluster_metadata-0/00000000000000000000.log \
--cluster-metadata
Diferențe de configurare: ZooKeeper vs KRaft
Pentru cei care provin dintr-un cluster ZooKeeper, iată principalele diferențe de configurare de știut:
| Configurare | ZooKeeperMode | KRaftMode |
|---|---|---|
| Conexiune la cluster | zookeeper.connect |
controller.quorum.voters |
| ID-ul nodului | broker.id |
node.id |
| Roluri | Întotdeauna broker | process.roles |
| Controloare pentru ascultători | N / A | controller.listener.names |
| Inițializare | Mașină (mânere ZK) | kafka-storage.sh format |
| Stocare ACL | ZooKeeper znodes | Jurnal de metadate |
Versiunea metadatelor și steaguri de caracteristică în KRaft
Cu KRaft, Kafka introduce conceptul de metadate.versiune: O versiune a formatului de metadate în cluster. Acest lucru permite actualizarea continuă a unui cluster fără timp de nefuncționare, câte un nod la un moment dat. Versiunea metadatelor este actualizată numai atunci când toți brokerii din cluster acceptă noua versiune.
# Verificare la metadata.version corrente e le versioni supportate
kafka-features.sh \
--bootstrap-server kafka1:9092 \
describe
# Output tipico con Kafka 4.0:
# Feature: metadata.version
# SupportedMinVersion: 3.0-IV1
# SupportedMaxVersion: 4.0-IV3
# FinalizedVersion: 4.0-IV3
# Verificare tutti i feature flags disponibili
kafka-features.sh \
--bootstrap-server kafka1:9092 \
describe --all
# Aggiornare la metadata.version dopo un upgrade di cluster
# (eseguire DOPO che tutti i broker sono stati aggiornati alla nuova versione)
kafka-features.sh \
--bootstrap-server kafka1:9092 \
upgrade --metadata 4.0-IV3
Versiunea 4.0-IV3 (Kafka 4.0 Incremental Version 3) este cea mai recentă versiune disponibilă
Kafka 4.0 martie 2025. Fiecare creștere a versiunii permite noi funcții și optimizări ale protocolului.
Depanarea KRaft: probleme comune
Clusterul nu pornește: „Nu s-au găsit alegători în cvorum”
Această eroare indică faptul că nodurile de control nu pot găsi alți alegători de cvorum. Cauze comune:
-
controler configurat greșit.cvorum.voters: Verificați dacă formatul este corect
(
nodeId@hostname:port) și că numele de gazdă pot fi rezolvate de către toate nodurile. - Ascultător CONTROLLER inaccesibil: Verificați dacă firewall-ul permite comunicare pe portul de ascultare al controlerului (implicit: 9093) între nodurile controlerului.
-
Nepotrivire cu ID-ul clusterului: dacă ai repornit cu
kafka-storage.sh formatpe unul dintre noduri fără a utiliza ID-ul de cluster corect, nodurile nu se vor alătura clusterului.
# Verificare il cluster ID su ogni nodo
cat /var/lib/kafka/data/meta.properties
# node.id=1
# version=1
# cluster.id=MkU3OEVBNTcwNTJENDM2Qk <-- deve essere identico su tutti i nodi
# Verificare che il controller leader sia eletto
kafka-metadata-quorum.sh \
--bootstrap-server kafka1:9092 \
describe --status | grep LeaderId
# Se LeaderId=-1, nessun leader è stato eletto (quorum non raggiunto)
# Controllare i log del broker per errori KRaft
grep -E "WARN|ERROR" /var/log/kafka/kafka.log | grep -i "kraft\|quorum\|controller"
Broker nu a fost adăugat la cluster
Când adăugați un nou broker la un cluster KRaft existent, brokerul trebuie să fie formatat cu același ID de cluster ca și clusterul existent:
# Recupera il cluster ID dal cluster esistente
CLUSTER_ID=$(kafka-metadata-quorum.sh \
--bootstrap-server kafka1:9092 \
describe --status | grep ClusterId | awk '{print $2}')
echo "Cluster ID: $CLUSTER_ID"
# Formatta il nuovo broker con lo stesso cluster ID
kafka-storage.sh format \
--config /etc/kafka/server.properties \
--cluster-id "$CLUSTER_ID"
# Avvia il nuovo broker
kafka-server-start.sh /etc/kafka/server.properties
# Verifica che il nuovo broker sia visibile nel cluster
kafka-broker-api-versions.sh \
--bootstrap-server kafka1:9092 | grep "id:"
Următorii pași din serie
Cu KRaft inclus, sunteți gata să abordați aspecte mai avansate ale configurației Kafka:
-
Articolul 3 – Producător și Consumator avansat: configurația detaliată a
acks,idempotent producerși reîncercați strategiile pentru a asigura durabilitatea fără duplicate. - Articolul 4 – Semantica Exact O dată: Tranzacții Kafka pentru scrieri atomice pe mai multe subiecte, cu noul coordonator de tranzacții implementat în jurnalul de metadate KRaft.
- Articolul 11 – Kafka în producție: Dimensiunea clusterului KRaft, configurația a replicilor controlerului, recuperare în caz de dezastru și backup pentru jurnalul de metadate.
Legătură cu alte serii
- Kubernetes avansat: implementarea lui Kafka pe Kubernetes cu operatorul Strimzi, gestionarea persistentă a stocării și scalarea automată a grupului de consumatori.
-
Observabilitate: Monitorizarea cvorumului KRaft cu JMX Exporter, valori critice
cum
kafka.controller:type=KafkaController,name=ActiveControllerCountși alertă la alegerea liderului.







