昨晚通宵生产压测,终于算是将生产服务宕机的原因定位到了,心累。这篇博客,算作一个复盘和记录吧。。。

先来看看Redis的缓存淘汰算法思维导图:

说明:当实际占用的内存超过Redis配置的maxmemory时,Redis就会根据用户选择淘汰策略清除被选中的key。

业务场景:用户通过微信入口来访问一个页面;

测试场景:通过多线程模拟定量的并发来访问页面服务;

涉及架构:springsession+Redis集群,容器部署;

问题描述:固定并发数压测10分钟,压测开始后半小时,Redis连接数激增,连接耗尽,服务重启;

处理逻辑:

①、用户通过入口页面访问服务时,springsession给每个用户创建一个session,将key存储在Redis中;

②、Redis默认配置每隔半小时,利用hGetAll函数遍历session-key所在的集合,将最近一分钟内要过期的key全部delete,释放内存;

宕机原因:

①、Redis是单线程处理,由于高并发压测,产生了百万级的key存储在set集合中,当hGetAll函数遍历集合删除过期session的key时,大量用户连接失效;

②、失效瞬间,Redis需要创建大量连接,如果新建连接数超过了设置的最大连接数,则Redis服务容器健康检查不通过;

③、通过选举,Redis集群主从切换时需要将master的数据复制到salve;

④、主从复制时,Redis定位区域buffer(软链接)超时,最终导致服务宕机重启。

优化方案:

①、选择Redis默认淘汰策略,每秒钟选择10次,每次不超过25个,即每秒钟淘汰≤250个key;

缺点:内存耗用较高,需要通过横向扩展资源来应对该问题;

②、通过压测确定当前系统配置下的最大可处理阈值,通过网关限流、服务降级等措施来保障服务的稳定运行;

缺点:如果实际流量超过限流配置,则用户可能看到一些“友好界面”,用户体验不太好;

③、新建一个单独工程定期清理过期key,修改工程实例与Redis的消息订阅事件逻辑,降低OPS与client connect,Redis由哨兵改集群模式;

说明:方案③与方案②结合,可大大提高系统的可用性!!!

PS:在实际生产环境中,系统稳定性和可用性胜于一切!!!

相关参考:

Redis缓存淘汰算法

Redis的hGetAll函数的性能问题

以上就是此次问题复盘,虽然通宵带来的后遗症导致现在还有点迷糊,但从中学到了很多新的东西,值得思考与学习。。。

由Redis的hGetAll函数所引发的一次服务宕机事件的更多相关文章

  1. Redis的KEYS命令引起宕机事件

    摘要: 使用 Redis 的开发者必看,吸取教训啊! 原文:Redis 的 KEYS 命令引起 RDS 数据库雪崩,RDS 发生两次宕机,造成几百万的资金损失 作者:陈浩翔 Fundebug经授权转载 ...

  2. 云计算之路-阿里云上:重启 manager 节点引发 docker swarm 集群宕机

    为了迎接春节假期后的访问高峰,我们今天对 docker swarm 集群进行了变更操作,购买了1台阿里云4核8G的服务器作为 worker 节点,由原来的  3 manager nodes + 2 w ...

  3. 【故障公告】redis 服务器宕机引发博客站点故障

    非常抱歉,今天下午 17:10~17:40 左右,由于博客系统所使用的 redis 服务器宕机,造成博客站点无法正常访问,由此给您带来很大的麻烦,请您谅解. 我们会针对这次故障改进 redis 服务器 ...

  4. Redis 日志篇:无畏宕机快速恢复的杀手锏

    特立独行是对的,融入圈子也是对的,重点是要想清楚自己向往怎样的生活,为此愿意付出怎样的代价. 我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机,内存中的数据全部丢失,假如 ...

  5. Redis宕机的问题

    在主从模式下宕机要分为区分来看: slave从redis宕机 ​ 在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据: ​ 如果从数据库实现了持久化,只要重新假如到主从架构中会实现增 ...

  6. redis集群节点宕机

    redis集群是有很多个redis一起工作,那么就需要这个集群不是那么容易挂掉,所以呢,理论上就应该给集群中的每个节点至少一个备用的redis服务.这个备用的redis称为从节点(slave). 1. ...

  7. redis宕机如何解决?如果是项目上线的宕机呢?

    我们先来了解一下  bridge网络模式 他会创建一个docker0桥,看完这个我们就会知道redis哨兵机制的端口了. 之后继续研究redis宕机的解决办法! 宕机: 服务器停止服务 如果只有一台r ...

  8. 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题

    1> 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题(处理心得)

  9. [转帖]Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案

    Redis持久化--Redis宕机或者出现意外删库导致数据丢失--解决方案 https://www.cnblogs.com/xlecho/p/11834011.html echo编辑整理,欢迎转载,转 ...

随机推荐

  1. angr进阶(4)从任意位置开始

    从程序的任意位置开始可以大大的减少测试的时间,使用的方法是控制程序运行到某时刻的寄存器的值来进行的.asisctffinals2015_fake p = angr.Project("fake ...

  2. JDK源码分析(10)之 Hashtable 相关

    本文的目的并不是让你对Hashtable更加了解,然后灵活运用:因为Hashtable的一个历史遗留的类,目前并不建议使用,所以本文主要和HashMap对比,感受同样功能的不同实现,知道什么是好的代码 ...

  3. Spring Boot 2.x (八):日志框架的使用

    我们为啥要用日志? 最初我们开始接触Java的时候,我们通常会使用System.out.println()将我们想要知道的信息打印到控制台. 但是,如果在服务器上我们去运行我们的Java程序,这个时候 ...

  4. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(1)- 环境搭建(Python2.7.14 + PyAudio0.2.11 + Matplotlib2.2.3 + SpeechRecognition3.8.1 + pyttsx3 2.7)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之环境搭建. 在写Jays-PySPEECH时需要先搭好开发环境,下表列出了开发过程中会用到的 ...

  5. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(5)- 语音识别实现(SpeechRecognition, PocketSphinx0.1.15)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之语音识别实现. 语音识别是Jays-PySPEECH的核心功能,Jays-PySPEECH借 ...

  6. F#周报2019年第8期

    新闻 Fable 2.2发布,支持匿名记录 Paket提升还原时间 Microsoft.Jupyter.Core预览 .NET Framework 4.8早期可访问编译版本3745 博客 使用SAFE ...

  7. linux-2.6.18源码分析笔记---进程

    一.进程重要字段描述 在目录include\linux\sched.h下定义了进程描述符task_struct,关注如下字段: 进程状态 volatile long state:表示进程状态,在该文件 ...

  8. nginx错误界面优化和日志管理

    nginx错误界面优化 在进行web访问的时候,经常会遇到网站打不开报错的情况,nginx默认的界面并不美观,我们可以通过重定向到自定义的错误页面,提升用户体验,比如淘宝的错误页面还有商品信息和广告. ...

  9. DSAPI多功能组件编程应用-参考-Win32API常数

    DSAPI多功能组件编程应用-参考-Win32API常数 在编程过程中,常常需要使用Win32API来实现一些特定功能,而Win32API又往往需要使用一些API常数,百度搜索常数值,查手册,也就成了 ...

  10. WPF StringFormat 格式化文本

    StringFormat对特定数据格式的转换 WPF中,对数字/日期等的格式化,可参考此篇博客:https://www.cnblogs.com/zhengwen/archive/2010/06/19/ ...