Cloudflare hat die allgemeine Verfügbarkeit der MySQL-Unterstützung in Hyperdrive angekündigt. Dabei handelt es sich um einen Dienst, den das Unternehmen für Workers-Nutzer zur Bündelung und Wiederverwendung von Datenbankverbindungen über das Unternehmensnetzwerk anbietet. Der Übergang von der Betaversion zur allgemeinen Verfügbarkeit erfolgte nach der Behebung von rund 20 Fehlern, darunter ein seltener Fehler beim Zwischenspeichern von Abfrageergebnissen, der zu leeren Antworten führte, obwohl Daten erwartet wurden.
Das Problem trat mit einer Rate von etwa 0,001 % auf, wodurch seine Erkennung über Tracing-Protokolle erschwert wurde. Cloudflare stellte fest, dass der Fehler nur bei aktiviertem Caching auftrat, nachdem der Kunde mit der höchsten Nutzung des MySQL-Dienstes während der Betaphase ihn gemeldet hatte.
Wie funktioniert Hyperdrive?
Hyperdrive hält SQL-Verbindungen im Cloudflare-Netzwerk warm und offen und teilt sie anschließend zwischen Workers-Anfragen, anstatt für jede Anfrage eine neue Verbindung herzustellen. Außerdem kann der Dienst häufige Abfrageergebnisse im lokalen CDN-Speicher zwischenspeichern, wodurch die Latenz und die Belastung der ursprünglichen Datenbank reduziert werden.
Die Architektur des Dienstes besteht aus einem Client-Knoten, der in der Nähe des Workers arbeitet, und einem Endpoint-Knoten, der den Verbindungspool verwaltet und sich in einem Rechenzentrum in der Nähe der ursprünglichen Datenbank befindet. Die beiden Knoten können denselben Cache nutzen, wenn sie im selben Rechenzentrum betrieben werden.
Der Fehler lag in unterschiedlichen Formaten des MySQL-Protokolls
Hyperdrive arbeitet mit MySQL von zwei verschiedenen Seiten: Es fungiert als Server gegenüber dem Worker und als Client gegenüber der ursprünglichen Datenbank. Da sich die vom Worker ausgehandelten Protokollfunktionen von den Funktionen unterscheiden können, die Hyperdrive gegenüber der Datenbank verwendet, muss der Dienst die Ergebnisnachrichten neu formatieren, damit sie zum endgültigen Client passen.
Die Untersuchung konzentrierte sich auf die Art und Weise, wie Ergebnisgruppen beendet werden. Einige MySQL-Bibliotheken, darunter die verbreitete Bibliothek mysql2 in Node.js, unterstützen die Funktion CLIENT_DEPRECATE_EOF nicht. Fehlt diese Funktion, verwendet der Server EOF-Pakete, während das neuere Protokollverhalten sie am Ende einer Ergebnisgruppe durch ein OK-Paket ersetzt.
Der Client-Knoten speicherte bisweilen die Bytes, nachdem er sie an die Fähigkeiten des Workers angepasst hatte, während der Endpoint-Knoten eine standardisierte Version mit den Hyperdrive-Funktionen erwartete. Wenn einer der Knoten ein vom jeweils anderen gespeichertes Ergebnis las, konnte er die Nachrichten im falschen Format verarbeiten, was zu einem vorzeitigen EOF, einem Hänger oder einem leeren Ergebnis führte.
Was hat sich praktisch geändert?
Cloudflare behob das Problem, indem alle Knoten eine standardisierte Version des Abfrageergebnisses im Cache speichern. Diese wird unabhängig davon, welcher Knoten sie gespeichert hat, immer entsprechend den Hyperdrive-Funktionen codiert. Nach der Einführung der Fehlerbehebung verschwand das Problem der leeren Zeilen, und die Erfolgsrate der Client-Verbindungen erreichte laut Cloudflare 99,99 %.
Das Unternehmen behob außerdem weitere während des Tests aufgetretene Probleme, darunter einen Fehler bei der Codierung von Emojis. Die Verwendung von utf8 verwies faktisch auf utf8mb3, das nicht alle vier Byte langen Unicode-Codepunkte unterstützt. Der Dienst wechselte zu utf8mb4. Zudem setzte er die Codierung nach der Ausführung des Befehls COM_RESET_CONNECTION erneut, da dieser Befehl die Verbindung auf die Standardeinstellung des Servers zurücksetzt, die latin1 sein kann.
Verfügbarkeit und Einschränkungen
Die MySQL-Unterstützung ist ab heute allgemein über das Cloudflare-Dashboard oder das Tool wrangler verfügbar und kann mit kompatiblen MySQL-Datenbanken verwendet werden, einschließlich der Verbindung zu einer neuen PlanetScale-Datenbank. Der Fall verdeutlicht, dass die Bündelung von Verbindungen und das Caching in einer vermittelnden Schicht nicht nur von der Korrektheit von SQL abhängen, sondern auch eine genaue Übereinstimmung zwischen den Protokollzuständen und dem von jeder Schicht erwarteten Format erfordern.