Cet article compile et partage avec vous quelques questions d'entretien Redis à haute fréquence et vous présente les principaux points de connaissance de Redis, impliquant la structure des données, le modèle de mémoire, le modèle IO, le RDB persistant, etc. J'espère qu'il vous sera utile !
Beaucoup de gens savent seulement qu'il s'agit d'une base de données en mémoire K/V NoSQl, d'un seul thread... C'est parce qu'ils ne comprennent pas complètement Redis et ne peuvent pas continuer à poser plus de questions.
Cette question est une compréhension de base. Nous pouvons l'implémenter à partir des structures de données sous-jacentes de différents types de données dans Redis, entièrement basées sur la mémoire, le modèle de réseau de multiplexage IO, le modèle de thread, le rehash progressif...
Nous pouvons d'abord parler de sa rapidité. Selon les données officielles, le QPS de Redis peut atteindre environ 100 000 (requêtes par seconde). Ceux qui sont intéressés peuvent se référer au programme de référence officiel « Quelle est la vitesse de Redis ? 》, adresse : redis.io/topics/benc…
L'axe horizontal est le nombre de connexions, et l'axe vertical est le QPS.
Cette image reflète un ordre de grandeur. Grâce à la quantification, elle donne à l'intervieweur le sentiment que vous avez lu les documents officiels et que vous êtes très rigoureux.
Redis est une base de données basée sur la mémoire Par rapport aux bases de données sur disque, elle bat complètement la vitesse des disques.
Les opérations de lecture et d’écriture sont effectuées sur la mémoire, comparons respectivement les différences entre les opérations sur la mémoire et les opérations sur le disque.
Appel de disque
Fonctionnement de la mémoire
La mémoire est directement contrôlée par le CPU, qui est le contrôleur de mémoire intégré à l'intérieur du CPU, de sorte que la mémoire est directement connectée au CPU et bénéficie de la bande passante optimale pour la communication avec le CPU.
Enfin, une image est utilisée pour quantifier les différents retards du système (une partie des données est citée par Brendan Gregg)
Quand j'apprenais MySQL, je savais que les données B+ Tree La structure a été utilisée afin d'améliorer la vitesse de récupération. La vitesse de Redis doit donc également être liée à la structure des données.
Redis a un total de 5 types de données, String、List、Hash、Set、SortedSet
.
Différents types de données sont pris en charge par une ou plusieurs structures de données en bas, afin d'atteindre une vitesse plus rapide.
Message de frère Ma : Nous pouvons expliquer séparément les avantages de la structure de données sous-jacente de chaque type de données. De nombreuses personnes ne connaissent que le type de données, et indiquer la structure de données sous-jacente peut faire briller les yeux des gens.
Dans SDS, len enregistre la longueur de cette chaîne et la complexité temporelle O(1) est utilisée pour interroger les informations sur la longueur de la chaîne.
Pré-allocation d'espace : une fois le SDS modifié, le programme allouera non seulement l'espace nécessaire requis pour le SDS, mais allouera également de l'espace supplémentaire inutilisé.
Libération d'espace paresseuse : lors du raccourcissement du SDS, le programme ne récupérera pas l'espace mémoire excédentaire, mais utilisera le champ libre pour enregistrer le nombre d'octets et ne les libérera pas si une opération d'ajout est nécessaire ultérieurement. utilisez-le directement. L’espace libre inutilisé réduit l’allocation de mémoire.
Compressed List est l'une des implémentations sous-jacentes des trois types de données List, hash et Sorted Set.
Lorsqu'une liste ne contient qu'une petite quantité de données et que chaque élément de la liste est soit une petite valeur entière, soit une chaîne relativement courte, Redis utilisera une liste compressée comme implémentation sous-jacente de la clé de liste.
De cette façon, la mémoire est compacte et économise de la mémoire.
Les versions ultérieures ont transformé la structure des données de la liste, en utilisant quicklist au lieu de ziplist et linkedlist.
quicklist est un mélange de liste zip et de liste liée. Il divise la liste liée en segments. Chaque segment utilise une liste zip pour un stockage compact, et plusieurs listes zip sont connectées entre elles à l'aide de pointeurs bidirectionnels.
La fonction de tri du type d'ensemble trié est implémentée via la structure de données "skip list".
La liste de sauts est une structure de données ordonnée qui maintient plusieurs pointeurs vers d'autres nœuds dans chaque nœud pour atteindre l'objectif d'accéder rapidement aux nœuds.
La liste de saut ajoute des index multi-niveaux sur la base de la liste chaînée. Grâce à plusieurs sauts dans la position de l'index, les données peuvent être rapidement positionnées, comme le montre la figure ci-dessous :
Lorsqu'un ensemble ne contient que des éléments de valeur entière et que le nombre d'éléments dans cet ensemble n'est pas grand, Redis utilisera un ensemble entier comme implémentation sous-jacente de la clé d'ensemble pour économiser de la mémoire.
Message de frère Ma : Nous devons noter que le monothread de Redis fait référence à l'IO réseau de Redis (l'IO réseau utilise le multi-threading après la version 6.x) et à la valeur-clé La lecture et l'écriture des instructions de paire sont exécutées par un thread. La persistance Redis, la synchronisation des données du cluster, la suppression asynchrone, etc. sont toutes exécutées par d'autres threads.
Ne dites jamais que Redis n'a qu'un seul thread.
Le thread unique fait référence à l'exécution d'instructions de lecture et d'écriture de paires clé-valeur Redis dans un seul thread.
Parlons d'abord de la réponse officielle, qui donne aux gens le sentiment d'être suffisamment rigoureux, au lieu de simplement réciter certains blogs en fonction de ce que disent les autres.
Réponse officielle : Étant donné que Redis est une opération basée sur la mémoire, le processeur n'est pas le goulot d'étranglement de Redis. Le goulot d'étranglement de Redis est probablement la taille de la mémoire de la machine ou la bande passante du réseau. Étant donné que le monothreading est facile à mettre en œuvre et que le processeur ne deviendra pas un goulot d'étranglement, il est logique d'adopter une solution monothread. Adresse d'origine : redis.io/topics/faq.
Pourquoi ne pas utiliser l'exécution multithread pour utiliser pleinement le CPU ?Avant d'exécuter chaque tâche, le processeur doit savoir où la tâche est chargée et commencée à s'exécuter. Autrement dit, le système a besoin d'aide pour configurer au préalable les registres du processeur et le compteur de programme, ce que l'on appelle le contexte du processeur.
Lors d'un changement de contexte, nous devons effectuer une série de travaux, ce qui est une opération très gourmande en ressources.
L'introduction du développement multithread nécessite l'utilisation de primitives de synchronisation pour protéger la lecture et l'écriture simultanées des ressources partagées, augmentant ainsi la complexité du code et la difficulté de débogage.Quels sont les avantages du fil unique ?
typedef struct redisObject{ //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层数据结构的指针 void *ptr; //... }robj;
hachage en chaîne : c'est-à-dire que les éléments du même compartiment sont enregistrés à l'aide d'une liste chaînée. Cependant, lorsque la liste chaînée est trop longue, les performances de recherche peuvent se détériorer. Par conséquent, afin de rechercher la vitesse, Redis utilise deux tables de hachage globales. Utilisé pour les opérations de rehachage afin d'augmenter le nombre de compartiments de hachage existants et de réduire les conflits de hachage.
Commencez à utiliser la « table de hachage 1 » pour enregistrer les données de la paire clé-valeur par défaut, et la « table de hachage 2 » n'a pas d'espace alloué pour le moment. Lorsque de plus en plus de données déclenchent l'opération de rehachage, les opérations suivantes sont effectuées :Il convient de noter que le processus de remappage des données de la table de hachage 1 vers la table de hachage 2 n'est pas un processus ponctuel. Cela entraînera le blocage de Redis et l'incapacité de fournir des services.
Au lieu de cela, rehash progressif est utilisé. Chaque fois qu'une demande client est traitée, elle commence à partir du premier index de la "table de hachage 1" et copie toutes les données à cet emplacement dans la "table de hachage 2", se dispersant ainsi. la répétition en plusieurs requêtes pour éviter un blocage fastidieux.
Redis utilise la méthode « instantané de données RDB » pour obtenir une récupération rapide après un temps d'arrêt. Cependant, l'exécution trop fréquente d'instantanés de données complètes entraîne deux graves problèmes de performances :
Redis a donc également conçu le journal de post-écriture AOF pour enregistrer les instructions de modification de la mémoire.
Intervieweur : Qu'est-ce qu'un instantané de mémoire RDB ?
Pendant que Redis exécute la commande "write", les données de la mémoire continueront de changer. Ce que l'on appelle l'instantané de mémoire fait référence aux données d'état des données dans la mémoire Redis à un moment donné.
C'est comme si le temps était figé à un certain moment. Lorsque nous prenons des photos, nous pouvons enregistrer complètement le moment à un certain moment grâce aux photos.
Redis est similaire à ceci, il capture les données à un certain moment sous la forme d'un fichier et les écrit sur le disque. Ce fichier d'instantané est appelé RDB file RDB est l'abréviation de Redis DataBase.
Lors de la récupération de données, lisez le fichier RDB directement dans la mémoire pour terminer la récupération.
Interviewer : Lors de la génération de RDB, Redis peut-il gérer les requêtes d'écriture en même temps ?
Oui, Redis utilise la technologie de copie sur écriture multi-processus du système d'exploitation COW (Copy On Write) pour obtenir la persistance des instantanés et garantir la cohérence des données.
Redis appellera la fonction glibc fork
pour générer un processus enfant pendant la persistance. La persistance de l'instantané est entièrement gérée par le processus enfant et le processus parent continue de traiter les demandes des clients. fork
产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。
当主线程执行写指令修改数据的时候,这个数据就会复制一份副本, bgsave
子进程读取这个副本数据写到 RDB 文件。
这既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响。
面试官:那 AOF 又是什么?
AOF 日志记录了自 Redis 实例创建以来所有的修改性指令序列,那么就可以通过对一个空的 Redis 实例顺序执行所有的指令,也就是「重放」,来恢复 Redis 当前实例的内存数据结构的状态。
Redis 提供的 AOF 配置项appendfsync
写回策略直接决定 AOF 持久化功能的效率和安全性。
aof_buf
缓冲区中的内容刷写到 AOF 文件。没有两全其美的策略,我们需要在性能和可靠性上做一个取舍。
面试官:既然 RDB 有两个性能问题,那为何不用 AOF 即可。
AOF 写前日志,记录的是每个「写」指令操作。不会像 RDB 全量快照导致性能损耗,但是执行速度没有 RDB 快,同时日志文件过大也会造成性能问题。
所以,Redis 设计了一个杀手锏「AOF 重写机制」,Redis 提供了 bgrewriteaof
bgsave
lira les données de copie et les écrira dans le fichier RDB. Cela garantit non seulement l'intégrité de l'instantané, mais permet également au thread principal de modifier les données en même temps, évitant ainsi tout impact sur les activités normales.
Intervieweur : Alors, qu’est-ce que l’AOF ?
🎜🎜Le journal AOF enregistre toutes les séquences d'instructions modifiées depuis la création de l'instance Redis. Vous pouvez ensuite restaurer les données mémoire de l'instance Redis actuelle en exécutant toutes les instructions séquentiellement sur une instance Redis vide, c'est-à-dire "replay". L'état de la structure. 🎜🎜La stratégie de réécriture de l'élément de configuration AOFappendfsync
fournie par Redis détermine directement l'efficacité et la sécurité de la fonction de persistance AOF. 🎜🎜🎜always🎜 : Réécriture synchrone, le contenu du tampon
🎜Il n'y a pas de stratégie du meilleur des deux mondes, nous devons faire un compromis entre performances et fiabilité. 🎜🎜🎜Interviewer : Puisque RDB a deux problèmes de performances, pourquoi ne pas utiliser AOF. 🎜🎜🎜Le journal de pré-écriture AOF enregistre chaque opération de commande "écriture". Cela n'entraînera pas de perte de performances comme l'instantané complet RDB, mais la vitesse d'exécution n'est pas aussi rapide que RDB. Dans le même temps, des fichiers journaux trop volumineux entraîneront également des problèmes de performances. 🎜🎜Ainsi, Redis a conçu un "mécanisme de réécriture AOF". Redis fournit la commandeaof_buf
sera vidé dans le fichier AOF immédiatement après l'exécution de la commande d'écriture. 🎜🎜🎜everysec🎜 : réécrivez chaque seconde. Une fois la commande d'écriture exécutée, le journal sera uniquement écrit dans le tampon du fichier AOF et le contenu du tampon sera synchronisé avec le disque toutes les secondes. 🎜🎜🎜non : 🎜 Contrôlé par le système d'exploitation, une fois l'exécution de l'écriture terminée, le journal est écrit dans la mémoire tampon du fichier AOF et le système d'exploitation décide quand le vider sur le disque. 🎜bgrewriteaof
pour affiner le journal AOF. 🎜🎜Le principe est d'ouvrir un sous-processus pour parcourir la mémoire et de la convertir en une série d'instructions d'opération Redis, qui sont sérialisées dans un nouveau fichier journal AOF. Une fois la sérialisation terminée, le journal AOF incrémentiel généré pendant l'opération est ajouté au nouveau fichier journal AOF. Une fois l'ajout terminé, l'ancien fichier journal AOF est immédiatement remplacé et le travail d'amincissement est terminé. 🎜🎜🎜🎜🎜🎜Intervieweur : Comment obtenir le moins de perte de données possible tout en tenant compte des performances ? 🎜
Lors du redémarrage de Redis, nous utilisons rarement rdb pour restaurer l'état de la mémoire car une grande quantité de données sera perdue. Nous utilisons généralement la relecture des journaux AOF, mais les performances de la relecture des journaux AOF sont beaucoup plus lentes que celles de RDB, donc lorsque l'instance Redis est volumineuse, le démarrage prend beaucoup de temps.
Redis 4.0 Afin de résoudre ce problème, il apporte une nouvelle option de persistance - Persistance hybride. Stockez le contenu du fichier rdb avec le fichier journal AOF incrémentiel. Le journal AOF ici n'est plus le journal complet, mais le journal AOF incrémentiel qui se produit pendant la période allant du début de la persistance à la fin de la persistance. Habituellement, cette partie du journal AOF est très petite. Donc
lorsque Redis redémarre, vous pouvez d'abord charger le contenu rdb, puis relire le journal AOF incrémentiel, qui peut remplacer complètement la relecture complète du fichier AOF précédente, et l'efficacité du redémarrage est grandement améliorée. Synchronisation des données de l'architecture maître-esclave Redis
Afin d'assurer la cohérence des données des réplicas, l'architecture maître-esclave adopte une méthode de séparation lecture-écriture.Opération de lecture : les bibliothèques maître et esclave peuvent être exécutées ;
Récupération après panne : lorsque le nœud maître est en panne, d'autres nœuds peuvent toujours fournir des services ;
La synchronisation est divisée en trois situations :Réplication complète de la base de données maître-esclave pour la première fois ; Synchronisation pendant le fonctionnement normal de la base de données maître-esclave ;
Le premier processus de copie de la bibliothèque maître-esclave peut être grossièrement divisé en 3 étapes : l'étape d'établissement de la connexion (c'est-à-dire l'étape de préparation), l'étape de synchronisation des données de la bibliothèque maître vers la bibliothèque esclave et l'étape d'envoyer de nouvelles commandes d'écriture lors de la synchronisation à la bibliothèque esclave
;
Établir une connexion : La bibliothèque esclave établira une connexion avec la bibliothèque maître. bibliothèque que la synchronisation est sur le point d'avoir lieu. Une fois que la bibliothèque maître a confirmé la réponse, la synchronisation entre les bibliothèques maître et esclave commence
.bgsave
pour générer un fichier RDB et envoie le fichier à la bibliothèque esclave. En même temps, la bibliothèque principales'ouvre. un tampon de réplication pour chaque esclave pour enregistrer l'esclave. La construction du fichier RDB commence avec toutes les commandes d'écriture reçues. Enregistrez le RDB de la bibliothèque, effacez la base de données, puis chargez les données RDB en mémoire. bgsave
命令生成 RDB 文件,并将文件发送给从库,同时主库为每一个 slave 开辟一块 replication buffer 缓冲区记录从生成 RDB 文件开始收到的所有写命令。从库保存 RDB 并清空数据库再加载 RDB 数据到内存中。面试官:主从库间的网络断了咋办?断开后要重新全量复制么?
在 Redis 2.8 之前,如果主从库在命令传播时出现了网络闪断,那么,从库就会和主库重新进行一次全量复制,开销非常大。
从 Redis 2.8 开始,网络断了之后,主从库会采用增量复制的方式继续同步。
增量复制:用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。
断开重连增量复制的实现奥秘就是 repl_backlog_buffer
缓冲区,不管在什么时候 master 都会将写指令操作记录在 repl_backlog_buffer
中,因为内存有限, repl_backlog_buffer
是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容。
master 使用 master_repl_offset
记录自己写到的位置偏移量,slave 则使用 slave_repl_offset
记录已经读取到的偏移量。
当主从断开重连后,slave 会先发送 psync 命令给 master,同时将自己的 runID
,slave_repl_offset
发送给 master。
master 只需要把 master_repl_offset
与 slave_repl_offset
repl_backlog_buffer
. Peu importe le moment, le maître enregistrera l'opération d'instruction d'écriture dans repl_backlog_buffer
, car la mémoire est limitée. repl_backlog_buffer
est un tableau circulaire de longueur fixe 🎜Si le contenu du tableau est plein, le contenu précédent sera écrasé depuis le début🎜. 🎜🎜Le maître utilise master_repl_offset
pour enregistrer le décalage de position qu'il écrit, et l'esclave utilise slave_repl_offset
pour enregistrer le décalage qu'il a lu. 🎜🎜🎜🎜Soyez le maître Après s'être déconnecté et reconnecté, l'esclave enverra d'abord la commande psync au maître, et enverra en même temps son runID
et son slave_repl_offset
au maître. 🎜🎜Master n'a besoin que de synchroniser les commandes entre master_repl_offset
et slave_repl_offset
avec la bibliothèque esclave. 🎜Le processus d'exécution de la copie incrémentielle est le suivant :
Intervieweur : Après avoir terminé la synchronisation complète, comment synchroniser les données pendant le fonctionnement normal ?
Lorsque la bibliothèque maître-esclave termine la réplication complète, une connexion réseau sera maintenue entre elles. La bibliothèque maître utilisera cette connexion pour synchroniser les opérations de commande suivantes reçues successivement avec la bibliothèque esclave. Ce processus est également appelé en fonction de connexions longues. . Propagation des commandes, le but de l'utilisation de connexions longues est d'éviter la surcharge causée par l'établissement fréquent de connexions.
Intervieweur : Bien sûr, j'en sais tellement, connaissez-vous le principe du cluster Sentinel ?
Sentinel est un mode de fonctionnement de Redis. Il se concentre sur la surveillance de l'état d'exécution des instances Redis (nœuds maîtres, nœuds esclaves) et peut réaliser la sélection maître et la sélection maître-esclave via une série de mécanismes en cas de défaillance du nœud maître. Basculez et implémentez le basculement pour garantir la disponibilité de l'ensemble du système Redis.
Son schéma d'architecture est le suivant : Redis Sentinel a les capacités suivantes :Intervieweur : Comment les sentinelles se connaissent-elles ?La sentinelle établit la communication avec le maître et utilise le mécanisme de publication/abonnement fourni par le maître pour publier ses propres informations, comme la taille et le poids, si vous êtes célibataire, IP, port... le maître dispose d'un espace dédié
__sentinel__:hello
Les canaux sont utilisés pour publier et s'abonner aux messages entre sentinelles. C'est comme le groupe WeChat __sentinel__:hello
. Sentinel utilise le groupe WeChat créé par le maître pour publier ses propres actualités, et en même temps prêter attention aux actualités publiées par d'autres sentinelles__sentinel__:hello
的专用通道,用于哨兵之间发布和订阅消息。这就好比是 __sentinel__:hello
微信群,哨兵利用 master 建立的微信群发布自己的消息,同时关注其他哨兵发布的消息。
面试官:哨兵之间虽然建立连接了,但是还需要和 slave 建立连接,不然没法监控他们呀,如何知道 slave 并监控他们的?
关键还是利用 master 来实现,哨兵向 master 发送 INFO
命令, master 掌门自然是知道自己门下所有的 salve 小弟的。所以 master 接收到命令后,便将 slave 列表告诉哨兵。
哨兵根据 master 响应的 slave 名单信息与每一个 salve 建立连接,并且根据这个连接持续监控哨兵。
面试官:除了哨兵以外,还有其他的高可用手段么?
有 Cluster 集群实现高可用,哨兵集群监控的 Redis 集群是主从架构,无法很想拓展。使用 Redis Cluster 集群,主要解决了大数据量存储导致的各种慢问题,同时也便于横向拓展。
在面向百万、千万级别的用户规模时,横向扩展的 Redis 切片集群会是一个非常好的选择。
面试官:什么是 Cluster 集群?
Redis 集群是一种分布式数据库方案,集群通过分片(sharding)来进行数据管理(「分治思想」的一种实践),并提供复制和故障转移功能。
将数据划分为 16384 的 slots,每个节点负责一部分槽位。槽位的信息存储于每个节点中。
它是去中心化的,如图所示,该集群有三个 Redis 节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据多少可能不一样。
三个节点相互连接组成一个对等的集群,它们之间通过 Gossip
.
Intervieweur : Bien que les sentinelles aient établi une connexion entre elles, elles doivent encore établir une connexion avec l'esclave, sinon, elles ne peuvent pas être surveillées. Comment connaître l'esclave et le surveiller ?
INFO
au maître. Le maître connaît naturellement tous les garçons salve sous lui. Ainsi, une fois que le maître a reçu la commande, il indique à la sentinelle la liste des esclaves. Intervieweur : En plus des sentinelles, existe-t-il d'autres méthodes de haute disponibilité ?
Il existe un cluster Cluster pour atteindre la haute disponibilité. Le cluster Redis surveillé par le cluster Sentinel a une architecture maître-esclave et ne peut pas être facilement étendu.
L'utilisation du cluster Redis Cluster résout principalement divers problèmes de lenteur causés par un stockage de données volumineux et facilite également l'expansion horizontale.
🎜Face à des millions ou des dizaines de millions d'utilisateurs, les clusters de découpage Redis évolutifs horizontalement seront un très bon choix. 🎜🎜🎜🎜Intervieweur : Qu'est-ce qu'un Cluster ? 🎜🎜🎜Le cluster Redis est une solution de base de données distribuée. Le cluster gère les données via le sharding (une pratique de « diviser pour mieux régner ») et fournit des fonctions de réplication et de basculement. 🎜🎜Divisez les données en 16384 emplacements, et chaque nœud est responsable d'une partie des emplacements. Les informations sur les emplacements sont stockées dans chaque nœud. 🎜🎜Il est décentralisé. Comme le montre la figure, le cluster se compose de trois nœuds Redis. Chaque nœud est responsable d'une partie des données de l'ensemble du cluster. La quantité de données dont chaque nœud est responsable peut être différente. 🎜🎜🎜🎜三Les nœuds sont connectés les uns aux autres pour former un cluster peer-to-peer. Ils échangent des informations de cluster entre eux via le protocole Gossip
. Enfin, chaque nœud enregistre l'allocation des emplacements des autres nœuds. 🎜🎜🎜Intervieweur : Comment les emplacements de hachage sont-ils mappés aux instances Redis ? 🎜🎜🎜🎜Selon la clé de la paire clé-valeur, utilisez l'algorithme CRC16 pour calculer une valeur de 16 bits ; 🎜🎜La valeur de 16 bits est modulo 16384, et un nombre compris entre 0 et 16383 est obtenu pour représenter le emplacement de hachage correspondant à la clé. 🎜🎜Localisez l'instance correspondante en fonction des informations sur l'emplacement. 🎜🎜🎜La relation de mappage entre les données des paires clé-valeur, les emplacements de hachage et les instances Redis est la suivante : 🎜🎜🎜🎜🎜🎜Intervieweur : Comment le cluster implémente-t-il le basculement ? 🎜Les nœuds du cluster
Redis utilisent le protocole Gossip
pour diffuser leur statut et les changements dans leurs connaissances de l'ensemble du cluster. Par exemple, si un nœud découvre qu'un certain nœud est perdu (PFail), il diffusera ces informations à l'ensemble du cluster et d'autres nœuds pourront également recevoir ces informations de connexion perdue.
Si un nœud reçoit que le nombre de déconnexions d'un certain nœud (PFail Count) a atteint la majorité du cluster, il peut marquer le nœud comme déterminé comme étant hors ligne (Fail), puis le diffuser à l'ensemble du cluster, forcer les autres nœuds à recevoir également le fait que le nœud est devenu hors ligne et à effectuer immédiatement un commutateur maître-esclave sur le nœud perdu.
Intervieweur : Comment le client détermine-t-il sur quelle instance les données consultées sont distribuées ?
L'instance Redis enverra ses informations d'emplacement de hachage à d'autres instances du cluster via le protocole Gossip, réalisant ainsi la diffusion des informations d'allocation d'emplacement de hachage.
De cette façon, chaque instance du cluster dispose d'informations sur les relations de mappage entre tous les emplacements de hachage et les instances.
Lorsque le client se connecte à une instance, l'instance répond au client avec la relation de mappage entre l'emplacement de hachage et l'instance, et le client met en cache les informations de mappage entre l'emplacement de hachage et l'instance localement.
Lorsque le client fait une demande, il calculera l'emplacement de hachage correspondant à la clé, localisera l'instance où se trouvent les données via les informations de mappage d'instance d'emplacement de hachage mises en cache localement, puis enverra la demande à l'instance correspondante.
Intervieweur : Qu'est-ce que le mécanisme de redirection Redis ?
La relation de mappage entre les emplacements de hachage et les instances a changé en raison de nouvelles instances ou de la redistribution de l'équilibrage de charge. Le client envoie la demande à l'instance. L'instance Redis dira au client d'envoyer la demande. à d'autres instances.
Redis informe le client via les erreurs MOVED et ASK.
MOVED Erreur (équilibrage de charge, les données ont été migrées vers d'autres instances) : lorsque le client envoie une demande d'opération de paire clé-valeur à une instance et que l'emplacement où se trouve la clé n'est pas de sa propre responsabilité , cette instance renverra une erreur MOVED pour indiquer au nœud d'être responsable de l'emplacement.
Dans le même temps, le client mettra également à jour le cache local pour mettre à jour correctement la relation correspondante entre le slot et l'instance Redis.
S'il y a beaucoup de données dans un certain emplacement, une partie sera migrée vers la nouvelle instance et une partie ne sera pas migrée.
Si la clé demandée est trouvée sur le nœud actuel, exécutez la commande directement, sinon une réponse d'erreur ASK sera requise.
Lorsque la migration du slot n'est pas terminée, si le Slot auquel il faut accéder à la clé est en cours de migration de l'instance 1 vers l'instance 2 (si la clé n'est plus dans l'instance 1), l'instance 1 renverra un message d'erreur ASK à le client : Demande du client L'emplacement de hachage où se trouve la clé est en cours de migration vers l'instance 2. Vous envoyez d'abord une commande ASKING à l'instance 2, puis envoyez la commande d'opération .
Par exemple, si le client demande de localiser l'emplacement 16330 avec key = "Compte officiel : Code Byte" sur l'instance 172.17.18.1, le nœud 1 exécutera directement la commande s'il peut être trouvé, sinon il répondra par une erreur ASK et demandez au client de rediriger. Le nœud cible en cours de migration est 172.17.18.2.
Remarque : L'instruction d'erreur ASK ne met pas à jour les informations d'allocation d'emplacement de hachage mises en cache par le client.
Cet article passe principalement en revue le contenu principal de Redis, impliquant la structure des données, le modèle de mémoire, le modèle IO, le RDB et l'AOF persistants, le principe de réplication maître-esclave, le principe sentinelle et le principe de cluster.
Adresse originale : https://juejin.cn/post/6976257378094481444
Auteur : Code Brother Byte
Pour plus de connaissances sur la programmation, veuillez visiter : Vidéo de programmation ! !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!