Freigeben über


Bewährte Methoden, um eine optimale Leistung in Azure Managed Instance for Apache Cassandra sicherzustellen

Azure Managed Instance for Apache Cassandra ist ein vollständig verwalteter Service für reine Open-Source Apache Cassandra-Cluster. Der Dienst ermöglicht auch das Überschreiben von Konfigurationen, je nach den spezifischen Anforderungen der einzelnen Arbeitsauslastungen. Dieses Feature ermöglicht maximale Flexibilität und Kontrolle bei Bedarf. Dieser Artikel enthält Tipps zum Optimieren der Leistung.

Optimale Einrichtung und Konfiguration

Replikationsfaktor, Anzahl von Datenträgern, Anzahl von Knoten und SKUs

Azure unterstützt drei Verfügbarkeitszonen in den meisten Regionen. Azure Managed Instance für Apache Cassandra ordnet Verfügbarkeitszonen Racks zu. Um heiße Partitionen zu vermeiden, wird empfohlen, einen Partitionsschlüssel mit hoher Kardinalität auszuwählen. Für das beste Maß an Zuverlässigkeit und Fehlertoleranz empfehlen wir dringend die Konfiguration eines Replikationsfaktors von 3. Außerdem wird empfohlen, ein Vielfaches des Replikationsfaktors als Anzahl von Knoten anzugeben, z. B. 3, 6, 9 usw.

Azure verwendet einen RAID 0 über die Anzahl der von Ihnen bereitgestellten Datenträger. Um einen optimalen IOPS-Wert zu erhalten, ermitteln Sie den maximalen IOPS-Wert in der ausgewählten SKU zusammen mit dem IOPS-Wert eines P30-Datenträgers. Beispielsweise unterstützt die Standard_DS14_v2-SKU 51.200 nicht zwischengespeicherte IOPS, während ein einzelner P30-Datenträger eine Basisleistung von 5.000 IOPS aufweist. Vier Datenträger würden zu 20.000 IOPS führen, was deutlich unter den Grenzen des Computers liegt.

Es wird dringend empfohlen, ein umfangreiches Benchmarking Ihrer Workload mit der SKU und der Anzahl von Datenträgern durchzuführen. Benchmarking ist insbesondere bei SKUs mit nur acht Kernen wichtig. Unsere Forschung zeigt, dass acht Kern-CPUs nur für die am wenigsten anspruchsvollen Workloads funktionieren. Die meisten Workloads benötigen mindestens 16 Kerne, um leistungsfähig zu sein.

Analytische und Transaktionsworkloads

Transaktionsworkloads benötigen in der Regel ein Rechenzentrum, das für niedrige Latenz optimiert ist, während analytische Workloads häufig komplexere Abfragen verwenden, die längere Ausführung erfordern. In den meisten Fällen möchten Sie separate Rechenzentren:

  • Eines, das für geringe Wartezeit optimiert ist
  • Eines, das für Analyseworkloads optimiert ist

Optimieren für analytische Workloads

Es wird empfohlen, dass Kunden die folgenden cassandra.yaml Einstellungen für analytische Workloads anwenden. Weitere Informationen zum Anwenden dieser Einstellungen finden Sie unter Aktualisieren der Cassandra-Konfiguration.

Auszeiten

Wert Cassandra-MI-Standard Empfehlung für analytische Workload
read_request_timeout_in_ms 5.000 10.000
range_request_timeout_in_ms 10.000 20.000
counter_write_request_timeout_in_ms 5.000 10.000
cas_contention_timeout_in_ms 1.000 2.000
truncate_request_timeout_in_ms 60.000 120.000
slow_query_log_timeout_in_ms 500 1.000
roles_validity_in_ms 2.000 120.000
permissions_validity_in_ms 2.000 120.000

Caches

Wert Cassandra-MI-Standard Empfehlung für analytische Workload
Datei-Cache-Größe_in_MB 2,048 6\.144

Weitere Empfehlungen

Wert Cassandra-MI-Standard Empfehlung für analytische Workload
commitlog_total_space_in_mb 8,192 16.384
column_index_size_in_kb 64 16
Verdichtung_Durchsatz_MB_pro_Sekunde 128 256

Clienteinstellungen

Wir empfehlen, Cassandra-Clienttreibertimeouts entsprechend den auf dem Server angewendeten Timeouts zu erhöhen.

Optimierung für niedrige Latenz

Unsere Standardeinstellungen sind für Workloads mit geringer Latenz bereits geeignet. Um eine optimale Leistung für die Taillatenz zu gewährleisten, empfehlen wir dringend die Verwendung eines Clienttreibers, der eine spekulative Ausführung unterstützt, und die entsprechende Konfiguration Ihres Clients. Für Java V4-Treiber finden Sie eine Demo, die zeigt, wie dies funktioniert und wie die Richtlinie in diesem Beispiel aktiviert wird.

Überwachen auf Leistungsengpässe

CPU-Leistung

Wie jedes Datenbanksystem funktioniert Cassandra am besten, wenn die CPU-Auslastung etwa 50 % beträgt und nie über 80 % liegt. Sie können CPU-Metriken auf der Registerkarte „Metriken“ innerhalb der Überwachung über das Portal anzeigen:

Screenshot der CPU-Metriken nach Leerlaufauslastung.

Tipp

Fügen Sie für eine realistische CPU-Ansicht einen Filter hinzu, und teilen Sie die Eigenschaft nach Usage kind=usage_idle auf. Wenn dieser Wert niedriger als 20 % ist, können Sie die Trennung anwenden, um den Verbrauch nach allen Verbrauchsarten zu erhalten.

Screenshot der CPU-Metriken nach Verbrauchsart

Wenn die CPU dauerhaft über 80% für die meisten Knoten liegt, wird die Datenbank überlastet, die in mehreren Clienttimeouts manifestiert wird. In diesem Szenario wird empfohlen, die folgenden Aktionen auszuführen:

  • Vertikal hochskalieren bis zu einer SKU mit mehr CPU-Kernen, insbesondere, wenn die Anzahl der Kerne 8 oder weniger beträgt.
  • Horizontal skalieren, indem weitere Knoten hinzugefügt werden. Wie bereits erwähnt, sollte die Anzahl der Knoten ein Vielfaches des Replikationsfaktors sein.

Wenn die CPU nur für einige Knoten hoch ist, für die anderen jedoch niedrig ist, gibt sie eine heiße Partition an, die weitere Untersuchungen erfordert.

Hinweis

Das Ändern der SKU wird mithilfe des Azure-Portals, der Azure CLI und der ARM-Vorlagenbereitstellung unterstützt. Sie können eine ARM-Vorlage bereitstellen oder bearbeiten und SKU durch einen der folgenden Werte ersetzen:

  • Standard_E8s_v4
  • Standard_E16s_v4
  • Standard_E20s_v4
  • Standard_E32s_v4
  • Standard_DS13_v2
  • Standard_DS14_v2
  • Standard_D8s_v4
  • Standard_D16s_v4
  • Standard_D32s_v4
  • Standard_L8s_v3
  • Standard_L16s_v3
  • Standard_L32s_v3
  • Standard_L8as_v3
  • Standard_L16as_v3
  • Standard_L32as_v3

Derzeit unterstützen wir den Übergang zwischen SKU-Familien nicht. Wenn Sie z. B. derzeit über eine Standard_DS13_v2 SKU verfügen und ein Upgrade auf eine größere SKU, wie z. B. Standard_DS14_v2, durchführen möchten, ist diese Option nicht verfügbar. Sie können jedoch ein Supportticket öffnen, um ein Upgrade auf die höhere SKU anzufordern.

Datenträgerleistung

Der Dienst wird auf verwalteten Azure P30-Datenträgern ausgeführt, die Bursts an IOPS ermöglichen. Bei datenträgerbezogenen Leistungsengpässen ist eine sorgfältige Überwachung erforderlich. In diesem Fall ist es wichtig, die IOPS-Metriken zu überprüfen:

Screenshot der Datenträger-E/A-Metriken

Wenn Metriken eines oder alle der folgenden Merkmale anzeigen, müssen Sie möglicherweise nach oben skalieren.

  • Konstant höher als oder gleich dem Basis-IOPS. Denken Sie daran, 5.000 IOPS mit der Anzahl der Datenträger pro Knoten zu multiplizieren, um die Zahl abzurufen.
  • Konstant höher als oder gleich dem maximal zulässigen IOPS-Wert für die SKU für Schreibvorgänge.
  • Das SKU unterstützt zwischengespeicherten Speicher (Write-Through-Cache) und diese Zahl ist kleiner als die IOPS der verwalteten Datenträger. Dieser Wert ist die Obergrenze für Ihre Lese-IOPS.

Wenn IOPS nur für einige Knoten erhöht sind, verfügen Sie möglicherweise über eine heiße Partition und müssen Ihre Daten auf eine mögliche Schiefe überprüfen.

Wenn Ihre IOPS niedriger sind als das, was Ihre SKU unterstützt, und gleichzeitig höher oder gleich den Datenträger-IOPS sind, können Sie die folgenden Aktionen ausführen:

  • Fügen Sie weitere Datenträger hinzu, um die Leistung zu steigern. Das Erhöhen der Datenträgerzahl erfordert, dass ein Supportfall ausgelöst wird.
  • Skalieren Sie die Rechenzentren , indem Sie weitere Knoten hinzufügen.

Wenn Ihre IOPS die von der SKU unterstützten Werte überschreiten, haben Sie folgende Möglichkeiten:

Weitere Informationen finden Sie unter Virtuelle Computer und Datenträgerleistung.

Netzwerkleistung

In den meisten Fällen reicht die Netzwerkleistung aus. Wenn Sie jedoch häufig Daten streamen, wie z. B. häufige horizontale Skalierungs-/Skalierungsabskalierung, oder es große Ein-/Ausgang-Datenbewegungen gibt, kann diese Leistung zu einem Problem werden. Möglicherweise müssen Sie die Netzwerkleistung Ihrer SKU bewerten. Die Standard_DS14_v2 SKU unterstützt beispielsweise 12.000 Mb/s. Vergleichen Sie diesen Wert mit dem Byte-In/Out in den Metriken:

Screenshot der Netzwerkmetriken

Wenn die Netzwerkwerte nur für wenige Knoten erhöht sind, verfügen Sie möglicherweise über eine heiße Partition und müssen Ihre Datenverteilung und Zugriffsmuster auf einen potenziellen Neigung prüfen.

  • Skalieren Sie vertikal auf eine andere SKU noch, die mehr Netzwerk-E/A-Vorgänge unterstützt.
  • Skalieren Sie den Cluster horizontal hoch, indem Sie weitere Knoten hinzufügen.

Zu viele verbundene Clients

Sie sollten Bereitstellungen planen und bereitstellen, um die maximale Anzahl paralleler Anforderungen zu unterstützen, die für die gewünschte Latenz einer Anwendung erforderlich sind. Für eine beliebige Bereitstellung erhöht die Einführung von mehr Last im System über einem Mindestschwellenwert die Gesamtlatenz. Überwachen Sie die Anzahl der verbundenen Clients, um sicherzustellen, dass diese Situation keine zulässigen Grenzwerte überschreitet.

Screenshot der Metriken des verbundenen Clients

Speicherplatz

In den meisten Fällen ist ausreichend Speicherplatz vorhanden. Standardbereitstellungen sind für IOPS optimiert, was zu einer geringen Auslastung des Datenträgers führt. Dennoch wird empfohlen, gelegentlich Datenträgerspeichermetriken zu überprüfen. Cassandra sammelt zahlreiche Festplatten und reduziert diese dann, wenn die Komprimierung ausgelöst wird. Es ist wichtig, die Datenträgernutzung über längere Zeiträume zu überprüfen, um Trends zu ermitteln, z. B. die Komprimierung, die keinen Speicherplatz wieder herstellen kann.

Hinweis

Um verfügbaren Speicherplatz für die Komprimierung zu gewährleisten, sollte die Datenträgerauslastung auf etwa 50 % gehalten werden.

Wenn dieses Verhalten nur bei einigen Knoten auftritt, deutet dies möglicherweise auf eine überlastete Partition hin und Sie sollten Ihre Datenverteilungs- und Zugriffsmuster auf ein mögliches Ungleichgewicht überprüfen.

  • Fügen Sie weitere Datenträger hinzu, achten Sie jedoch auf IOPS-Grenzwerte, die von Ihrer SKU auferlegt werden.
  • Horizontales Skalieren des Clusters

JVM-Arbeitsspeicher

Unsere Standardformel weist dem Jave Virtual Machine (JVM) mit einer Obergrenze von 31 GB halb den Arbeitsspeicher des virtuellen Computers zu. In den meisten Fällen ist dieser Ansatz ein gutes Gleichgewicht zwischen Leistung und Arbeitsspeicher. Einige Workloads, insbesondere solche, die häufig partitionsübergreifende Lesevorgänge oder Bereichsscans ausführen, können Herausforderungen für den Arbeitsspeicher darstellen.

In den meisten Fällen wird der Speicher effektiv vom Java Garbage Collector freigegeben, aber insbesondere, wenn die CPU häufig über 80 % liegt, sind nicht genügend CPU-Zyklen für den Garbage Collector übrig. Daher sollten alle CPU-Leistungsprobleme vor Speicherproblemen behoben werden.

Wenn die CPU unter 70 % liegt und die Garbage Collection nicht in der Lage ist, Arbeitsspeicher freizugeben, benötigen Sie möglicherweise mehr JVM-Speicher. Mehr JVM-Speicher kann erforderlich sein, wenn Sie sich auf einer SKU mit begrenztem Arbeitsspeicher befinden. In den meisten Fällen müssen Sie Ihre Abfragen und Clienteinstellungen überprüfen und fetch_size im Einklang mit den in limit ausgewählten Werten in Ihrer CQL-Abfrage reduzieren.

Wenn Sie wirklich mehr Arbeitsspeicher benötigen, haben Sie folgende Möglichkeiten:

  • Erstellen Sie ein Ticket, damit wir die JVM-Speichereinstellungen für Sie erhöhen.
  • Skalieren Sie vertikal auf eine SKU, die mehr Arbeitsspeicher zur Verfügung hat.

Grabsteine

Wir führen Reparaturen alle sieben Tage mit dem Reaper aus, wodurch Zeilen entfernt werden, deren TTL abgelaufen ist, Tombstone genannt. Einige Workloads löschen häufiger und zeigen Warnungen wie Read 96 live rows and 5035 tombstone cells for query SELECT ...; token <token> (see tombstone_warn_threshold) in den Cassandra-Protokollen oder sogar Fehler an, die darauf hindeuten, dass eine Abfrage aufgrund übermäßiger Grabsteine nicht erfüllt werden konnte.

Eine kurzfristige Lösung, wenn Abfragen nicht erfüllt werden, besteht darin, den Wert in der tombstone_failure_thresholdCassandra-Konfiguration von der Standardeinstellung 100.000 auf einen höheren Wert zu erhöhen.

Außerdem empfehlen wir Ihnen, die TTL auf dem Keyspace zu überprüfen und möglicherweise täglich Reparaturen auszuführen, um weitere Grabsteine zu löschen. Wenn die TTLs kurz sind, z. B. weniger als zwei Tage, und Datenflüsse schnell gelöscht werden, empfehlen wir, die Komprimierungsstrategie zu überprüfen und zu bevorzugen Leveled Compaction Strategy. In einigen Fällen können solche Aktionen darauf hinweisen, dass eine Überprüfung des Datenmodells erforderlich ist.

Batchwarnungen

Diese Warnung kann in den CassandraLogs und potenziell damit verbundenen Fehlern auftreten:

Batch for [<table>] is of size 6.740KiB, exceeding specified threshold of 5.000KiB by 1.740KiB.

In diesem Fall sollten Sie Ihre Abfragen überprüfen, um unter der empfohlenen Batchgröße zu bleiben. In seltenen Fällen und als kurzfristige Entschärfung können Sie batch_size_fail_threshold_in_kb in der Cassandra-Konfiguration von der Standardeinstellung 50 auf einen höheren Wert setzen.

Warnung für große Partitionen

Diese Warnung kann in den CassandraLogs auftreten:

Writing large partition <table> (105.426MiB) to sstable <file>

Diese Meldung weist auf ein Problem im Datenmodell hin. Weitere Informationen finden Sie in diesem Stack Overflow-Artikel. Dieses Problem kann zu schwerwiegenden Leistungsproblemen führen und muss behoben werden.

Spezialisierte Optimierungen

Komprimierung

Cassandra ermöglicht die Auswahl eines geeigneten Komprimierungsalgorithmus, wenn eine Tabelle erstellt wird. Der Standardwert ist LZ4, der hervorragend für den Durchsatz und die CPU geeignet ist, aber mehr Speicherplatz auf dem Datenträger verbraucht. Die Verwendung von Zstd (Cassandra 4.0 und höher) spart ca. 12 % Platz mit minimalem CPU-Aufwand.

Optimieren des memtable-Heapbereichs

Der Standardwert ist die Verwendung von 1/4 des JVM-Heaps für memtable_heap_space im cassandra.yaml. Bei schreiborientierten Anwendungen und/oder SKUs mit kleinem Arbeitsspeicher kann dies zu häufigen Leerungen und fragmentierten sstables führen, wodurch eine größere Komprimierung erforderlich ist. In solchen Fällen kann es gut sein, es auf mindestens 4048 zu erhöhen. Dieser Ansatz erfordert ein sorgfältiges Benchmarking, um sicherzustellen, dass andere Vorgänge, z. B. Lesevorgänge, nicht betroffen sind.

Nächster Schritt