Lassen Sie uns darüber sprechen, wie man mit dem Cache-Hotkey-Problem in Redis umgeht. Häufig verwendete Lösungsfreigabe
青灯夜游
Freigeben: 2022-02-28 09:45:41
nach vorne
3240 Leute haben es durchsucht
Wie gehe ich mit dem Hotkey-Problem in Redis um? Der folgende Artikel stellt Ihnen gängige Lösungen für das Redis-Cache-Hotkey-Problem vor. Ich hoffe, er wird Ihnen helfen!
Bei einigen C-seitigen Geschäften ist es unvermeidlich, einen First-Level-Cache einzuführen, um den Druck der Datenbank zu ersetzen und die Geschäftsreaktionszeit zu verkürzen. Tatsächlich wird jedes Mal eine Middleware eingeführt, um das Problem zu lösen Dies wird unweigerlich viele neue Probleme mit sich bringen, die Aufmerksamkeit erfordern, beispielsweise die Frage, wie die Cache-Konsistenz erreicht werden kann, die im vorherigen Artikel „Datenbank- und Cache-Konsistenz in der Praxis“ erwähnt wurde. Tatsächlich kann es bei der Verwendung von Redis als Cache der ersten Ebene zu einigen anderen Problemen wie Hotkeys, großen Tasten usw. kommen. In diesem Artikel werden wir den Hotkey(Hotkey) besprechen )-Problem und wie man dasHotkey-Problem sinnvoll löst. -
如下所示,可以看到redis-cli –hotkeysHot KeyWie wird es verursacht?
Im Allgemeinen handelt es sich bei dem von uns verwendeten Cache-Redis um eine Multi-Node-Cluster-Version. Beim Lesen und Schreiben eines bestimmten Schlüssels wird der entsprechende Slot anhand des Hashs des Schlüssels berechnet und der entsprechende Slot kann auf dieser Grundlage gefunden werden Für den Zugriff auf den K-V wird Sharding (ein Satz von Redis-Clustern bestehend aus einem Master und mehreren Slaves) verwendet. Im eigentlichen Antragsprozess kann es jedoch für bestimmte Unternehmen oder bestimmte Zeiträume (z. B. Produkt-Flash-Sales-Aktivitäten in E-Commerce-Unternehmen) zu einer großen Anzahl von Anfragen kommen, die auf denselben Schlüssel zugreifen. Alle Anfragen (und das Lese-/Schreibverhältnis dieser Anfragen ist sehr hoch) fallen auf denselben Redis-Server, und die Belastung des Redis wird erheblich erhöht. Zu diesem Zeitpunkt wird das Hinzufügen neuer Redis-Instanzen zum gesamten System erforderlich sein Kein Nutzen, da laut Hash-Algorithmus Anfragen für denselben Schlüssel immer noch auf denselben neuen Computer fallen, was immer noch zu einem Systemengpass2 führt und sogar zum Absturz des gesamten Clusters führt, wenn der Wert dieses Hotspot-Schlüssels relativ ist groß, es wird auch dazu führen, dass die Netzwerkkarte den Engpass erreicht. Dieses Problem wird als „Hotkey“-Problem bezeichnet. [Verwandte Empfehlungen:
Redis-Video-Tutorial] Wie in den Abbildungen 1 und 2 dargestellt Nachfolgend finden Sie den normalen Redis-Cluster-Cluster und den Redis-Cluster-Schlüsselzugriff mithilfe einer Proxy-Agent-Ebene.
Wie oben erwähnt, Hotkeys führen zu einem extrem hohen Lastdruck auf eine kleine Anzahl von Knoten im Cluster. Wenn sie nicht richtig gehandhabt werden, können diese Knoten ausfallen, was sich auf den Betrieb des gesamten Cache-Clusters auswirkt. Daher müssen wir Hotkeys rechtzeitig erkennen und lösen Sie sie.
1. Hotkey-Erkennung
Die Hotkey-Erkennung hat aufgrund der Streuung des Redis-Clusters und des Hotkeys einige erhebliche Auswirkungen und kann daher sorgfältig überlegt werden über den Prozess zur Entwicklung einer Lösung zur Erkennung von Hotspot-Schlüsseln.
1.1 QPS-Überwachung jedes Slots im Cluster
Die offensichtlichste Auswirkung von Hotkeys besteht darin, dass die QPS im gesamten Redis-Cluster überwacht werden Unter der Voraussetzung, dass der Verkehr ungleichmäßig auf die Slots im Cluster verteilt ist, können wir uns zunächst vorstellen, den Verkehr in jedem Slot zu überwachen, den Verkehr in jedem Slot zu vergleichen und ihn dann zu vergleichen Beim Erkennen der betroffenen Steckplätze wird ein Hotkey angezeigt. Obwohl diese Überwachung am bequemsten ist, ist die Granularität zu grob. Sie eignet sich nur für frühe Cluster-Überwachungslösungen und nicht für Szenarien, in denen Hotkeys genau erkannt werden.
1.2 Der Proxy-Mechanismus wird als gesamte Verkehrseingangsstatistik verwendet
Wenn wir den Redis-Cluster-Proxy-Modus in Abbildung 2 verwenden, Aufgrund von Alle Anforderungen werden zuerst an den Proxy und dann an den spezifischen Slot-Knoten weitergeleitet. Anschließend können die Erkennungsstatistiken dieses Hotkeys im Proxy erstellt werden, basierend auf dem
Zeitgleitfenster. Zählen Sie jeden Schlüssel und dann die Schlüssel, die den entsprechenden Schwellenwert überschreiten. Um zu viele redundante Statistiken zu verhindern, können Sie auch einige Regeln festlegen, um nur Schlüssel zu zählen, die dem Präfix und Typ entsprechen. Diese Methode erfordert mindestens einen Proxy-Mechanismus und stellt Anforderungen an die Redis-Architektur.
Versionen von Redis 4.0 oder höher unterstützen LFU-basierte Hotspots auf jedem Knoten Schlüsselerkennungsmechanismus: Verwenden Sie
redis-cli –hotkeys. Fügen Sie die Option –hotkeys hinzu, wenn Sie redis-cli ausführen. Sie können diesen Befehl regelmäßig auf dem Knoten verwenden, um den entsprechenden Hotspot-Schlüssel zu ermitteln.
as Wie in der Abbildung gezeigt, können Sie die Ausführungsergebnisse von
redis-cli –hotkeysund die statistischen Informationen zu Hotkeys sehen. Die Ausführungszeit dieses Befehls ist lang und Sie können eine geplante Ausführung einrichten um Statistiken zu sammeln.
1.4 Erkennung basierend auf dem Redis-Client
Da Redis-Befehle jedes Mal vom Client ausgegeben werden, können wir auf dieser Grundlage statistische Zählungen in einigen Codes des Redis-Clients durchführen, und jeder Client führt Statistiken basierend auf dem Zeitgleitfenster durch. Nach Überschreiten eines bestimmten Schwellenwerts wird es dem Server gemeldet, und der Server sendet es dann einheitlich an jeden Client und konfiguriert die entsprechende Ablaufzeit.
Diese Methode sieht schöner aus, ist jedoch in einigen Anwendungsszenarien tatsächlich nicht so geeignet, da die Änderung auf der Clientseite einen größeren Speicheraufwand für den laufenden Prozess mit sich bringt. Direkter sind Sprachen mit automatischer Speicherverwaltung, z Java und goLang erstellen häufiger Objekte, lösen GC aus und führen zu einer Verlängerung der Schnittstellenantwortzeit. Dies ist nicht leicht vorherzusagen.优美,其实在一些应用场景中并不是那么合适,因为在client端这一侧的改造,会给运行的进程带来更大的内存开销,更直接的来说,对于Java和goLang这种自动内存管理的语言,会更加频繁的创建对象,从而触发gc导致接口响应耗时增加的问题,这个反而是不太容易预料到的事情。
Am Ende können Sie über die Infrastruktur jedes Unternehmens entsprechende Entscheidungen treffen.
2. Hotkey-Lösung
Nachdem wir mit den oben genannten Methoden den entsprechenden Hotkey oder Hot-Slot erkannt haben, müssen wir das entsprechende Hotkey-Problem lösen. Es gibt mehrere Ideen zum Lösen von Hotkeys. Gehen wir sie einzeln durch.
2.1 Den Fluss bestimmter Tasten oder Slots begrenzen Der einfachste und einfachste Weg besteht darin, den Fluss bestimmter Slots oder Hotkeys zu begrenzen Geschäft Es ist verlustbehaftet, daher wird empfohlen, eine spezifische Strombegrenzung nur dann zu verwenden, wenn ein Online-Problem vorliegt und der Verlust gestoppt werden muss.
2.2 Second-Level-Cache (lokal) verwenden Lokaler Cache ist auch die am häufigsten verwendete Lösung Da unser First-Level-Cache einem so starken Druck nicht standhalten kann Fügen Sie einen Cache der zweiten Ebene hinzu. Da jede Anforderung vom Dienst ausgegeben wird, ist es perfekt, diesen Cache der zweiten Ebene zur Dienstseite hinzuzufügen. Daher kann der Server jedes Mal, wenn er den entsprechenden Hotkey erhält, den lokalen Cache verwenden, um eine Kopie bis zum lokalen Cache zu speichern Läuft dann erneut ab, um den Druck auf den Redis-Cluster zu verringern. Am Beispiel von Java ist guavaCache ein vorgefertigtes Tool. Das folgende Beispiel: rrreee Die größte Auswirkung des lokalen Caches auf uns ist das Problem der Dateninkonsistenz. Wie lange wir die Cache-Ablaufzeit festlegen, führt zu dem längsten Online-Dateninkonsistenzproblem. Diese Cache-Zeit muss den eigenen Clusterdruck messen und die maximale vom Unternehmen akzeptierte inkonsistente Zeit.
2.3 Schlüsselentfernung Wie kann sichergestellt werden, dass keine Hotkey-Probleme auftreten und gleichzeitig die Datenkonsistenz so weit wie möglich sichergestellt wird? Auch das Abziehen des Schlüssels ist eine gute Lösung. Wenn wir es in den Cache legen, teilen wir den Cache-Schlüssel des entsprechenden Unternehmens in mehrere verschiedene Schlüssel auf. Wie in der Abbildung unten gezeigt, teilen wir den Schlüssel zunächst auf der Seite des Update-Cache in N Teile auf. Wenn ein Schlüssel beispielsweise „good_100“ heißt, können wir ihn in vier Teile aufteilen: „good_100_copy1“, „good_100_copy2“. „, „good_100_copy3“, „good_100_copy4“, diese N Schlüssel müssen jedes Mal geändert werden, wenn sie aktualisiert oder hinzugefügt werden. In diesem Schritt wird der Schlüssel entfernt. Auf der Serviceseite müssen wir Möglichkeiten finden, den Datenverkehr, auf den wir zugreifen, gleichmäßig zu gestalten und den Hotkeys, auf die wir zugreifen möchten, Suffixe hinzuzufügen. Es gibt mehrere Möglichkeiten, einen Hash basierend auf der IP- oder MAC-Adresse des Computers zu erstellen, dann den Restwert und die Anzahl der geteilten Schlüssel zu nehmen und schließlich zu entscheiden, in welche Art von Schlüsselsuffix er gespleißt wird. um anzugeben, auf welche Maschine es beim Start des Dienstes übertragen wird. Die Zufallszahl ist der Rest der Anzahl der geteilten Schlüssel.
2.4 Eine andere Denkweise über das lokale Cache-Konfigurationscenter Für diejenigen, die mit dem Microservice-Konfigurationscenter vertraut sind: Unsere Denkweise kann sich zur Konsistenz des Konfigurationscenters ändern. Nehmen Sie als Beispiel Nacos, wie wird eine verteilte Konfigurationskonsistenz erreicht und schnell reagiert? Dann können wir die Cache-Analogie mit der Konfiguration vergleichen und es so machen. Lange Abfrage+LokalisierungKonfiguration. Zuerst werden alle Konfigurationen initialisiert, wenn der Dienst gestartet wird, und dann wird regelmäßig eine lange Abfrage gestartet, um zu überprüfen, ob sich die aktuelle Dienstüberwachungskonfiguration geändert hat. Bei einer Änderung wird die lange Abfrageanforderung sofort zurückgegeben, um die lokale Konfiguration zu aktualisieren. Wenn es keine Änderung gibt, verwenden alle Geschäftscodes die lokale Speicher-Cache-Konfiguration. Dies stellt die Aktualität und Konsistenz der verteilten Cache-Konfiguration sicher.
2.5 Andere Pläne, die im Voraus erstellt werden können
Jede der oben genannten Lösungen ist relativ unabhängig, um das Hotkey-Problem zu lösen. Wenn wir also wirklich mit geschäftlichen Anforderungen konfrontiert sind, haben wir tatsächlich lange Zeit, über das Gesamtlösungsdesign nachzudenken . Bei Hotkey-Problemen, die durch einige extreme Flash-Sales-Szenarien verursacht werden, können wir, wenn wir über genügend Budget verfügen, das Servicegeschäft und den Redis-Cache-Cluster direkt isolieren, um eine Beeinträchtigung des normalen Geschäfts zu vermeiden, und gleichzeitig vorübergehend eine bessere Notfallwiederherstellung einführen und Aktuelle Begrenzungsmaßnahmen.
Einige integrierte Lösungen
Es gibt bereits viele relativ vollständige Lösungen auf Anwendungsebene für HotKey. Darunter verfügt JD.com über ein Open-Source-Hotkey-Tool. Das Prinzip besteht darin, Einblicke in den Client zu gewinnen Seite und melden Sie dann den Antwort-Hotkey. Nachdem der Server ihn erkannt hat, sendet er den entsprechenden Hotkey zum lokalen Caching an den entsprechenden Server, und dieser lokale Cache wird synchron aktualisiert, nachdem der entsprechende Remote-Schlüssel aktualisiert wurde. Es ist bereits relativ ausgereift Derzeitige Lösung:自动探测热key、分布式一致性缓存JD Retail Hotkey.
Zusammenfassung
Im Folgenden finden Sie einige Lösungen zum Umgang mit Hotkeys, die der Autor grob verstanden oder geübt hat, von der Entdeckung von Hotkeys bis zur Lösung der beiden Schlüsselprobleme von Hotkeys. Jede Lösung hat Vor- und Nachteile, wie z. B. geschäftliche Inkonsistenzen, Schwierigkeiten bei der Implementierung usw. Sie können entsprechende Anpassungen und Änderungen basierend auf den aktuellen Merkmalen Ihres eigenen Unternehmens und der aktuellen Unternehmensinfrastruktur vornehmen.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter:
Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, wie man mit dem Cache-Hotkey-Problem in Redis umgeht. Häufig verwendete Lösungsfreigabe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn