Datenbanken in Kubernetes – Alternativen zur Cloud-Hosted DB
Der Betrieb von Datenbanken in Kubernetes galt lange Zeit als riskant: Stateful Workloads, …
In einer detaillierten Blogserie gibt das Core-Services-Team von Nextdoor wertvolle Einblicke in ihre Strategien zur Optimierung der Datenbank- und Cache-Infrastruktur. Diese Serie richtet sich an Entwicklerteams, die sich mit den Skalierungsherausforderungen von PostgreSQL und Redis auseinandersetzen.
Die Ausgangssituation und die zentralen Herausforderungen Nextdoor sah sich mit zwei wesentlichen Problemen konfrontiert:
Übermäßige Belastung der Hauptdatenbank, ungeachtet der Nutzung von Lesereplikas. Probleme mit Inkonsistenzen im Cache-System. Das Architekturdesign des Backends, das stark auf das Django-ORM zurückgreift, führte dazu, dass Anfragen häufig aus Sicherheitsgründen an die Primärdatenbank gingen. Dies löste weitere Probleme aus, wie Dateninkonsistenzen durch konkurrierende Schreibzugriffe und nicht erfolgreiche Cache-Aktualisierungen.
Innovativer Lösungsansatz
Das Team entwickelte eine intelligente Nachverfolgung der Datenbankänderungen, um Leseanfragen entsprechend an die Primär- oder Replikadatenbanken zu leiten. Änderungen am Datenbestand führten dabei zu einer bevorzugten Weiterleitung an die Primärdatenbank, während stabilisierte Datensätze an Replikas geschickt wurden.
Die Umstellung von Python Pickle auf MessagePack als Serialisierungsformat war ein entscheidender Schritt, um Kompatibilitätsprobleme bei Schemaänderungen zu vermeiden. Diese Umstellung reduzierte auch die Risiken eines “Thundering Herd”-Problems bei Deployments.
Durch die Einführung von automatisch inkrementierten Versionierungszahlen (db_version) pro Datensatz, die durch Trigger in PostgreSQL aktualisiert werden, konnten die Entwickler verhindern, dass veraltete Daten im Cache landen. Dies wurde durch atomare Operationen in Redis mithilfe von Lua-Skripten möglich gemacht.
Ein auf PostgreSQL Change Data Capture (CDC) basierender “Reconciler” sorgte dafür, dass verpasste Cache-Updates in Echtzeit und zeitverzögert korrigiert werden konnten, um die Datenintegrität zu gewährleisten.
Weitere Aspekte:
Neben den beschriebenen Lösungsansätzen berücksichtigt das Team zudem Sicherheitsaspekte und die kontinuierliche Überwachung der Systeme. Dabei kommen Monitoring-Tools zum Einsatz, die Engpässe frühzeitig erkennen und beheben können. Eine weitere Maßnahme, die in Betracht gezogen wird, ist die Speicherung von komplexeren Datenabfragen im Cache, um die Leistung bei aufwendigen Abfragen zu steigern.
Fazit:
Durch diese umfassende Optimierung konnte Nextdoor die Belastung auf die Hauptdatenbank deutlich reduzieren, die Konsistenz in der Cache-Infrastruktur verbessern und das System insgesamt resilienter gestalten. Diese innovative Herangehensweise zeigt, dass traditionelle relationale Datenbanken durch umfangreiche Analyse und Optimierungsansätze hocheffizient skaliert werden können. Der Schlüssel liegt in der sorgfältigen Planung und Umsetzung maßgeschneiderter Lösungen.n
Der Betrieb von Datenbanken in Kubernetes galt lange Zeit als riskant: Stateful Workloads, …
Wer Anwendungen produktiv betreibt, braucht keine schönen Dashboards, sondern harte Daten. …
Heute freuen wir uns, die Veröffentlichung von etcd v3.6.0 bekannt zu geben, dem ersten …