zoukankan      html  css  js  c++  java
  • 【原创】redis单点大热key叠加pipeline导致服务雪崩

    背景问题:

      线上系统自某一天,业务慢慢到高峰,首页会逐步卡顿,高峰时甚至异常白屏,且蔓延到其它界面。

    原因:

      经过焦灼的排查,定位到:

      原因是app客户端首页有一个业务组件是基于redis的单点list结构设计的功能,代码逻辑是lrange 0 -1,即拿出list所有数据到应用层

      然后在应用层随机取4个返回客户端展示。 这个组件刚上的时候list里只有几个对象,lrange 0 -1,因为对象少,虽是单点也没啥大问题。

      但是这个组件很久未运营配置,年底时运营上了这个组件,此时redis的list里有1000多个对象,这个组件又放在首页qps很大;业务层又会用pipeline,

      然后就出了问题。

      原因一句话总结:redis单点大热key叠加pipeline命令,导致redis不可用进一步引起服务逐步雪崩

    具体过程梳理如下:

        1.运营将这个很久不用的组件配置在首页,此时这个组件依赖的redis单点list数据结构中有1000多个对象,list空间大小>1M.

        2.依赖的redis的数据结构是个单点key, redis是redis-cluster HA模式。

        3.这个组件在首页,访问量很大,峰值>1万QPS, 是个热key.

        4.异常时,可以观察到:redis-cluster这个节点内存占用很高,线上报大量io-closeWait异常,网络链接大量超时及重连;原因是因为每次要lrange 0 -1全部数据到应用层,

         即每次请求要请求1M数据,然后又是单点热key, 导致了redis响应缓冲区溢出;这个redis节点不可用。

           用户侧的感知就是,业务谷点首页还能展示,随着到了业务高峰,会感觉逐步卡顿,到后面蔓延到有依赖redis的所有功能都不可用。

        5.之所以会蔓延到其它依赖redis的功能,主要是因为我们业务侧有使用较多的redis pipeline命令,当集群中某个机器发起pipeline命令,

         然后这个命令中若有一个key也落在了这个异常的redis单点中,会导致这个pipeline命令也阻塞,那么后续其它命令也会跟着阻塞,即蔓延到了其它依赖redis的功能。

        6.最终的表象就是:在业务高点,用户进app基本不可用,其它功能极其卡顿也基本不可用。

    解决方式:

      1.在定位到具体原因之前,运维做了粗暴的干涉,重启了redis,但是重启后问题依旧存在。思考前面引发的原因可知,重启没啥卵用。
      2.大家焦头烂额地定位到了问题,然后立马让运营下掉了这个组件,问题迎刃而解,客户端马上恢复。

    影响:

      造成了实际的资金损失,影响严重,最终被定级为S0故障,流下了痛苦的眼泪。。。

    类似异常排查思路:

      一般线上临时出问题,单纯的网络异常、pass异常、机器问题等 运维同学是能够立马识别的;
      排除这方面的问题,那肯定是由于什么线上变更导致,应该立马与多方确认,回顾下最近的线上变更
      比如最近有没有什么功能发布;如果没有,是否有什么配置变更;如果没有,是不是运营有什么线上运营变更;
      几条线摸下来,基本能找到问题方向。
      祝好运...
  • 相关阅读:
    洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk( 普及-)
    洛谷 P1909 [NOIP2016 普及组] 买铅笔
    全排列问题
    集合的划分(setsub)
    自然数拆分-回溯
    洛谷 P4414 [COCI2006-2007#2] ABC
    洛谷 P5709 【深基2.习6】Apples Prologue
    洛谷 P4326 [COCI2006-2007#1] Herman
    平面分割
    洛谷 P1601 A+B Problem(高精)
  • 原文地址:https://www.cnblogs.com/do-your-best/p/14445246.html
Copyright © 2011-2022 走看看