Maison > Article > base de données > Une brève discussion sur les défauts des modes de persistance RDB et AOF dans Redis
Cet article vous présentera les lacunes des deux modes de persistance de Redis (RDB et AOF). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
[Recommandations associées : Tutoriel vidéo Redis]
Défauts du mode de 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 :
{"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 de la raison : J'ai interprété le message d'erreur et j'ai pensé qu'il était dû à un espace disque insuffisant. Il s'est avéré qu'il restait 42 % du disque, comme indiqué ci-dessous : Donc, sur la base du message d'erreur, il vous invite à activer le journal Redis et à poursuivre le test de stress. L'interface signale toujours une erreur, mais elle peut être vue à partir des informations du journal Redis. par le processus principal de Redis comme suit : occupant près de 55%*4G de mémoire
Raison spécifique : Afin d'éviter que le processus principal suspende l'animation lorsque Redis enregistre les données dans le disque dur, il doit créer une copie. Le processus principal termine ensuite 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 Fork du processus enfant. À ce stade, la mémoire n'est pas suffisante, Fork échoue et les données sont également enregistrées.
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 no3.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 :Redis maître-esclave Tous les nœuds sont activés en mode AOF, avec 200 connexions simultanées, simulant une écriture continue sur Redis. Après 15 minutes, un grand nombre d'appels d'interface ont commencé à échouer et. le serveur virtuel Linux sur lequel 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 outAnalyse 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 = 10Ensuite, 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 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!