背景

在分布式K-V存储系统中,对某个key进行读写时,会根据该key的hash计算出一台固定的server来存取该K-V,如果集群不发生服务器数量变化,那么这一映射关系就不会变化。

云数据库 memcached 就是这样一种K-V缓存系统。在实际应用中的某些高峰时段,有的云数据库 memcached 用户会大量请求同一个Key(可能对应应用的热卖商品、热点新闻、热点评论等),所有的请求(且这类请求读写比例非常高)都会落到同一个server上,该机器的负载就会严重加剧,此时整个系统增加新server也没有任何用处,因为根据hash算法,同一个key的请求还是会落到同一台新机器上,该机器依然会成为系统瓶颈。这个问题称为“热点key”问题。

现状

用户使用云数据库 memcached 就是为了提升业务性能,难免会触发“热点key问题”。但云数据库memcached做为公有云服务,在发现有热点的情况下,如果继续放任该热点无限激增,就会带来整个系统雪崩。所以当前的做法是对每个用户在每台服务器上分配一定的QPS或带宽,当用户在某台服务器上的请求超过该用户的配额,我们就会对用户进行流控,服务端返回TEMPORARY_FAILURE,该限制会影响用户正常请求,持续时间分钟级。

思考

用户触发热点问题是业务需要,是理所当然;云数据库 memcached 对热点 key 进行流控是保障系统稳定性,也在情理之中。但有没有一种既能提供用户热点 key 访问的需求,又能保护云数据库memcached服务器的方法呢,这正是本文所要阐述的。

解决热点问题有很多办法,比如用户如果提前知道某些key可能成为热点,那么客户端可以提前拆分热点key;也可以搭建一个备用集群,写的时候双写,然后随机双读。这些方案的实现前提和难度可想而知,下面给出的是对应用透明,且动态发现热点的解决方案。

解决方案

整体思路

本方案解决的是用户读热点问题,不解决写热点问题。

首先,云数据库memcached简单架构图如下:

我们的proxy是无状态层,上面做了些访问控制功能,用户客户端到proxy是随机的,不受固定算法(如hash)控制。而proxy到DataServer的链路是根据key决定的,当用户访问热点key时,所有proxy上关于该key的请求都会落到同一台DataServer。

所以解决热点问题,其核心思路是:每台DataServer对所有key进行采样、定位,实时计算出当前热点key,将其反馈给proxy层,由proxy缓存备份。即负载压力由DataServer转向proxy。理由是:Proxy可以无状态扩容,而DataServer不可以。

DataServer如何发现热点

每台服务器有个HotKey逻辑,让每个到达服务器的目标请求(可配置不同类型请求)经历三个流水阶段:

  1. 采样阶段(根据配置设定采样次数sample_max)
    本阶段输出:是否有热点现象,如果有热点,输出热点的桶号供下阶段使用。
  2. 定位阶段(根据配置设定采样次数reap_max)
    本阶段输出:热点key(如果满足阈值),并添加到服务端的LRU链表。
  3. 反馈阶段
    对到达服务器的目标请求,取出key,然后查询LRU链表判断该key是否为热点key。如果是热点,就会在请求结束后,向proxy发送一个feedback包,通知proxy。

至此,服务器hot-key逻辑结束。流程图如下:

发现热点后proxy怎么处理

当Proxy收到DataServer的热点反馈之后,会将该key写入到自己的LRU-cache里面,该cache的过期时间和容量大小都交由用户通过控制台设置,默认分别是100ms和30。这样热点的key就已经存在于与proxy中了,下次用户请求就可以直接返回了。

如何保证数据一致性呢?

下面讨论都是用户client已经触发了热点key问题,假设用户client跟每个proxy都建立了链接,并且每个proxy上都有对热点key的请求,那么理论上每个proxy的LRU-cache都有一份数据。

我们保证单条连接上的一致性。
当用户client和proxy1建立连接,用户修改了一个key(任何写操作),proxy1上会在LRU-cache中同步删除该key,新key就会写到DataServer上,然后在读数据的时候,由于LRU-cache不命中,就会从DataServer上拿到最新数据。

不同链接上只能提供弱一致性。
如果这个时候用户从proxy2上读热点数据呢?理论上就会读到老数据,该数据将于100ms之后从proxy-cache中过期淘汰掉,之后就会更新会最新数据,即不同连接间可能有100ms不一致。

怎样看待弱一致性。
事实上,不开启热点key功能,在不同链接上也会存在弱一致。假设用户client建立了两条链接到云数据库memcached,在链接1上写入key-value1,在链接1、2上分别读该key。当链接1上用户update了key-value2,这个请求需要一定的网络延迟才能写入到服务端,如果这个时候链接2上同时发起对key的读取操作,如果读请求先到服务端,它将读到的是value1的老值。

所以开启热点key功能,只是增加了不一致时间,且该功能为可选,控制权由用户掌握。

适用场景

由以上分析可以看到,开启热点key功能之后,只会对用户的读请求产生影响,该影响增加了不同链接上的弱一致性的时间。因此,该功能适合读多写少,且对强一致性要求不高的应用。

收益

整个方案核心是负载压力由DataServer转移到Proxy。好处如下:

  1. 因为DataServer扩容也解决不了热点问题,而Proxy可以无状态扩容,对用户来讲就极大提升了热点key访问的能力,不受单点制约;
  2. 缩短了服务端处理链路,对用户平均RT也所降低;
  3. 免除服务端热点流控的分钟级别影响。

Memcached · 最佳实践 · 热点 Key 问题解决方案相关推荐

  1. 缓存击穿、缓存失效及热点key的解决方案

    精选30+云产品,助力企业轻松上云!>>> 点击蓝色"大数据每日哔哔"关注我 加个"星标",第一时间获取大数据架构,实战经验 摘要:分布式缓存 ...

  2. 如何发现 Redis 热点 Key ,解决方案有哪些?

    一.热点问题产生原因 热点问题产生的原因大致有以下两种: 1.1 用户消费的数据远大于生产的数据(热卖商品.热点新闻.热点评论.明星直播). 在日常工作生活中一些突发的的事件,例如:双十一期间某些热门 ...

  3. 最佳实践 | 数据库迁云解决方案选型 流程全解析

    Oracle是非常强大的综合数据库,但同时也存在一些劣势,比如由于采用集中式架构,无法很好地实现横向扩展,并且其稳定性依赖于硬件.出于架构升级.降低成本和云化等需求,越来越多的企业需要"去O ...

  4. Redis——热点key问题

    本篇主要介绍Redis中的热点Key问题,包括热点Key产生的原因.如何监控发现热点key以及热点Key的解决方案: 其实热key问题说来也很简单,就是瞬间有大量的请求去访问redis上某个固定的ke ...

  5. Mendix UX最佳实践

    简介 在Mendix团队中,用户体验设计师的工作是通过各种方式来改善应用程序的用户体验.然而,有时从开发角度出发,逻辑解决方案对用户体验的改善并非是最佳解决方案.因此,本篇内容将提供用户体验设计师一些 ...

  6. 高并发百万级热点key处理方案

    背景 我们知道在面试中,面试官经常会问一些关于高并发的问题,其中热点key问题就是一个热门问题,热点key顾名思义就是访问非常频繁的key,再加上高并发访问条件,热点key缓存问题如何解决.接下来我们 ...

  7. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析

    转载自  https://blog.csdn.net/wang0112233/article/details/79558612 https://www.sohu.com/a/230787856_231 ...

  8. 将 DTS 用于业务智能解决方案的最佳实践

    摘自:http://www.microsoft.com/china/MSDN/library/archives/library/dnSQL2k/html/SQL_busintbpwithDTS.asp ...

  9. redis热点key解决方案_缓存穿透,缓存雪崩,4种解决方案分析

    前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到 ...

  10. Redis热点Key发现及常见解决方案

    热点Key问题产生的原因大致有以下两种: 1.用户消费的数据远大于生产的数据(热卖商品.热点新闻.热点评论.明星直播). 在日常工作生活中一些突发的的事件,例如:双十一期间某些热门商品的降价促销,当这 ...

最新文章

  1. JavaScript与Java函数的比较
  2. 使用resnet训练CIFAR10
  3. LOJ #6358 前夕 (组合计数、容斥原理)
  4. 图机器学习中的数据增强技术
  5. 安卓键盘加上数字_Android自定义键盘的实现(数字键盘和字母键盘)
  6. 前端学习(3288):react hook state-hook
  7. A Spy in the Metro UVA - 1025
  8. 雅马哈机器人左手右手系统_3名工人花1000元用两天拼装机器人,空气不好时自动喷水...
  9. PyTorch 1.0 中文文档:多进程最佳实践
  10. 批量 材质 调整_寒霜引擎的PBR实践3.0(一)材质篇
  11. 我的php学习笔记(45) PHP输出CSV、Excel
  12. SpringBoot解决jpa,NoSession问题
  13. TextMeshPro备用字体疑问
  14. 自抗扰控制的入门学习(一)—— 前言
  15. java opencv 人脸相似度,opencv 比较两张图的相似度
  16. 2020-09-07(基于控制台的DVD管理系统)
  17. Excel VBA自定义功能区
  18. XposedZjDroid脱壳梆梆加固
  19. (P9)socket编程四:流协议与粘(nian)包,粘包产生的原因,粘包处理方案,readn,writen 6.回射客户/服务器
  20. 驾考题库API接口,免费好用

热门文章

  1. 局域网内手机访问电脑网站注意几点
  2. Eclipse远程部署
  3. js中的var和new
  4. QQ2011的DD包密码验证报文解密密钥计算困惑之二
  5. 一组开源asp.net用户控件
  6. 目标跟踪理论方法小结
  7. Mac上自带的语音功能怎么用?让你的mac读给你听
  8. 2018世界杯最帅射手-C罗,嗯,没得跑了!
  9. .sig 签名文件怎么使用
  10. LightOJ-1054 Efficient Pseudo Code