Heim  >  Artikel  >  Datenbank  >  Erfahren Sie mehr über Codis in Redis

Erfahren Sie mehr über Codis in Redis

青灯夜游
青灯夜游nach vorne
2022-01-06 09:54:122927Durchsuche

Dieser Artikel wird Ihnen helfen, Codis in Redis zu verstehen und die Prinzipien von Codis vorzustellen. Ich hoffe, er wird Ihnen hilfreich sein!

Erfahren Sie mehr über Codis in Redis

Szenario

In einem Big-Data-Szenario mit hoher Parallelität wird die Verwendung einer einzelnen Redis-Instanz unabhängig von der Leistung von Redis sehr schwierig.

Erstens: Je größer die Datenmenge, desto schwieriger wird es. Je mehr Speicher Redis belegt, desto größer wird die Zeit für die vollständige Master-Slave-Synchronisierung. Gleichzeitig wird eine zu große RDB geladen wird auch die Startzeit verlängern. [Verwandte Empfehlungen: Redis-Video-Tutorial]

Zweitens kann eine einzelne Instanz von Redis in Bezug auf die CPU-Auslastung nur einen CPU-Kern verwenden. Wenn ein Kern zu viele Daten hat, ist er überlastet, sodass ein Cluster erforderlich ist . Die Lösung verteilt die riesigen Datenmengen von einer Instanz auf mehrere Instanzen, bis hin zur offiziellen Unterstützung ihrer eigenen Cluster-Lösung, auch Dritte entwickeln ihre eigenen Komponenten zur Unterstützung von Clustern,

Codis wird mit der Go-Sprache entwickelt und fungiert als Proxy zwischen Redis und dem Client. Es verwendet das Redis-Protokoll, sodass der Client eine direkte Verbindung zu Codis herstellen und Anweisungen an ihn senden kann Schließlich werden die zurückgegebenen Ergebnisse empfangen und an den Client zurückgegeben. Auf der Clientseite bildet die durch

Erfahren Sie mehr über Codis in Redis dargestellte Redis-Cluster einen Redis-Cluster, der dynamisch erweitert werden kann und weiterhin Redis hinzufügt Gleichzeitig muss das vom Client verwendete SDK nicht geändert werden.

Codis selbst kann auch einen Cluster verwenden, um seine hohe Verfügbarkeit sicherzustellen Es ist nur für die Weiterleitung von Inhalten verantwortlich. Es kann auch die Verbesserung von QPS gewährleisten.

Erfahren Sie mehr über Codis in RedisPrinzip

Codis leitet einen bestimmten Schlüssel an eine bestimmte Redis-Instanz weiter, wodurch der Druck auf andere Instanzen verringert wird zu einer vollständigen Information.

Codis ist standardmäßig in 1024 Slots unterteilt, die einem Teil der Slots und Redis-Instanzen im Speicher entsprechen. Bei vielen Clusterknoten kann die Anzahl erhöht werden.

Beim Empfang des vom Client gesendeten Schlüssels führt Codis eine CRC32-Operation für den Schlüssel aus, um einen Hash-Wert zu erhalten Steckplatz, in dem der Schlüssel gespeichert wird. Mit dem Steckplatz können Sie herausfinden, an welche Redis-Instanz der Schlüssel gesendet werden soll.

Erfahren Sie mehr über Codis in RedisPseudocode:

hash = crc32(command.key) # 计算hash值
slot = hash % 1024 # 取模得到槽位
redisInstance = slots[slot].redis # 得到redis实例
redis.do(command) # 执行命令复制代码

Cluster-Slot-Synchronisation

Die Zuordnungsbeziehung zwischen Redis und Slots ist im Speicher von Codis vorhanden, daher muss der Codis-Cluster berücksichtigen, dass die Slot-Zuordnungsbeziehung in jedem Knoten synchronisiert ist, so Codis Zookeeper und die verteilte Konfigurationsspeicher-Middleware Etcd werden verwendet, um Slot-Mapping-Beziehungen beizubehalten, um die Datensynchronisierung zwischen Codis-Clustern sicherzustellen. Wie unten gezeigt, speichert Codis Slot-Beziehungen in Zookeeper und stellt ein Dashboard zum Beobachten und Ändern von Slots bereit, wenn sich die Bit-Beziehung ändert erkennt die Änderung und synchronisiert die Slot-Beziehung neu.

Kapazitätserweiterung

Erfahren Sie mehr über Codis in RedisWenn der vorhandene Cluster die Geschäftsanforderungen nicht erfüllt, müssen dem Cluster neue Instanzen hinzugefügt werden. Zu diesem Zeitpunkt muss die Slot-Mapping-Beziehung neu verteilt werden und a Ein Teil davon muss neuen Knoten zugewiesen werden.

Codis hat einen neuen SLOTSSCAN-Befehl hinzugefügt, der alle Schlüssel unter einem bestimmten Steckplatz durchlaufen kann. Verwenden Sie diesen Befehl, um alle Schlüssel im zu migrierenden Steckplatz zu scannen und dann jeden Schlüssel einzeln zu durchlaufen, um zum neuen Knoten zu migrieren. Während des Migrationsprozesses stellt Codis weiterhin Dienste für die Außenwelt bereit. Zu diesem Zeitpunkt kommt eine Anfrage an den Slot, der migriert wird. Da der Slot nun dem alten und dem neuen Knoten entspricht, kann Codis nicht feststellen, ob der Schlüssel vorhanden ist wurde vom alten Knoten auf den neuen Knoten migriert. In diesem Fall erzwingt Codis also sofort eine einzelne Migration des aktuellen Schlüssels. Nach Abschluss der Migration wird die Anfrage an die neue Redis-Instanz weitergeleitet .

Pseudocode:

slot_index = crc32(command.key) % 1024
if slot_index in migrating_slots:
    doMigratingKey(command.key)
    redis = slots[slot_index].new_redis
else:
    redis = slots[slot_index].redis复制代码

SLOTSSCAN kann wie der Redis-eigene Scan-Befehl die Duplizierung gescannter Daten nicht vermeiden. Dies hat jedoch keinen Einfluss auf die Richtigkeit der Migration, da ein einzelner Schlüssel nach der Migration sofort aus der alten Instanz gelöscht wird. Dies ist nicht möglich nicht mehr ausgescannt werden.

Automatische Balancing-Slots

Jedes Mal, wenn eine neue Instanz hinzugefügt wird, wäre es zu mühsam, die Slot-Zuordnungsbeziehung manuell zu pflegen. Diese Funktion überwacht die Anzahl der Slots, die jeder Redis-Instanz entsprechen, wenn dies der Fall ist Wenn es unausgeglichen ist, wird der Vorgang automatisch ausgeglichen und die Daten werden migriert.

Nachteile

Codis bringt Erweiterungsvorteile für Redis, verursacht aber auch einige Nebenwirkungen.

Unterstützt keine Transaktionen

Eine Transaktion kann mit mehreren Schlüsseln ausgeführt werden, die Transaktion kann jedoch nur in einer einzigen Instanz abgeschlossen werden. Da die Schlüssel jedoch auf verschiedene Instanzen verteilt sind, kann Codis keine Transaktionsvorgänge unterstützen.

unterstützt kein Umbenennen

Umbenennen benennt einen Schlüssel in einen anderen Schlüssel, aber die beiden Schlüssel werden möglicherweise nicht in denselben Steckplatz gehasht, sondern in die Steckplätze verschiedener Instanzen, daher wird die Umbenennung nicht unterstützt.

Offiziell bereitgestellte Liste nicht unterstützter Befehle: https://github.com/CodisLabs/codis/blob/master/doc/unsupported_cmds.md

Erweiterungsverzögerung

Codis ändert Daten während des Erweiterungsprozesses. Bei der Migration handelt es sich um eine direkte Migration B. eine Hash-Struktur, ruft Codis den gesamten Inhalt direkt von hgetall ab und fügt ihn mit hmset in den neuen Knoten ein.

Wenn der Inhalt des Hashs zu groß ist, führt dies zu Verzögerungen. Dies wird offiziell empfohlen Stellen Sie sicher, dass die Gesamtgröße einer einzelnen Sammlungsstruktur 1 MB nicht überschreitet. Aus geschäftlicher Sicht können große Datenmengen durch Bucket-Speicherung in mehrere kleine aufgeteilt werden, um einen Kompromiss einzugehen.

Netzwerk-Overhead

Da Codis als Netzwerk-Proxy zwischen dem Client und der Redis-Instanz fungiert, gibt es eine zusätzliche Schicht, und der Netzwerk-Overhead ist natürlich höher und die Leistung ist etwas geringer als bei einer direkten Verbindung zu Redis.

Middleware-Betriebs- und Wartungsaufwand

Die Konfiguration des Codis-Clusters erfordert die Verwendung von Zk oder Etcd, was bedeutet, dass die Einführung des Codis-Clusters die Einführung anderer Middleware erfordert, was die Kosten für den Betrieb und die Wartung der Maschinenressourcen erhöht.

Vorteile

Codis übergibt das Problem der verteilten Konsistenz an einen Dritten (ZK oder Etcd), wodurch die Wartungsarbeiten in diesem Bereich entfallen und die Komplexität des Implementierungscodes verringert wird,

Redis offiziell Um dies zu erreichen Durch die Dezentralisierung führte Cluster Raft- und Gossip-Protokolle sowie eine große Anzahl von Konfigurationsparametern ein, die angepasst werden mussten, und die Komplexität nahm stark zu.

Batch-Erfassung

Für Batch-Vorgänge, z. B. die Verwendung von mget, um die Werte mehrerer Schlüssel zu erhalten, können diese Schlüssel entsprechend der Instanz, in der sie sich befinden, verstreut sein Lokalisiert und verarbeitet dann jede Instanz einzeln. Rufen Sie mget auf und geben Sie die Zusammenfassung schließlich an den Client zurück.

Erfahren Sie mehr über Codis in Redis

Andere Funktionen

Codis bietet eine Dashboard-Schnittstelle und Codis-fe zum Verwalten des Clusters. Sie können auch Gruppen und Knoten hinzufügen, einen automatischen Ausgleich und andere Vorgänge durchführen sowie den Slot-Status und die entsprechenden Redis anzeigen Durch diese Funktionen wird die Bedienung und Wartung komfortabler und einfacher.

Erfahren Sie mehr über Codis in Redis

Erfahren Sie mehr über Codis in Redis

Erfahren Sie mehr über Codis in Redis

Erfahren Sie mehr über Codis in Redis

Zur Geschichte gehen

Codis schien das Konzept des Clusterings offiziell nicht bereitzustellen. und der offizielle Support ist natürlich besser als der von Drittanbietern.

Gleichzeitig muss die Software von Drittanbietern auch auf die neuen Funktionen achten, die vom Beamten in Echtzeit veröffentlicht werden, und Cluster ist definitiv damit kompatibel Neue Funktionen werden in Echtzeit bereitgestellt. Daher wird empfohlen, den offiziellen Cluster Codis zu verwenden. Es handelt sich um einen Wissenspunkt, der in der Vergangenheit gelernt wurde. Einige Ideen überschneiden sich mit Cluster.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Einführung in die Programmierung! !

Das obige ist der detaillierte Inhalt vonErfahren Sie mehr über Codis in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen