Redis-Cache-Performance in großem Maßstab verbessern
(meetup.toast.com)Redis ist eine In-Memory-Datenbank, die häufig für das Caching von Online-Diensten eingesetzt wird. Bei falscher Nutzung können jedoch unerwartete Probleme auftreten oder sogar größere Ausfälle entstehen. Ich war kürzlich in einer Buchhandlung und traf dort zufällig einen aktiven Engineer, der im SRE-Team eines Unternehmens arbeitet. Im Gespräch sagte er sogar: „Redis ist im Grunde ein notwendiges Übel. Man sollte es mit dem Gedanken einsetzen, dass irgendwann mindestens einmal ein entsprechender Ausfall passieren wird.“
Referenz - Kakao "Wenn man Redis falsch benutzt, ist man erledigt":
https://zdnet.co.kr/view/?no=20131119174125
Referenz - Ursache des Coupang-Fehlers war die Open-Source-"Redis DB":
http://www.digitaltoday.co.kr/news/articleView.html?idxno=212904
So ist Redis ein Werkzeug, das man nur mit gutem Verständnis und großer Sorgfalt einsetzen sollte.
Die Einleitung ist lang geworden. Auf Basis eines Vortrags von RedisConf 2020 stellt NHN ein Dokument vor, das auf drei Punkte hinweist, an denen beim Einsatz von Redis als Cache in Umgebungen mit hohem Traffic Performance-Probleme auftreten können, und die jeweiligen Lösungen erklärt. (Koreanisch)
-
Cache Stampede: Da der Cache-Speicher begrenzt ist, wird für gespeicherte Daten üblicherweise eine Ablaufzeit (TTL) festgelegt. Wenn jedoch weiterhin Leseanfragen auf diese Daten eingehen und die Cache-Ablaufzeit erreicht wird, konzentrieren sich diese Leseanfragen schlagartig auf die DB, was wiederum zu gebündelten doppelten Schreibanfragen an Redis führt. Dies wird als Cache Stampede bezeichnet. Als Lösungsansätze gibt es etwa, den TTL-Wert mithilfe eines auf Wahrscheinlichkeitsverteilungen basierenden Algorithmus vorab zu erneuern oder das Konzept des Debounce einzuführen, bei dem von mehrfach wiederholten Events nur das letzte ausgeführt wird.
-
Hot Keys: Auch wenn sich Lesezugriffe auf einen einzelnen Key konzentrieren, kann die Performance sinken. Der Artikel stellt als Gegenmaßnahme vor, mehrere Replikate zu erzeugen, indem man dem Key-Namen ein Prefix voranstellt, und die Lesezugriffe dann zufällig auf diese Replikate mit Prefix zu verteilen.
-
Compression: Auch beim Speichern großer Datenmengen in Redis kann es zu Performance-Einbußen kommen. Schon durch den Einsatz einer geeigneten Komprimierung lassen sich große Vorteile bei Geschwindigkeit und Speicherverbrauch erzielen. Da die passende Komprimierungsmethode und -rate je nach Situation und Umgebung unterschiedlich sein können, sind Benchmark-Tests, die die Einsatzumgebung realistisch nachbilden, bei der Einführung unverzichtbar.
1 Kommentare
Hinweis – ein Artikel mit Beispielcode für den oben erwähnten Algorithmus auf Basis von Wahrscheinlichkeitsverteilungen (Probabilistic Early Recomputation):
https://engineering.linecorp.com/ko/blog/…