1. Défauts en mode persistance RDB
1. Description du problème :
200 canaux simultanés, simulant une écriture continue sur Redis, après 4 heures, Un grand nombre d'appels d'interface ont commencé à échouer et le message d'erreur était le suivant :
{"data":{"sendResult":null},"base":{"returncode":"99999","returndesc":"系统异常:MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error."},"qrybase":{"total":0,"count":0,"start":0}}
2. Analyse des causes :
a interprété le message d'erreur et a pensé qu'il était dû à un espace disque insuffisant. Il s'est avéré qu'il restait 42 % du disque, comme suit Affichage :
J'ai donc ouvert le journal Redis selon l'invite du message d'erreur et j'ai continué le test de stress. l'interface a toujours signalé une erreur, mais je peux voir dans les informations du journal Redis
Impossible d'enregistrer en arrière-plan : fork : Impossible d'allouer de la mémoire
C'est lié au utilisation inappropriée de la mémoire par le processus. Vérifiez la mémoire occupée par le processus principal Redis comme suit : occupant près de 55 %*4G de mémoire
Raison spécifique : Afin d'éviter le Le processus principal a suspendu l'animation lors de la sauvegarde des données sur le disque dur, Redis doit créer une copie du processus principal, puis terminer l'opération de sauvegarde des données sur le disque dur dans le processus Fork si le processus principal utilise 2,2 Go de mémoire. , 2,2 Go supplémentaires sont nécessaires lors du processus enfant de Fork. À ce stade, la mémoire n'est pas suffisante, Fork échoue et le disque dur de sauvegarde des données échoue également.
3. Plan d'atténuation (ne peut pas fondamentalement résoudre le problème) :
3.1 Modifier l'élément de configuration stop-writes-on-bgsave-error no dans le fichier redis.conf (la valeur par défaut est oui), c'est-à-dire lorsqu'une erreur se produit lors de l'opération d'instantané bgsave, arrêtez d'écrire des données sur le disque. De cette manière, toute erreur d'écriture ultérieure échouera. Afin de ne pas affecter les opérations d'écriture ultérieures, la valeur de cet élément doit être. changé en méthode no
3.2 Modifier les paramètres du noyau (3 ci-dessous)), mais nécessite les autorisations root :
(1) 编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效 (2)sysctl vm.overcommit_memory=1 (3)echo 1 > /proc/sys/vm/overcommit_memory
2. Défauts du mode de persistance AOF
1 Description du problème. 1 :
Les nœuds maître et esclave Redis activent le mode AOF. Il y a eu 200 connexions simultanées et la simulation a continué à écrire sur Redis. Après 15 minutes, un grand nombre d'appels d'interface ont commencé à échouer et Linux. le serveur virtuel où se trouvait Redis était bloqué.
L'erreur d'interface est la suivante :
{"data":null,"base":{"returndesc":"系统异常","returncode":"999999"},"qrybase":null} Biz(dubbo)接口报错如下: 2015-06-05 11:28:28.760 [DubboServerHandler-X.X.X.X:20882-thread-173] ERROR - error while validate jedis! redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
Analyse des causes :
À en juger par le message d'erreur de l'interface Dubbo, cela est dû au délai d'attente Redis de l'opération de l'API de l'interface. À en juger par les journaux système et la surveillance des E/S, il est démontré que les problèmes ci-dessus sont causés par des goulots d'étranglement des E/S (les E/S du système sont trop occupées), comme indiqué ci-dessous :
Il ressort également du journal système que le temps de blocage des E/S dépasse 120 secondes et que la machine se bloque en raison du mécanisme de sécurité du système.
Résumé
Les résultats des tests prouvent que le mode AOF présente le défaut le plus évident, c'est-à-dire que les IO deviendront un goulot d'étranglement des performances lorsque la pression d'accès est élevée, entraînant une indisponibilité du service.
3. Solution d'atténuation (ne peut pas fondamentalement résoudre le problème)
Modifiez /etc/sysctl.conf et ajoutez la configuration suivante :
vm.dirty_background_ratio = 5 vm.dirty_ratio = 10
Ensuite, sysctl -p effectue la configuration le fichier prend effet.
Description du problème 2 :
Indépendamment du mode AOF ou RDB (mode instantané), lorsque la taille des deux fichiers (.aof ou .rdb) dépasse 80% de la mémoire système, le processus Redis sera interrompu par la panne du système, ce qui rendra le service indisponible.
Résumé
Les problèmes ci-dessus montrent que nous devons planifier la capacité de la mémoire système à l'avance lors de l'utilisation de Redis, car une fois Redis en panne, une grande quantité de données sera perdue et irrécupérable. .
Pour plus de connaissances sur Redis, veuillez faire attention à la colonne Tutoriel d'introduction à Redis.
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!