{"id":91846,"date":"2020-08-19T19:41:57","date_gmt":"2020-08-19T17:41:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster"},"modified":"2020-08-19T19:41:57","modified_gmt":"2020-08-19T17:41:57","slug":"o-pereezde-s-redis-na-redis-cluster","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","title":{"rendered":"\u00dcber den Umstieg von Redis auf Redis-Cluster","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00dcber den Umstieg von Redis auf Redis-Cluster\" src=\"\/wp-content\/uploads\/2020\/08\/ea8bc47f73ef3b06ccfdf94d323592bf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Wenn man auf ein Produkt st\u00f6\u00dft, das seit \u00fcber einem Jahrzehnt entwickelt wird, ist es nicht \u00fcberraschend, veraltete Technologien anzutreffen. Aber was, wenn Sie in sechs Monaten eine Last tragen m\u00fcssen, die zehnmal h\u00f6her ist, und die Kosten f\u00fcr Ausf\u00e4lle um ein Vielfaches steigen? In diesem Fall ben\u00f6tigen Sie einen talentierten Highload-Engineer. Aber da es einen solchen nicht gab, wurde mir die L\u00f6sung des Problems anvertraut. Im ersten Teil des Artikels berichte ich dar\u00fcber, wie wir von Redis zu Redis-Cluster gewechselt sind, und im zweiten Teil gebe ich Ratschl\u00e4ge, wie man mit dem Cluster arbeitet und worauf man bei der Nutzung achten sollte.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"vybor-tehnologii\">Technologieauswahl<\/h1>\n<p><\/p>\n<p>Ist ein <em>einzelnes Redis<\/em> (standalone redis) in der Konfiguration 1 Master und N Slaves so schlecht? Warum nenne ich es eine veraltete Technologie?<\/p>\n<p><\/p>\n<blockquote><p>Nein, Redis ist nicht so schlecht\u2026 Es gibt jedoch einige M\u00e4ngel, die man nicht ignorieren kann.<\/p><\/blockquote>\n<p><\/p>\n<ul>\n<li>\n<p>Erstens unterst\u00fctzt Redis keine Mechanismen zur Wiederherstellung nach dem Ausfall des Masters. Um dieses Problem zu l\u00f6sen, haben wir eine Konfiguration verwendet, die eine automatische Umleitung von VIPs zu einem neuen Master, die Rollen\u00e4nderung eines Slaves und das Umschalten des Restes beinhaltete. Dieser Mechanismus funktionierte, aber man konnte ihn nicht als zuverl\u00e4ssige L\u00f6sung bezeichnen. Erstens gab es Fehlalarme, und zweitens war er einmalig, und nach dem Ausl\u00f6sen waren manuelle Eingriffe n\u00f6tig, um die Feder zur\u00fcckzusetzen.<\/p>\n<p>\n<\/li>\n<li>\n<p>Zweitens f\u00fchrte das Vorhandensein nur eines Masters zu einem Problem mit der Shardierung. Es war notwendig, mehrere unabh\u00e4ngige Cluster \u201e1 Master und N Slaves\u201c zu erstellen, die Datenbanken manuell auf diesen Maschinen zu verteilen und zu hoffen, dass eine der Datenbanken am n\u00e4chsten Tag nicht so gro\u00df wird, dass sie auf eine separate Instanz verschoben werden muss.<\/p>\n<p>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Was sind die Optionen?<\/p>\n<p><\/p>\n<ul>\n<li>Die teuerste und umfassendste L\u00f6sung ist Redis-Enterprise. Dies ist eine Boxl\u00f6sung mit vollst\u00e4ndigem technischem Support. Obwohl es aus technischer Sicht perfekt aussieht, passte es uns aus ideologischen Gr\u00fcnden nicht. <\/li>\n<li>Redis-Cluster. Aus der Box heraus gibt es Unterst\u00fctzung f\u00fcr die Notfallumschaltung des Masters und die Shardierung. Die Schnittstelle unterscheidet sich kaum von der normalen Version. Sie sieht vielversprechend aus; auf die Fallstricke gehen wir sp\u00e4ter ein.<\/li>\n<li>Tarantool, Memcache, Aerospike und andere. Alle diese Tools tun im Grunde das Gleiche. Aber jedes hat seine eigenen Nachteile. Wir haben uns entschieden, nicht alle Eier in einen Korb zu legen. Memcache und Tarantool verwenden wir f\u00fcr andere Aufgaben, und um vorzugreifen, kann ich sagen, dass wir in unserer Praxis mehr Probleme mit ihnen hatten.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"specifika-ispolzovaniya\">Spezifik der Nutzung<\/h1>\n<p><\/p>\n<p>Lassen Sie uns einen Blick darauf werfen, welche Aufgaben wir historisch mit Redis gel\u00f6st haben und welche Funktionen wir genutzt haben:<\/p>\n<p><\/p>\n<ul>\n<li>Cache vor Anfragen an externe Dienste wie 2GIS | Golang<br \/>\n<blockquote><p>GET SET MGET MSET \"Datenbank ausw\u00e4hlen\"\n<\/p><\/blockquote>\n<\/li>\n<li>Cache vor MYSQL | PHP<br \/>\n<blockquote><p>GET SET MGET MSET SCAN \"Schl\u00fcssel nach Muster\" \"Datenbank ausw\u00e4hlen\"\n<\/p><\/blockquote>\n<\/li>\n<li>Hauptspeicher f\u00fcr den Dienst zur Verwaltung von Sitzungen und Fahrerkoordinaten | Golang<br \/>\n<blockquote><p>GET SET MGET MSET \"Datenbank ausw\u00e4hlen\" \"Geo-Schl\u00fcssel hinzuf\u00fcgen\" \"Geo-Schl\u00fcssel abrufen\" SCAN\n<\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p><\/p>\n<p>Wie Sie sehen, keine h\u00f6here Mathematik. Wo liegt dann die Schwierigkeit? Lassen Sie uns die einzelnen Methoden genauer betrachten.<\/p>\n<p><\/p>\n<p>Methode<br \/>\nBeschreibung<br \/>\nBesonderheiten von Redis-Cluster<br \/>\nL\u00f6sung<\/p>\n<p>GET SET<br \/>\nSchl\u00fcssel schreiben\/lesen<\/p>\n<p>MGET MSET<br \/>\nMehrere Schl\u00fcssel schreiben\/lesen<br \/>\nDie Schl\u00fcssel werden auf verschiedenen Knoten liegen. Vorhandene Bibliotheken k\u00f6nnen Multi-Operationen nur innerhalb eines Knotens durchf\u00fchren.<br \/>\nMGET durch eine Pipeline aus N GET-Operationen ersetzen<\/p>\n<p>SELECT DB<br \/>\nW\u00e4hlen Sie die Datenbank, mit der wir arbeiten wollen<br \/>\nUnterst\u00fctzt keine mehreren Datenbanken<br \/>\nAlles in einer Datenbank speichern. F\u00fcgen Sie den Schl\u00fcsseln Pr\u00e4fixe hinzu.<\/p>\n<p>SCAN<br \/>\nAlle Schl\u00fcssel in der Datenbank durchlaufen<br \/>\nDa wir nur eine Datenbank haben, ist das Durchlaufen aller Schl\u00fcssel im Cluster zu kostenintensiv.<br \/>\nDas Invarianz innerhalb eines Schl\u00fcssels aufrecht erhalten und HSCAN f\u00fcr diesen Schl\u00fcssel durchf\u00fchren. Oder ganz darauf verzichten.<\/p>\n<p>GEO<br \/>\nOperationen mit Geokey<br \/>\nGeokey wird nicht partitioniert<\/p>\n<p>KEY BY PATTERN<br \/>\nSchl\u00fcssel nach Muster suchen<br \/>\nDa wir nur eine Datenbank haben, werden wir nach allen Schl\u00fcsseln im Cluster suchen. Zu kostenintensiv.<br \/>\nAufgeben oder Invarianz aufrechterhalten, wie im Fall mit SCAN.<\/p>\n<p><\/p>\n<h1 id=\"redis-vs-redis-cluster\">Redis vs Redis-Cluster<\/h1>\n<p><\/p>\n<p>Was verlieren wir und was gewinnen wir bei der Umstellung auf ein Cluster?<\/p>\n<p><\/p>\n<ul>\n<li>Nachteile: Verlust der Funktionalit\u00e4t mehrerer Datenbanken. \n<ul>\n<li>Wenn wir in einem Cluster logisch nicht verbundene Daten speichern wollen, m\u00fcssen wir mit 'Kost\u00fcmen' in Form von Pr\u00e4fixen arbeiten. <\/li>\n<li>Wir verlieren alle operationen 'pro Datenbank', wie SCAN, DBSIZE, CLEAR DB usw.<\/li>\n<li>Multi-Operationen sind erheblich komplizierter in der Implementierung, da m\u00f6glicherweise auf mehrere Knoten zugegriffen werden muss.<\/li>\n<\/ul>\n<\/li>\n<li>Vorteile: \n<ul>\n<li>Ausfallsicherheit durch die Notfall-Umschaltung des Masters.<\/li>\n<li>Sharding auf der Redis-Seite.<\/li>\n<li>Daten atomar und ohne Ausfallzeiten zwischen Knoten verschieben.<\/li>\n<li>Hinzuf\u00fcgen und Neuzuordnen von Ressourcen und Lasten ohne Ausfallzeiten.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><em>Ich w\u00fcrde den Schluss ziehen, dass, wenn Sie keinen hohen Grad an Ausfallsicherheit ben\u00f6tigen, ein Umzug zu einem Cluster nicht lohnt, da dies eine nicht triviale Aufgabe sein kann. Wenn Sie jedoch urspr\u00fcnglich zwischen einer Einzelversion und einer Clusterversion w\u00e4hlen m\u00fcssen, sollten Sie das Cluster w\u00e4hlen, da es nicht schlechter ist und zus\u00e4tzlich einen Teil der Kopfschmerzen von Ihnen nimmt.<\/em><\/p>\n<p><\/p>\n<h1 id=\"podgotovka-k-pereezdu\">Vorbereitung auf den Umzug<\/h1>\n<p><\/p>\n<p>Beginnen wir mit den Anforderungen an den Umzug:<\/p>\n<p><\/p>\n<ul>\n<li>Er muss nahtlos sein. Eine vollst\u00e4ndige Serviceunterbrechung von 5 Minuten ist f\u00fcr uns inakzeptabel.<\/li>\n<li>Er muss so sicher und schrittweise wie m\u00f6glich sein. Wir m\u00f6chten irgendeine Kontrolle \u00fcber die Situation haben. Alles auf einmal zu kaputt machen und dann auf den R\u00fccksetzknopf zu bitten, das m\u00f6chten wir nicht.<\/li>\n<li>Minimale Datenverluste beim Umzug. Wir verstehen, dass es sehr schwierig sein wird, atomar umzuziehen, daher tolerieren wir eine gewisse Desynchronisation zwischen den Daten im normalen und im Cluster-Redis.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"obsluzhivanie-klastera\">Cluster-Wartung<\/h1>\n<p><\/p>\n<p>Vor dem Umzug sollten wir uns \u00fcberlegen, ob wir den Cluster unterst\u00fctzen k\u00f6nnen:<\/p>\n<p><\/p>\n<ul>\n<li>Grafiken. Wir verwenden Prometheus und Grafana f\u00fcr Grafiken zur Auslastung von Prozessoren, belegtem Speicher, Anzahl der Clients, Anzahl der GET-, SET-, AUTH-Operationen usw.<\/li>\n<li>Expertise. Stellen Sie sich vor, dass morgen ein riesiger Cluster in Ihrer Verantwortung liegt. Wenn dieser kaputt geht, kann ihn niemand au\u00dfer Ihnen reparieren. Wenn er anf\u00e4ngt zu stocken, werden alle zu Ihnen rennen. Wenn Ressourcen hinzugef\u00fcgt oder die Last umverteilt werden muss, kommen sie wieder zu Ihnen. Um mit 25 nicht grau zu werden, sollte man diese F\u00e4lle im Voraus ber\u00fccksichtigen und \u00fcberpr\u00fcfen, wie sich die Technologie bei verschiedenen Aktionen verh\u00e4lt. Dar\u00fcber werden wir im Abschnitt \"Expertise\" ausf\u00fchrlicher sprechen.<\/li>\n<li>\u00dcberwachungen und Benachrichtigungen. Wenn der Cluster ausf\u00e4llt, m\u00f6chten wir als Erster dar\u00fcber informiert werden. Hier haben wir uns auf die Benachrichtigung beschr\u00e4nkt, dass alle Knoten die gleichen Informationen \u00fcber den Zustand des Clusters zur\u00fcckgeben (ja, das kann auch anders sein). Und die anderen Probleme sind schneller \u00fcber die Benachrichtigungen der Redis-Clientdienste zu erkennen.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"pereezd\">Umzug<\/h1>\n<p><\/p>\n<p>Wie wir umziehen werden:<\/p>\n<p><\/p>\n<ul>\n<li>Zun\u00e4chst muss die Bibliothek zur Arbeit mit dem Cluster vorbereitet werden. Als Grundlage f\u00fcr die Go-Version haben wir go-redis genommen und etwas f\u00fcr unsere Bed\u00fcrfnisse angepasst. Wir haben Multi-Methoden \u00fcber Pipelines implementiert und die Regeln f\u00fcr die Wiederholung von Anfragen etwas \u00fcberarbeitet. Mit der PHP-Version gab es mehr Probleme, aber letztendlich haben wir uns f\u00fcr php-redis entschieden. K\u00fcrzlich haben sie die Unterst\u00fctzung f\u00fcr Cluster eingef\u00fchrt, und unserer Meinung nach sieht das gut aus.<\/li>\n<li>Als N\u00e4chstes muss das Cluster selbst bereitgestellt werden. Dies geschieht im Grunde genommen mit zwei Befehlen auf Basis der Konfigurationsdatei. Die Konfiguration werden wir weiter unten im Detail besprechen.<\/li>\n<li>F\u00fcr den schrittweisen Umstieg verwenden wir den Dry-Modus. Da wir zwei Versionen der Bibliothek mit identischer Schnittstelle haben (eine f\u00fcr die normale Version, eine andere f\u00fcr das Cluster), ist es kein Problem, eine Wrapper zu erstellen, die mit der separaten Version arbeitet und gleichzeitig alle Anfragen an das Cluster dupliziert, die Antworten vergleicht und Abweichungen in Logs schreibt (in unserem Fall in NewRelic). Auf diese Weise, selbst wenn die Cluster-Version bei der Einf\u00fchrung fehlschl\u00e4gt, wird unsere Produktion nicht betroffen sein. <\/li>\n<li>Nachdem das Cluster im Dry-Modus bereitgestellt wurde, k\u00f6nnen wir entspannt auf das Diagramm der Abweichungen der Antworten schauen. Wenn der Fehleranteil langsam, aber sicher auf eine gewisse kleine Konstante hinarbeitet, ist alles in Ordnung. Warum gibt es dennoch Abweichungen? Weil die Aufzeichnung in der separaten Version etwas fr\u00fcher erfolgt als im Cluster, und aufgrund der Mikrolaten k\u00f6nnen die Daten voneinander abweichen. Wir m\u00fcssen nur die Protokolle der Abweichungen \u00fcberpr\u00fcfen, und wenn alle erkl\u00e4rbar sind durch die Nicht-Atomarit\u00e4t der Aufzeichnung, k\u00f6nnen wir weitermachen.<\/li>\n<li>Jetzt k\u00f6nnen wir den Dry-Modus umschalten. Wir werden aus dem Cluster schreiben und lesen und in die separate Version duplizieren. Warum? In der n\u00e4chsten Woche m\u00f6chten wir die Arbeit des Clusters beobachten. Falls sich herausstellt, dass es bei hoher Last Probleme gibt oder wir etwas \u00fcbersehen haben, haben wir immer die M\u00f6glichkeit, auf den alten Code und die aktuellen Daten zur\u00fcckzugreifen, dank des Dry-Modus.<\/li>\n<li>Jetzt bleibt nur noch, den Dry-Modus abzuschalten und die separate Version abzubauen. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"ekspertiza\">Expertise<\/h1>\n<p><\/p>\n<p>Zuerst eine kurze Zusammenfassung der Struktur des Clusters.<\/p>\n<p><\/p>\n<p>Zuallererst ist Redis ein Key-Value-Speicher. Als Schl\u00fcssel werden beliebige Strings verwendet. Als Werte k\u00f6nnen Zahlen, Strings und komplexe Strukturen genutzt werden. Letztere gibt es in gro\u00dfer Zahl, aber f\u00fcr das Verst\u00e4ndnis der allgemeinen Struktur ist das nicht entscheidend.<br \/>\nDie n\u00e4chste Ebene der Abstraktion nach den Schl\u00fcsseln sind die Slots (SLOTS). Jeder Schl\u00fcssel geh\u00f6rt zu einem der 16.383 Slots. Innerhalb jedes Slots k\u00f6nnen beliebig viele Schl\u00fcssel vorhanden sein. Somit unterteilen sich alle Schl\u00fcssel in 16.383 nicht \u00fcberlappende Mengen.<br \/>\n<img decoding=\"async\" alt=\"\u00dcber den Umstieg von Redis auf Redis-Cluster\" src=\"\/wp-content\/uploads\/2020\/08\/a5e4be23381b42287f693e01d5d59a99.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Im Cluster m\u00fcssen N Master-Nodes vorhanden sein. Jede Node kann als separate Redis-Instanz betrachtet werden, die alles \u00fcber die anderen Nodes im Cluster wei\u00df. Jede Master-Node enth\u00e4lt eine bestimmte Anzahl von Slots. Jeder Slot geh\u00f6rt nur zu einer Master-Node. Alle Slots m\u00fcssen auf die Nodes verteilt werden. Wenn einige Slots nicht verteilt sind, sind die darin gespeicherten Schl\u00fcssel nicht verf\u00fcgbar. Jede Master-Node sollte sinnvollerweise auf einer separaten logischen oder physischen Maschine betrieben werden. Zudem ist zu beachten, dass jede Node nur auf einem Kern arbeitet. Wenn Sie mehrere Instanzen von Redis auf einer logischen Maschine betreiben m\u00f6chten, stellen Sie sicher, dass sie auf verschiedenen Kernen arbeiten (wir haben das nicht ausprobiert, aber theoretisch sollte alles funktionieren). Im Grunde genommen sorgen die Master-Nodes f\u00fcr gew\u00f6hnliches Sharding, und eine gr\u00f6\u00dfere Anzahl von Master-Nodes erm\u00f6glicht eine Skalierung der Lese- und Schreibanfragen.<\/p>\n<p><\/p>\n<p>Nachdem alle Schl\u00fcssel auf die Slots verteilt sind und die Slots auf die Master-Nodes verteilt sind, k\u00f6nnen zu jeder Master-Node beliebig viele Slave-Nodes hinzugef\u00fcgt werden. Innerhalb dieser \u201eMaster-Slave\u201c-Verbindung erfolgt eine gew\u00f6hnliche Replikation. Slaves sind notwendig, um die Leseanfragen zu skalieren und f\u00fcr das Failover im Falle eines Ausfalls des Masters.<br \/>\n<img decoding=\"async\" alt=\"\u00dcber den Umstieg von Redis auf Redis-Cluster\" src=\"\/wp-content\/uploads\/2020\/08\/90feb7ef9dacb858d5f21edc214df14d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lassen Sie uns nun \u00fcber die Operationen sprechen, die wir besser beherrschen sollten.<\/p>\n<p><\/p>\n<p>Wir werden auf das System \u00fcber die Redis-CLI zugreifen. Da Redis keinen einzelnen Einstiegspunkt hat, k\u00f6nnen die folgenden Operationen auf jeder der Nodes durchgef\u00fchrt werden. In jedem Punkt weise ich besonders auf die M\u00f6glichkeit hin, die Operation unter Last auszuf\u00fchren.<\/p>\n<p><\/p>\n<ul>\n<li>Das Erste und Wichtigste, was wir ben\u00f6tigen, ist die Operation cluster nodes. Sie gibt den Zustand des Clusters zur\u00fcck, zeigt die Liste der Nodes, ihre Rollen, die Verteilung der Slots usw. Weitere Informationen k\u00f6nnen mit cluster info und cluster slots abgerufen werden.<\/li>\n<li>Es w\u00e4re gut, in der Lage zu sein, Knoten hinzuzuf\u00fcgen und zu entfernen. Daf\u00fcr gibt es die Operationen cluster meet und cluster forget. Beachten Sie, dass cluster forget auf JEDEN Knoten angewendet werden muss, sowohl auf Master- als auch auf Replikatknoten. Umgekehrt reicht es, cluster meet nur auf einem Knoten zu starten. Diese Unterscheidung kann verwirrend sein, daher ist es besser, sich dar\u00fcber zu informieren, bevor Sie den Cluster in Betrieb nehmen. Das Hinzuf\u00fcgen eines Knotens erfolgt sicher im laufenden Betrieb und hat keinen Einfluss auf die Funktion des Clusters (was logisch ist). Wenn Sie jedoch einen Knoten aus dem Cluster entfernen m\u00f6chten, sollten Sie sicherstellen, dass auf ihm keine Slots mehr vorhanden sind (ansonsten riskieren Sie den Verlust des Zugriffs auf alle Schl\u00fcssel auf diesem Knoten). Entfernen Sie auch nicht den Master-Knoten, der Replikate hat, da sonst ein unn\u00f6tiges Abstimmen auf einen neuen Master stattfinden w\u00fcrde. Falls auf den Knoten bereits keine Slots mehr vorhanden sind, ist das ein kleines Problem, aber warum sollten wir uns zus\u00e4tzliche Entscheidungen aufb\u00fcrden, wenn wir zuerst die Replikate entfernen k\u00f6nnen.<\/li>\n<li>Wenn Sie Master und Slave zwangsl\u00e4ufig umkehren m\u00fcssen, ist der Befehl cluster failover geeignet. Wenn Sie diesen im laufenden Betrieb aufrufen, m\u00fcssen Sie sich bewusst sein, dass der Master w\u00e4hrend der Ausf\u00fchrung der Operation nicht verf\u00fcgbar sein wird. In der Regel erfolgt der Wechsel in weniger als einer Sekunde, jedoch nicht atomar. Sie k\u00f6nnen damit rechnen, dass einige Anfragen an den Master in dieser Zeit mit einem Fehler enden.<\/li>\n<li>Bevor Sie einen Knoten aus dem Cluster entfernen, sollten keine Slots mehr darauf verbleiben. Es ist besser, diese mit dem Befehl cluster reshard neu zu verteilen. Die Slots werden von einem Master auf einen anderen \u00fcbertragen. Der gesamte Vorgang kann mehrere Minuten in Anspruch nehmen, abh\u00e4ngig von der Menge der \u00fcbertragenen Daten; jedoch ist der \u00dcbertragungsprozess sicher und hat keine Auswirkungen auf die Funktionsweise des Clusters. Auf diese Weise k\u00f6nnen alle Daten unter Last von einem Knoten auf einen anderen \u00fcbertragen werden, ohne dass sie dadurch unzug\u00e4nglich werden. Es gibt jedoch einige Feinheiten zu beachten. Erstens ist der Datentransfer mit einer bestimmten Last auf dem empfangenden und sendenden Knoten verbunden. Wenn der empfangende Knoten bereits stark ausgelastet ist, sollte er nicht auch noch mit neuen Daten belastet werden. Zweitens, sobald auf dem sendenden Master kein Slot mehr vorhanden ist, werden alle zugeh\u00f6rigen Slaves sofort zu dem Master wechseln, auf den diese Slots \u00fcbertragen wurden. Das Problem hierbei ist, dass all diese Slaves gleichzeitig versuchen werden, die Daten zu synchronisieren. Und es w\u00e4re Ihnen noch geg\u00f6nnt, wenn es sich dabei um eine partielle und nicht um eine vollst\u00e4ndige Synchronisation handelt. Ber\u00fccksichtigen Sie dies und kombinieren Sie die Vorg\u00e4nge zur \u00dcbertragung von Slots und das Trennen\/\u00dcbertragen von Slaves. Oder hoffen Sie, dass Sie ausreichend Puffer haben.<\/li>\n<li>Was tun, wenn Sie beim \u00dcbertragen feststellen, dass Sie irgendwo Slots verloren haben? Ich hoffe, dieses Problem betrifft Sie nicht, aber falls doch, gibt es die Operation cluster fix. Diese verteilt die Slots mehr oder weniger zuf\u00e4llig auf die Knoten. Ich empfehle, die Funktionsweise vorher zu pr\u00fcfen, indem Sie einen Knoten mit verteilten Slots aus dem Cluster entfernen. Da die Daten in nicht verteilten Slots sowieso nicht verf\u00fcgbar sind, ist es zu sp\u00e4t, sich \u00fcber Probleme mit deren Verf\u00fcgbarkeit zu sorgen. Die Operation wird hingegen keine Auswirkungen auf die verteilten Slots haben.<\/li>\n<li>Eine weitere n\u00fctzliche Operation ist monitor. Sie erm\u00f6glicht es Ihnen, in Echtzeit die gesamte Liste der Anfragen zu sehen, die an den Knoten gerichtet werden. Dar\u00fcber hinaus k\u00f6nnen Sie damit einen grep durchf\u00fchren und herausfinden, ob der ben\u00f6tigte Datenverkehr vorhanden ist.<\/li>\n<\/ul>\n<p><\/p>\n<p>Es ist auch wichtig, das Verfahren zur Notfallumschaltung des Masters zu erw\u00e4hnen. Kurz gesagt, es existiert und funktioniert meiner Meinung nach hervorragend. Man sollte jedoch nicht denken, dass Redis sofort umschaltet und die Clients keinen Verlust bemerken, wenn das Kabel des Master-Nodes aus der Steckdose gezogen wird. In meiner Erfahrung dauert der Umschaltvorgang einige Sekunden. W\u00e4hrend dieser Zeit sind Teile der Daten nicht verf\u00fcgbar: Der Master wird als nicht erreichbar erkannt, die Nodes stimmen f\u00fcr einen neuen ab, die Slaves schalten um und die Daten werden synchronisiert. Der beste Weg, um selbst sicherzustellen, dass das Schema funktioniert, ist, lokale \u00dcbungen durchzuf\u00fchren. Erstellen Sie einen Cluster auf Ihrem Laptop, gew\u00e4hren Sie eine minimale Last, simulieren Sie einen Ausfall (zum Beispiel durch Blockieren der Ports) und bewerten Sie die Umschaltgeschwindigkeit. Meiner Ansicht nach kann man nur durch ein- oder zweit\u00e4giges Ausprobieren sicher sein, dass die Technologie funktioniert. Oder man hofft, dass die Software, die von der H\u00e4lfte des Internets genutzt wird, bestimmt funktioniert.<\/p>\n<p><\/p>\n<h1 id=\"konfiguraciya\">Konfiguration<\/h1>\n<p><\/p>\n<p>Oft ist die Konfiguration das Erste, was man ben\u00f6tigt, um mit dem Tool zu beginnen. Und wenn alles funktioniert, m\u00f6chte man die Konfiguration nicht mehr anfassen. Man braucht gewisse Anstrengungen, um sich zu motivieren, zu den Einstellungen zur\u00fcckzukehren und sie gr\u00fcndlich zu durchforsten. Soweit ich mich erinnere, hatten wir mindestens zwei ernsthafte Fehler wegen Unachtsamkeit bei der Konfiguration. Achten Sie besonders auf die folgenden Punkte:<\/p>\n<p><\/p>\n<ul>\n<li>timeout 0<br \/>\n<em>Die Zeit, nach der inaktive Verbindungen (in Sekunden) geschlossen werden. 0 \u2014 sie werden nicht geschlossen<\/em><br \/>\nNicht jede unserer Bibliotheken konnte Verbindungen korrekt schlie\u00dfen. Wenn diese Einstellung deaktiviert ist, laufen wir Gefahr, die Grenze f\u00fcr die Anzahl der Clients zu erreichen. Andererseits, wenn ein solches Problem besteht, dann wird der automatische Abbruch verlorener Verbindungen es maskieren, und wir k\u00f6nnten es nicht bemerken. Dar\u00fcber hinaus sollte diese Einstellung nicht aktiviert werden, wenn persistente Verbindungen verwendet werden.<\/li>\n<li>Save x y &amp; appendonly yes<br \/>\n<em>Speicherung eines RDB-Snapshots.<\/em><br \/>\nProbleme mit RDB\/AOF werden wir gleich ausf\u00fchrlich besprechen.<\/li>\n<li>stop-writes-on-bgsave-error no &amp; slave-serve-stale-data yes<br \/>\n<em>Wenn aktiviert, wird der Master bei einem Fehler beim Erstellen des RDB-Snapshots aufh\u00f6ren, \u00c4nderungsanfragen anzunehmen. Wenn die Verbindung zum Master verloren geht, kann der Slave weiterhin auf Anfragen antworten (ja). Oder aufh\u00f6ren zu antworten (nein)<\/em><br \/>\nWir sind mit einer Situation, in der Redis zu einer K\u00fcrbis wird, nicht zufrieden.<\/li>\n<li>repl-ping-slave-period 5<br \/>\n<em>Nach diesem Zeitraum beginnen wir uns Sorgen zu machen, dass der Master ausgefallen ist und es Zeit f\u00fcr die Failover-Prozedur w\u00e4re.<\/em><br \/>\nWir m\u00fcssen manuell das Gleichgewicht zwischen Fehlalarmen und der Aktivierung des Failovers finden. In unserer Praxis sind das 5 Sekunden.<\/li>\n<li>repl-backlog-size 1024mb &amp; epl-backlog-ttl 0<br \/>\n<em>So viele Daten k\u00f6nnen wir im Puffer f\u00fcr einen ausgefallenen Replikat speichern. Wenn der Puffer ersch\u00f6pft ist, m\u00fcssen wir eine vollst\u00e4ndige Synchronisation durchf\u00fchren.<\/em><br \/>\nDie Praxis zeigt, dass es besser ist, einen h\u00f6heren Wert festzulegen. Es gibt viele Gr\u00fcnde, warum das Replikat ins Hintertreffen geraten kann. Wenn dies der Fall ist, hat Ihr Master wahrscheinlich schon Schwierigkeiten, und eine vollst\u00e4ndige Synchronisation wird der letzte Tropfen sein.<\/li>\n<li>maxclients 10000<br \/>\n<em>Maximale Anzahl an gleichzeitigen Clients.<\/em><br \/>\nNach unserer Erfahrung ist es besser, einen h\u00f6heren Wert festzulegen. Redis bew\u00e4ltigt problemlos 10.000 Verbindungen. Stellen Sie nur sicher, dass im System gen\u00fcgend Sockets vorhanden sind. <\/li>\n<li>maxmemory-policy volatile-ttl<br \/>\n<em>Regel, nach der Schl\u00fcssel beim Erreichen des verf\u00fcgbaren Speicherkapazit\u00e4tslimits gel\u00f6scht werden.<\/em><br \/>\nHier ist nicht das Regelwerk wichtig, sondern das Verst\u00e4ndnis, wie dies geschehen wird. Redis kann f\u00fcr seine F\u00e4higkeit gelobt werden, auch bei Erreichen des Speicherkapazit\u00e4tslimits ordnungsgem\u00e4\u00df zu arbeiten. <\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"problemy-rdb-i-aof\">Probleme mit RDB und AOF<\/h1>\n<p><\/p>\n<p>Obwohl Redis alle Informationen im Arbeitsspeicher speichert, gibt es auch einen Mechanismus zum Speichern von Daten auf der Festplatte. Genauer gesagt, drei Mechanismen:<\/p>\n<p><\/p>\n<ul>\n<li>RDB-Snapshot \u2014 ein vollst\u00e4ndiges Abbild aller Daten. Dies wird mit der Konfiguration SAVE X Y festgelegt und liest sich als \"Vollst\u00e4ndigen Snapshot aller Daten alle X Sekunden speichern, wenn sich mindestens Y Schl\u00fcssel ge\u00e4ndert haben.\"<\/li>\n<li>Append-only file \u2014 eine Liste von Operationen in der Reihenfolge ihrer Ausf\u00fchrung. F\u00fcgt neue eingegangene Operationen alle X Sekunden oder alle Y Operationen in die Datei hinzu.<\/li>\n<li>RDB und AOF \u2014 eine Kombination der beiden vorherigen.<\/li>\n<\/ul>\n<p><\/p>\n<p>Alle Methoden haben ihre Vor- und Nachteile, ich werde sie nicht alle auflisten, sondern lediglich auf die, meiner Meinung nach, weniger offensichtlichen Punkte hinweisen.<\/p>\n<p><\/p>\n<p>Erstens erfordert das Speichern eines RDB-Snapshots das Aufrufen von FORK. Bei einer gro\u00dfen Datenmenge kann dies Redis f\u00fcr einen Zeitraum von mehreren Millisekunden bis zu einer Sekunde blockieren. Au\u00dferdem ben\u00f6tigt das System zus\u00e4tzlichen Speicher f\u00fcr einen solchen Snapshot, was dazu f\u00fchrt, dass auf der logischen Maschine eine doppelte Menge an Arbeitsspeicher erforderlich sein sollte: Wenn Redis 8 GB zugewiesen ist, sollten auf der virtuellen Maschine 16 GB verf\u00fcgbar sein.<\/p>\n<p><\/p>\n<p>Zweitens gibt es Probleme mit der partielle Synchronisation. Im AOF-Modus kann beim Wiederverbinden des Slaves anstelle einer partielle Synchronisation eine vollst\u00e4ndige erfolgen. Warum das so ist, konnte ich nicht verstehen. Aber man sollte daran denken.<\/p>\n<p><\/p>\n<p>Diese beiden Punkte f\u00fchren bereits dazu, dar\u00fcber nachzudenken, ob wir diese Daten auf der Festplatte wirklich ben\u00f6tigen, wenn sie ohnehin von den Slaves dupliziert werden. Daten k\u00f6nnen nur verloren gehen, wenn alle Slaves ausfallen, und das ist ein Problem auf der Ebene \"Brand im Rechenzentrum\". Als Kompromiss k\u00f6nnte man vorschlagen, die Daten nur auf den Slaves zu speichern, aber in diesem Fall sollte man sicherstellen, dass diese Slaves niemals beim Notfall-Wiederherstellung zum Master werden (daf\u00fcr gibt es eine Einstellung zur Priorit\u00e4t der Slaves in ihrer Konfiguration). In jedem einzelnen Fall \u00fcberlegen wir f\u00fcr uns, ob es notwendig ist, die Daten auf der Festplatte zu speichern, und antworten meist mit \u201enein\u201c.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Fazit<\/h1>\n<p><\/p>\n<p>Abschlie\u00dfend hoffe ich, dass ich einen allgemeinen \u00dcberblick \u00fcber die Funktionsweise von redis-cluster gegeben habe f\u00fcr diejenigen, die \u00fcberhaupt noch nichts davon geh\u00f6rt haben, und auch auf einige nicht offensichtliche Punkte f\u00fcr diejenigen hingewiesen habe, die es schon lange benutzen.<br \/>\nDanke f\u00fcr Ihre Zeit und wie gewohnt sind Kommentare zum Thema willkommen.<\/p>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/citymobil\/blog\/515620\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u044f\u0442\u043a\u0430 \u043b\u0435\u0442, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0432 \u043d\u0435\u043c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u041d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432 10 \u0440\u0430\u0437 \u0432\u044b\u0448\u0435, \u0430 \u0446\u0435\u043d\u0430 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0442\u043d\u0438 \u0440\u0430\u0437? \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043a\u0440\u0443\u0442\u043e\u0439 Highload Engineer. \u041d\u043e \u0437\u0430 \u043d\u0435\u0438\u043c\u0435\u043d\u0438\u0435\u043c \u0433\u043e\u0440\u043d\u0438\u0447\u043d\u043e\u0439 \u0442\u0430\u043a\u043e\u0432\u043e\u0433\u043e, \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u043c\u043d\u0435. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91847,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0435 \u0441 Redis \u043d\u0430 Redis-cluster | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-19T17:41:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-19T17:41:57+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00dcber den Umstieg von Redis auf Redis-cluster | ProHoster","description":"In ein Produkt eintreten, das sich weiterentwickelt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u0435 \u0441 Redis \u043d\u0430 Redis-cluster | ProHoster","og:description":"\u041f\u0440\u0438\u0445\u043e\u0434\u044f \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/o-pereezde-s-redis-na-redis-cluster","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-19T17:41:57+00:00","article:modified_time":"2020-08-19T17:41:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91846","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:19:41","updated":"2022-10-03 14:54:15","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/91846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=91846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/91846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/91847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=91846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=91846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=91846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}