Bewährte Verfahren zur Behebung von Kafka-Partitionsungleichgewichten
Diagnostizieren Sie Kafka-Partitionsungleichgewichte, beheben Sie schiefe Schlüssel, gleichen Sie Replikate neu aus und überwachen Sie Verzögerungen und Broker-Last.
Bewährte Verfahren zur Behebung von Kafka-Partitionsungleichgewichten
Die Stärke von Apache Kafka liegt in seiner verteilten Natur, die durch Themenpartitionierung erreicht wird. Partitionen ermöglichen die Verteilung von Daten über mehrere Broker und ermöglichen parallelen Konsum und hohen Durchsatz. Wenn diese Partitionen jedoch nicht gleichmäßig verteilt sind oder sich im Laufe der Zeit ungleichmäßige Lastmuster ergeben, führt dies zu einem Partitionsungleichgewicht. Dieses Ungleichgewicht ist ein kritisches Betriebsproblem, das die Leistung erheblich beeinträchtigen, die Verbraucherverzögerung auf überlasteten Partitionen erhöhen und die Vorteile der Skalierung von Kafka untergraben kann.
Diese Anleitung erklärt die zwei Arten von Ungleichgewichten, die Sie unterscheiden müssen: ungleichmäßige Partitionsplatzierung über Broker und ungleichmäßiger Datenverkehr über Partitionen. Die Lösungen sind unterschiedlich, daher ist die Diagnose wichtig.
Verständnis von Kafka-Partitionsungleichgewichten
Ein Partitionsungleichgewicht tritt auf, wenn die Arbeitslast (Datenvolumen, Nachrichtenrate oder Verbraucherlast) nicht gleichmäßig über alle verfügbaren Partitionen innerhalb eines Themas verteilt ist oder wenn die Partitionen selbst nicht physisch gleichmäßig über den Broker-Cluster verteilt sind.
Ursachen für Ungleichgewichte
Mehrere Faktoren können zu einem Partitionsungleichgewicht führen oder es verstärken:
- Fehlkonfiguration bei der anfänglichen Themenerstellung: Erstellen eines Themas mit einer unzureichenden Anzahl von Partitionen im Verhältnis zum gewünschten Parallelitätsgrad oder zu den verfügbaren Brokern.
- Ungleichmäßige Schlüsselverteilung (schiefe Produzenten): Wenn Produzenten einen Schlüssel verwenden, der dazu führt, dass eine unverhältnismäßige Anzahl von Nachrichten einer einzigen Partition zugeordnet wird (Schlüsselschiefe). Zum Beispiel, wenn eine bestimmte Kunden-ID oder Kennung viel aktiver ist als andere.
- Verhalten von Verbrauchergruppen: In einer Verbrauchergruppe werden die zuvor einer Verbrauchergruppe zugewiesenen Partitionen neu verteilt, wenn ein Verbraucher ausfällt oder neu gestartet wird. Wenn die Neuzuweisung langsam ist oder die Anzahl der Partitionen hoch ist, kann ein Verbraucher vorübergehend deutlich mehr Partitionen verarbeiten als andere.
- Broker-Ausfälle und -Wiederherstellung: Während Broker-Ausfällen oder -Neustarts müssen auf diesen Brokern gehostete Partitionen verschoben oder neu zugewiesen werden, was die Last vorübergehend verzerrt, bis der Cluster vollständig wiederhergestellt ist.
Auswirkungen auf die Systemleistung
Die Folgen eines schwerwiegenden Partitionsungleichgewichts sind erheblich:
- Durchsatzengpass: Der Broker, der die stark belasteten Partitionen hostet, wird zum Engpass und begrenzt den Gesamtdurchsatz des gesamten Themas, unabhängig davon, wie idle die anderen Broker sind.
- Erhöhte Verbraucherverzögerung: Verbraucher, die überlasteten Partitionen zugewiesen sind, werden Schwierigkeiten haben, Schritt zu halten, was zu einer inakzeptablen Ende-zu-Ende-Latenz führt.
- Ressourcensättigung: Hohe I/O-, CPU- oder Netzwerkauslastung auf bestimmten Brokern, was das Risiko von Instabilität erhöht.
Bewährte Verfahren für die anfängliche Themenkonfiguration
Der beste Schutz gegen Ungleichgewichte ist eine proaktive, fundierte Ersteinrichtung.
1. Auswahl der optimalen Partitionsanzahl
Die Partitionsanzahl ist wohl die entscheidendste Entscheidung. Sie bestimmt direkt die maximale Parallelität für Verbraucher und die Verteilung über Broker.
- Faustregel: Wählen Sie eine Partitionsanzahl, die mindestens so hoch ist wie die maximale Anzahl von Verbrauchern, die Sie in einer Verbrauchergruppe erwarten. Vielfache von üblichen Verbraucheranzahlen können helfen, die Zuweisungen gleichmäßig zu halten, aber jede Verbrauchergruppe wird unabhängig ausbalanciert.
- Broker-Kapazität: Die Partitionsanzahl sollte den Cluster nicht überlasten. Jede Partition verbraucht Ressourcen (Speicher und Festplattenplatz) auf ihrem zugewiesenen Broker. Streben Sie weniger Partitionen pro Broker an, wenn die I/O-Kapazität eine Einschränkung darstellt.
- Zukünftiges Wachstum: Es ist deutlich einfacher, horizontal zu skalieren (Broker hinzufügen), als die Partitionsanzahl während des Betriebs für stark frequentierte Themen zu ändern. Während eine Partitionserhöhung unterstützt wird (über
kafka-topics.sh --alter), gleicht sie bestehende Partitionen nicht automatisch neu aus.
2. Strategische Schlüsselauswahl für Produzenten
Um Schlüsselschiefe zu verhindern, müssen Produzenten Schlüssel auswählen, die eine gleichmäßige Verteilung der Nachrichten über alle Partitionen erzeugen.
- Vermeiden Sie heiße Schlüssel: Identifizieren Sie Schlüssel, die einen unverhältnismäßigen Anteil der Nachrichten produzieren. Ein Schlüssel mit hoher Kardinalität wie
user_idverteilt sich normalerweise gut, aber ein extrem aktiver Benutzer oder Mandant kann dennoch eine heiße Partition erzeugen. - Verwenden Sie bei Bedarf Zufälligkeit: Wenn eine strenge Reihenfolge innerhalb des gesamten Datensatzes nicht erforderlich ist, verwenden Sie einen randomisierten oder gehashten Schlüssel, um eine bessere Verteilung über die Partitionen zu erzwingen.
# Beispiel: Die Verwendung einer konsistenten ID mit hoher Kardinalität gewährleistet eine gleichmäßige Verteilung
# Schlecht: Alles mit 'SYSTEMWEITE_KONFIGURATION' schlüsseln
# Gut: Schlüsseln nach 'benutzer_id' oder 'sitzungs_id', wenn diese gleichmäßig im Volumen verteilt sind
Umsetzbare Strategien zum Neuausgleichen bestehender Themen
Sobald ein Ungleichgewicht auftritt, sind spezifische administrative Maßnahmen erforderlich, um das Gleichgewicht wiederherzustellen.
3. Nutzung der Partitionszuweisungs-Neuverteilung (Verbraucherebene)
Wenn sich Verbrauchergruppen neu verteilen (aufgrund von Beitritt/Austritt von Verbrauchern), versucht Kafka, die Partitionen gleichmäßig auf die aktiven Mitglieder innerhalb dieser Verbrauchergruppe zu verteilen.
- Konfigurationsoptimierung: Stellen Sie sicher, dass die Verbraucher korrekt konfiguriert sind, insbesondere in Bezug auf Sitzungs-Timeouts und Heartbeats, um unnötige, störende Neuverteilungen zu vermeiden.
- Sticky-Partitionszuweisung: Erwägen Sie den Sticky- oder kooperativen Sticky-Assignor, wenn Ihre Client-Version dies unterstützt. Diese Assignoren versuchen, die Partitionsinhaberschaft stabil zu halten, wenn Verbraucher beitreten oder austreten, wodurch unnötige Bewegungen reduziert werden.
4. Broker-Neuzuweisung für physisches Ausgleichen
Wenn das Problem darin besteht, dass Partitionen physisch ungleichmäßig über Broker verteilt sind (z. B. nach dem Hinzufügen oder Entfernen eines Brokers), müssen Sie das Tool kafka-reassign-partitions.sh verwenden.
Dieser Prozess verschiebt den Datenreplikatsatz vom aktuellen Broker zu einem neuen Broker und gleicht so die physische Speicherlast effektiv aus.
Schritte für manuelle Neuzuweisung (konzeptionelles Beispiel):
- Aktuellen Plan generieren: Bestimmen Sie die aktuellen Partitionszuweisungen für das Thema.
- Bevorzugte Replika-Liste erstellen: Definieren Sie die gewünschte, ausgewogene Zuweisung (z. B. Verschieben von Partitionen vom überlasteten Broker A zum unterausgelasteten Broker B).
- Verschiebung ausführen: Führen Sie das Neuzuweisungstool mit dem generierten JSON-Plan aus.
- Abschluss überprüfen: Überwachen Sie das Neuzuweisungstool, bis alle Replikate erfolgreich auf die Ziel-Broker verschoben wurden.
Warnung: Die Partitionsneuzuweisung ist ein I/O- und netzwerkintensiver Vorgang. Führen Sie diese Aktionen während Wartungsfenstern oder in verkehrsarmen Zeiten durch, da der Replikationsverkehr die Client-Leistung vorübergehend beeinträchtigen kann.
5. Erhöhung der Partitionsanzahl (Skalierung)
Wenn die Partitionsanzahl tatsächlich zu niedrig ist, um die aktuelle Last zu bewältigen (was selbst bei perfekter Verteilung zu einer hohen Verbraucherverzögerung führt), müssen Sie die Partitionsanzahl erhöhen.
Schritte zur sicheren Erhöhung der Partitionen:
- Neue Anzahl bestimmen: Entscheiden Sie sich für die neue Gesamtpartitionsanzahl (z. B. von 12 auf 24).
- Thema ändern: Verwenden Sie das Tool
kafka-topics.sh, um die Anzahl zu erhöhen. Neu erstellte Partitionen werden basierend auf der aktuellen Broker-Liste Brokern zugewiesen.
kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic mein_thema --partitions 24
Verbrauchergruppen neu ausgleichen: Damit die Änderung in Verbrauchergruppen wirksam wird, muss die Gruppe eine Neuverteilung auslösen (normalerweise durch Neustarten der Verbraucher oder Abwarten von Timeouts). Neue Partitionen werden vorhandenen Verbrauchern zugewiesen, wodurch die Last besser verteilt wird.
Broker-Neuzuweisung (entscheidende Nachbereitung): Die Erhöhung der Partitionen verteilt nur die neue Last. Um die vorhandene Last auf die neu verfügbaren Broker-Slots zu verteilen, müssen Sie mit einem Broker-Neuzuweisungsplan (Schritt 4) nachlegen, um die ursprünglichen Partitionen in die neue Broker-Topologie zu verschieben.
Überwachung und Prävention
Eine kontinuierliche Überwachung ist unerlässlich, um Ungleichgewichte zu erkennen, bevor sie zu Dienstbeeinträchtigungen führen.
Wichtige zu verfolgende Metriken
Verwenden Sie Überwachungstools (wie Prometheus/Grafana oder integrierte Kafka-Tools), um diese Metriken zu verfolgen:
- Verbraucherverzögerung pro Partition: Der direkteste Indikator. Wenn die Verzögerung zwischen Partitionen in derselben Verbrauchergruppe stark variiert, liegt ein Ungleichgewicht vor.
- Broker-I/O und Netzwerkauslastung: Eine hohe Varianz in der Auslastung zwischen Brokern, die dasselbe Thema hosten, deutet auf eine ungleichmäßige Partitionslast hin.
- Partitionsanzahl auf Broker-Ebene: Stellen Sie sicher, dass die Anzahl der auf jedem Broker gehosteten Partitionen im Laufe der Zeit relativ ähnlich bleibt, insbesondere nach dem Hinzufügen oder Entfernen von Brokern.
Bewährte Verfahren: Regelmäßige Gesundheitschecks
Überprüfen Sie die Partitionsverteilung nach dem Hinzufügen von Brokern, dem Außerdienststellen von Brokern oder dem Ändern von Produzentenschlüsseln. Wenn ein Mandant, Gerät oder Kunde beginnt, ein Thema zu dominieren, korrigieren Sie die Schlüsselstrategie oder teilen Sie diese Arbeitslast auf, bevor die überlastete Partition zu Ihrem Durchsatzlimit wird.