实现多级缓存架构设计方案_第1页
实现多级缓存架构设计方案_第2页
实现多级缓存架构设计方案_第3页
实现多级缓存架构设计方案_第4页
实现多级缓存架构设计方案_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实现多级缓存架构设计方案为什么要做TMC多级缓存解决方案的痛点TMC整体架构TMC本地缓存如何透明整体结构热点发现整体流程数据收集热度滑窗热度汇聚热点探测特性总结实战效果快手商家某次商品营销活动双十一期间部分应用TMC效果展示**功能展望TMC,即“透明多级缓存(TransparentMultilevelCache)”,是有赞PaaS团队给公司内应用提供的整体缓存解决方案。TMC在通用“分布式缓存解决方案(如CodisProxy+Redis,如有赞自研分布式缓存系统zanKV)”基础上,增加了以下功能:应用层热点探测应用层本地缓存应用层缓存命中统计以帮助应用层解决缓存使用过程中出现的热点访问问题。为什么要做TMC使用有赞服务的电商商家数量和类型很多,商家会不定期做一些“商品秒杀”、“商品推广”活动,导致“营销活动”、“商品详情”、“交易下单”等链路应用出现缓存热点访问的情况:活动时间、活动类型、活动商品之类的信息不可预期,导致缓存热点访问情况不可提前预知;缓存热点访问出现期间,应用层少数

热点访问key

产生大量缓存访问请求:冲击分布式缓存系统,大量占据内网带宽,最终影响应用层系统稳定性;为了应对以上问题,需要一个能够自动发现热点并将热点缓存访问请求前置在应用层本地缓存的解决方案,这就是TMC产生的原因。多级缓存解决方案的痛点基于上述描述,我们总结了下列

多级缓存解决方案需要解决的需求痛点:热点探测:如何快速且准确的发现

热点访问key

?数据一致性:前置在应用层的本地缓存,如何保障与分布式缓存系统的数据一致性?效果验证:如何让应用层查看本地缓存命中率、热点key等数据,验证多级缓存效果?透明接入:整体解决方案如何减少对应用系统的入侵,做到快速平滑接入?TMC聚焦上述痛点,设计并实现了整体解决方案。以支持“热点探测”和“本地缓存”,减少热点访问时对下游分布式缓存服务的冲击,避免影响应用服务的性能及稳定性。TMC整体架构TMC整体架构如上图,共分为三层:存储层:提供基础的kv数据存储能力,针对不同的业务场景选用不同的存储服务(codis/zankv/aerospike);代理层:为应用层提供统一的缓存使用入口及通信协议,承担分布式数据水平切分后的路由功能转发工作;应用层:提供统一客户端给应用服务使用,内置“热点探测”、“本地缓存”等功能,对业务透明;本篇聚焦在应用层客户端的“热点探测”、“本地缓存”功能。TMC本地缓存如何透明TMC是如何减少对业务应用系统的入侵,做到透明接入的?对于公司Java应用服务,在缓存客户端使用方式上分为两类:基于

spring.data.redis包,使用

RedisTemplate编写业务代码;基于

youzan.framework.redis包,使用

RedisClient编写业务代码;不论使用以上那种方式,最终通过

JedisPool创建的

Jedis对象与缓存服务端代理层做请求交互。TMC对原生jedis包的

JedisPool和

Jedis类做了改造,在JedisPool初始化过程中集成TMC“热点发现”+“本地缓存”功能

Hermes-SDK包的初始化逻辑使

Jedis客户端与缓存服务端代理层交互时先与

Hermes-SDK交互,从而完成“热点探测”+“本地缓存”功能的透明接入。对于Java应用服务,只需使用特定版本的jedis-jar包,无需修改代码,即可接入TMC使用“热点发现”+“本地缓存”功能,做到了对应用系统的最小入侵。整体结构模块划分TMC本地缓存整体结构分为如下模块:Jedis-Client:Java应用与缓存服务端交互的直接入口,接口定义与原生Jedis-Client无异;Hermes-SDK:自研“热点发现+本地缓存”功能的SDK封装,Jedis-Client通过与它交互来集成相应能力;Hermes服务端集群:接收Hermes-SDK上报的缓存访问数据,进行热点探测,将热点key推送给Hermes-SDK做本地缓存;缓存集群:由代理层和存储层组成,为应用客户端提供统一的分布式缓存服务入口;基础组件:etcd集群、Apollo配置中心,为TMC提供“集群推送”和“统一配置”能力;基本流程1)key值获取Java应用调用

Jedis-Client

接口获取key的缓存值时,Jedis-Client

会询问

Hermes-SDK

该key当前是否是

热点key;对于

热点key

,直接从

Hermes-SDK

的热点模块获取热点key在本地缓存的value值,不去访问

缓存集群

,从而将访问请求前置在应用层;对于非

热点key

,Hermes-SDK

会通过

Callable回调

Jedis-Client

的原生接口,从

缓存集群

拿到value值;对于

Jedis-Client

的每次key值访问请求,Hermes-SDK

都会通过其通信模块将

key访问事件

异步上报给

Hermes服务端集群

,以便其根据上报数据进行“热点探测”;2)key值过期Java应用调用

Jedis-Client

set()

del()

expire()接口时会导致对应key值失效,Jedis-Client

会同步调用

Hermes-SDK

invalid()方法告知其“key值失效”事件;对于

热点key

,Hermes-SDK

的热点模块会先将key在本地缓存的value值失效,以达到本地数据强一致。同时通信模块会异步将“key值失效”事件通过

etcd集群

推送给Java应用集群中其他

Hermes-SDK

节点;其他

Hermes-SDK

节点的通信模块收到“key值失效”事件后,会调用热点模块将key在本地缓存的value值失效,以达到集群数据最终一致;3)热点发现Hermes服务端集群

不断收集

Hermes-SDK上报的

key访问事件,对不同业务应用集群的缓存访问数据进行周期性(3s一次)分析计算,以探测业务应用集群中的热点key列表;对于探测到的热点key列表,Hermes服务端集群

将其通过

etcd集群

推送给不同业务应用集群的

Hermes-SDK

通信模块,通知其对热点key列表进行本地缓存;4)配置读取Hermes-SDK

在启动及运行过程中,会从

Apollo配置中心

读取其关心的配置信息(如:启动关闭配置、黑白名单配置、etcd地址…);Hermes服务端集群

在启动及运行过程中,会从

Apollo配置中心

读取其关心的配置信息(如:业务应用列表、热点阈值配置、etcd地址…)稳定性TMC本地缓存稳定性表现在以下方面:数据上报异步化:Hermes-SDK

使用

rsyslog技术对“key访问事件”进行异步化上报,不会阻塞业务;通信模块线程隔离:Hermes-SDK

的通信模块使用独立线程池+有界队列,保证事件上报&监听的I/O操作与业务执行线程隔离,即使出现非预期性异常也不会影响基本业务功能;缓存管控:Hermes-SDK

的热点模块对本地缓存大小上限进行了管控,使其占用内存不超过64MB(LRU),杜绝JVM堆内存溢出的可能;一致性TMC本地缓存一致性表现在以下方面:Hermes-SDK

的热点模块仅缓存

热点key

数据,绝大多数非热点key数据由

缓存集群

存储;热点key

变更导致value失效时,Hermes-SDK

同步失效本地缓存,保证

本地强一致;热点key

变更导致value失效时,Hermes-SDK

通过

etcd集群

广播事件,异步失效业务应用集群中其他节点的本地缓存,保证

集群最终一致;热点发现整体流程TMC热点发现流程分为四步:数据收集:收集

Hermes-SDK

上报的key访问事件;热度滑窗:对App的每个Key,维护一个时间轮,记录基于当前时刻滑窗的访问热度;热度汇聚:对App的所有Key,以

的形式进行热度排序汇总;热点探测:对App,从热Key排序汇总结果中选出TopN的热点Key,推送给

Hermes-SDK;数据收集Hermes-SDK通过本地

rsyslog将

key访问事件以协议格式放入

kafka,Hermes服务端集群的每个节点消费kafka消息,实时获取

key访问事件。访问事件协议格式如下:appName:集群节点所属业务应用uniqueKey:业务应用key访问事件的keysendTime:业务应用key访问事件的发生时间weight:业务应用key访问事件的访问权值Hermes服务端集群节点将收集到的

key访问事件存储在本地内存中,内存数据结构为

Map<string,map<string,longadderstyle="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>,对应业务含义映射为

Map<appname,map<uniquekey,热度style="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>。热度滑窗时间滑窗Hermes服务端集群节点,对每个App的每个key,维护了一个

时间轮:时间轮中共10个

时间片,每个时间片记录当前key对应3秒时间周期的总访问次数;时间轮10个时间片的记录累加即表示当前key从当前时间向前30秒时间窗口内的总访问次数;映射任务Hermes服务端集群节点,对每个App每3秒生成一个

映射任务,交由节点内“缓存映射线程池”执行。映射任务内容如下:对当前App,从

Map<appname,map><appname,map<=""code="">中取出appName对应的Map

Map<uniquekey,热度style="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>;遍历

Map<uniquekey,热度style="margin:0px;padding:0px;max-width:100%;box-sizing:border-box!important;word-wrap:break-word!important;">>中的key,对每个key取出其热度存入其

时间轮

对应的时间片中;热度汇聚完成第二步“热度滑窗”后,映射任务继续对当前App进行“热度汇聚”工作:遍历App的key,将每个key的

时间轮

热度进行汇总(即30秒时间窗口内总热度)得到探测时刻

滑窗总热度;将

<key,滑窗总热度>

以排序集合的方式存入Redis存储服务中,即

热度汇聚结果;热点探测在前几步,每3秒

一次的

映射任务

执行,对每个App都会产生一份当前时刻的

热度汇聚结果Hermes服务端集群

中的“热点探测”节点,对每个App,只需周期性从其最近一份

热度汇聚结果

中取出达到热度阈值的TopN的key列表,即可得到本次探测的

热点key列表;TMC热点发现整体流程如下图:特性总结实时性Hermes-SDK

基于rsyslog+kafka实时上报

key访问事件。映射任务3秒一个周期完成“热度滑窗”+“热度汇聚”工作,当有

热点访问场景出现时最长3秒即可探测出对应

热点key。准确性key的热度汇聚结果由“基于时间轮实现的滑动窗口”汇聚得到,相对准确地反应当前及最近正在发生访问分布。扩展性Hermes服务端集群节点无状态,节点数可基于kafka的partition数量横向扩展。“热度滑窗”+“热度汇聚”过程基于App数量,在单节点内多线程扩展。实战效果快手商家某次商品营销活动有赞商家通过快手直播平台为某商品搞活动,造成该商品短时间内被集中访问产生访问热点,活动期间TMC记录的实际热点访问效果数据如下:某核心应用的缓存请求&命中率曲线图**上图蓝线为应用集群调用get()方法访问缓存次数上图绿线为获取缓存操作命中TMC本地缓存的次数上图为本地缓存命中率曲线图可以看出活动期间缓存请求量及本地缓存命中量均有明显增长,本地缓存命中率达到近80%(即应用集群中80%的缓存查询请求被TMC本地缓存拦截)。热点缓存对应用访问的加速效果**上图为应用接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论