Cet article vous amènera à comprendre Codis dans Redis et à présenter les principes de Codis. J'espère qu'il vous sera utile !
Dans un scénario de Big Data à forte concurrence, utiliser une seule instance Redis, quelle que soit la performance de Redis, deviendra très difficile
Tout d'abord, plus la quantité de données est importante, plus redis occupera de mémoire, ce qui rendra le fichier RDB trop volumineux. Cette situation rendra le temps de synchronisation complète maître-esclave trop long. En même temps, lorsque l'instance est redémarrée, le chargement d'un RDB trop volumineux. cela rendra également le temps de démarrage plus long. [Recommandations associées : Tutoriel vidéo Redis]
Deuxièmement, en termes d'utilisation du processeur, une seule instance de Redis ne peut utiliser qu'un seul cœur de processeur. Si un cœur contient trop de données, il sera submergé, un cluster est donc nécessaire. . La solution répartit l'énorme quantité de données d'une instance à plusieurs instances. De la popularité de Redis au support officiel de sa propre solution Cluster, des tiers développent également leurs propres composants pour prendre en charge les clusters,
.Codis est développé en utilisant le langage Go et agit comme un proxy entre Redis et le client. Il utilise le protocole Redis, afin que le client puisse se connecter directement à Codis et lui envoyer des instructions. Codis se charge de transmettre les instructions à Redis, et. recevoir enfin les résultats renvoyés et les renvoyer au client, côté client, l'instance Redis représentée par
Codis constitue un cluster Redis lorsque l'espace du cluster n'est pas suffisant, il peut être étendu dynamiquement et continuer à en ajouter. Instances Redis. Dans le même temps, le SDK utilisé par le client n'a pas besoin d'être modifié. Il suffit de changer la connexion d'origine de redis en codis
Codis lui-même peut également utiliser un cluster pour assurer sa haute disponibilité puisqu'il est sans état. lui-même, il est uniquement responsable de la transmission du contenu. L'ajout de plusieurs Codis n'a aucun effet secondaire. Il peut également assurer l'amélioration du QPS. Lorsqu'un des Codis échoue, un autre peut être utilisé.
Principe
Codis est divisé en 1024 slots par défaut. Chaque instance Redis dans le cluster correspond à une partie des slots. Codis maintiendra la relation correspondante entre les slots et les instances Redis dans la mémoire. peut être modifié s’il existe de nombreux nœuds de cluster, le nombre peut être augmenté.
Lors de la réception de la clé envoyée par le client, Codis effectue une opération crc32 sur la clé pour obtenir une valeur de hachagePuis la valeur entière hachée est modulo 1024 (nombre d'emplacements) pour obtenir un Le reste est le. slot où la clé sera enregistrée. Avec le slot, vous pouvez trouver à quelle instance Redis la clé doit être envoyée.
Pseudocode :
hash = crc32(command.key) # 计算hash值 slot = hash % 1024 # 取模得到槽位 redisInstance = slots[slot].redis # 得到redis实例 redis.do(command) # 执行命令复制代码
Synchronisation des emplacements de cluster
La relation de mappage entre Redis et les emplacements existe dans la mémoire de Codis, le cluster Codis doit donc veiller à ce que la relation de mappage d'emplacement dans chaque nœud soit synchronisée, donc Codis Les middlewares de stockage de configuration distribués Zookeeper et Etcd sont utilisés pour conserver les relations de mappage d'emplacements afin d'assurer la synchronisation des données entre les clusters Codis. Comme indiqué ci-dessous, Codis stocke les relations d'emplacements dans Zookeeper et fournit un tableau de bord pour observer et modifier les emplacements lorsque la relation de bits change, Codis Proxy. détecte le changement et resynchronise la relation de slot.
Extension de capacitéLorsque le cluster existant ne répond pas aux besoins de l'entreprise, il est nécessaire d'ajouter de nouvelles instances au cluster. À ce stade, la relation de mappage des emplacements doit être redistribuée et une. une partie doit être allouée aux nouveaux nœuds. Codis a ajouté une nouvelle commande SLOTSSCAN, qui peut parcourir toutes les clés sous un emplacement spécifié. Utilisez cette commande pour analyser toutes les clés de l'emplacement à migrer, puis parcourir chaque clé une par une pour migrer vers le nouveau nœud. Pendant le processus de migration, Codis continue de fournir des services au monde extérieur. À ce moment-là, une demande arrive au slot en cours de migration. Puisque le slot correspond désormais aux anciens et aux nouveaux nœuds, Codis ne peut pas déterminer si la clé est présente. a été migré de l'ancien nœud vers le nouveau nœud. Sur le nœud,
Donc, dans ce cas, Codis forcera immédiatement une seule migration de la clé actuelle. Une fois la migration terminée, la demande sera transmise à la nouvelle instance Redis. .
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 Comme la propre commande Scan de Redis, la duplication des données numérisées ne peut être évitée, mais cela n'affectera pas l'exactitude de la migration, car une seule clé est immédiatement supprimée de l'ancienne instance après sa migration. ne sont plus scannés.
Fentes d'équilibrage automatique
Chaque fois qu'une nouvelle instance est ajoutée, il serait trop difficile de maintenir manuellement la relation de mappage des emplacements. Codis fournit un équilibrage automatique. Cette fonction observera le nombre d'emplacements correspondant à chaque instance Redis lorsque le système est relativement inactif. déséquilibré, il équilibrera automatiquement l'opération de migration des données.
Inconvénients
Codis apporte des avantages d'expansion à Redis, mais il provoque également des effets secondaires.
Ne prend pas en charge les transactions
Une transaction peut opérer sur plusieurs clés, mais la transaction ne peut être complétée qu'en une seule instance. Cependant, comme les clés sont dispersées dans différentes instances, Codis ne peut pas prendre en charge les opérations de transaction.
ne prend pas en charge le renommage
renommer une clé en une autre clé, mais les deux clés ne peuvent pas être hachées dans le même emplacement, mais dans les emplacements d'instances différentes, donc la prise en charge du renommage ne sera pas utilisée.
Liste officielle des commandes non prises en charge : https://github.com/CodisLabs/codis/blob/master/doc/unsupported_cmds.md
Expansion lag
Codis modifie les données pendant le processus d'expansion La migration consiste à migrer directement la clé entière, comme une structure de hachage, Codis va directement hgetall pour extraire tout le contenu et utiliser hmset pour le mettre dans le nouveau nœud
Si le contenu du hachage est trop volumineux, cela entraînera un décalage, officiel. Il est recommandé que la taille totale d'une structure de collection unique ne dépasse pas 1 Mo. En termes d'activité, les données volumineuses peuvent être divisées en plusieurs petites via le stockage en compartiment pour faire un compromis.
Surcharge réseau
Étant donné que Codis agit comme un proxy réseau entre le client et l'instance Redis, il existe une couche supplémentaire, et la surcharge réseau est naturellement plus élevée et les performances sont légèrement inférieures à la connexion directe à Redis.
Surcharge d'exploitation et de maintenance du middleware
La configuration du cluster Codis nécessite l'utilisation de Zk ou Etcd, ce qui signifie que l'introduction du cluster Codis nécessite l'introduction d'autres middleware, ce qui augmente le coût des ressources d'exploitation et de maintenance de la machine.
Avantages
Codis confie le problème de cohérence distribuée à un tiers (ZK ou Etcd), éliminant ainsi le travail de maintenance dans ce domaine et réduisant la complexité du code d'implémentation,
Redis officiel Afin d'atteindre Après la décentralisation, Cluster a introduit les protocoles Raft et Gossip, ainsi qu'un grand nombre de paramètres de configuration qui devaient être réglés, et la complexité a fortement augmenté.
Acquisition par lots
Pour les opérations par lots, comme l'utilisation de mget pour obtenir les valeurs de plusieurs clés, ces clés peuvent être dispersées dans plusieurs instances, Codis regroupe les clés en fonction de l'instance où elles se trouvent. localisé, puis traite chaque instance une par une. Appelez mget, et enfin le résumé est renvoyé au client.
Autres fonctions
Codis fournit une interface de tableau de bord et Codis-fe pour gérer le cluster. Vous pouvez également ajouter des groupes, des nœuds, effectuer un équilibrage automatique et d'autres opérations, afficher l'état des emplacements et le redis correspondant à. Dans les instances, ces fonctions rendent l'exploitation et la maintenance plus pratiques et plus faciles.
Retour à l'histoire
Codis semble compenser le fait que Redis n'a officiellement pas fourni le concept de clustering. Désormais, Redis fournit officiellement la fonction Cluster, et le support officiel est naturellement meilleur que les logiciels tiers ont plus d'avantages
Dans le même temps, les logiciels tiers doivent également prêter attention aux nouvelles fonctionnalités publiées par le responsable en temps réel, et Cluster est définitivement compatible avec. nouvelles fonctionnalités en temps réel, il est donc plus recommandé d'utiliser le Cluster officiel, c'est un point de connaissance qui a été appris dans le passé, certaines idées se chevauchent avec Cluster.
Pour plus de connaissances sur la programmation, veuillez visiter : Introduction à la 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!