微博高并发场景下的分布式缓存架构

千万级规模高性能、高并发的网络架构经验分享(以实际案例讲解) 架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又 要 藐 视 它。先举个例子感受一下千万级到底是什么数量级?现在很流行的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右, 假如每天有10个小时的服五时间,平均QPS只有30左右。对于一个后台服务器,单机的平均QPS可以到达800-1000,单独看写的业务量很简单 。为什么我们又不能说轻视它?第一,我们看它的 阅读详情

Memcached内存分配原理介绍

掌握Memcached的安装、使用命令,其实对大部分的同学来说已经足以开展相关开发工作了。但当碰到一些线上问题的时候,单纯的会用Memcached是无法快速、合理的分析问题所在的。所以接下来我们将介绍Memcached的内存分配管理原理。

Memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存。Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块, 以完全解决内存碎片问题。

在介绍memcached的内存分配原理之前,需要跟大家说明以下几个关键的名词的概念:

item

一个待存储的元素,按字节计算大小,可以理解为一个物品

Chunk

用于缓存item的内存空间。可以理解为一个储物格

Slab Class

特定大小的chunk的组。可以理解为储物格按大小进行分类,如80B作为一类,96B作为一类….

Page

分配给Slab class的内存空间,默认是1MB。分配给Slab之后根据slab class的大小切分成chunk。可以理解为一个page是一个固定大小的柜子,上面可以按slab class进行分割,一个柜子只能按一个slab class进行分割。柜子上的格子数为柜子大小/ 储物格的大小

介绍完上述的几个基本概念后,我们可以来看看mc在分配内存的时候是怎么处理的。

图1 memcached 初始化示意图

如图1为一个memcached示例在启动的时候,可以指定的一些参数,初始大小为slab class的起始大小,增长因子为下一个slab class是初始因子的倍数。如图中所示,初始大小为80B,增长因子为1.5。则mc在启动后,会按下图生成slab class表。

图2 slab分布图

完成初始后,当某一个请求到来的时候——如图中所示由一个123B大小的元素希望找到存储空间,memcached会通过slab class表找到最合适的slab class:比元素大的最少的那个,在图中场景下为180B,即使所需的空间只要123B。

此时Memcached示例并没有分配任何的空间给180B的slab进行管理。所以为了能让请求的元素能存储上,Memcached实例会分配1 个page给180这个slab(在默认情况下为1MB实际内存)。

图 3 page分配图

180B slab class在获取到1MB的空间后,会按照自己的大小对page进行分隔,也即1MB/180=5828个具体的存储空间(chunk)。此时,123B的请求就可以被存储起来了。

随着时间的慢慢推移,memcached的内存空间会逐步被分配完,如下图4所示:

图 4内存slab分配图

我们可以看到,memcached划分给每个slab的page数是不均等的,存在部分的slab是可能一个page都分配不到的。

假设所有的内存都分配完,同时每个slab内部的chunk也都分配完了。此时又来了一个新的元素123B,那么就会触发memcached的淘汰机制了。

memcached首先会查看180B的slab是否存在过期的元素,如果存在,则先清理部分,预留空位。如果180B这个slab的数据都比较热(没有过期),则按LRU进行淘汰。需要注意的是,淘汰是在slab内部进行的,也即在上面的场景中只有180Bslab内部进行淘汰剔除,对于其他的slab,是没有受到影响的。memcached也不会回收比较空余的其他slab的page。也即一个page被分配给某个slab后,他将一直被这个slab所占用,永远无法被mc回收,直到memcached重启。

这个特性被称为Memcached的钙化问题:Memcached在线上跑了一段时间后,内存按原始访问模式分配内存。当访问模式变更后,原有的分配模式可能导致缓存频繁出现数据剔除问题。最典型的场景即为内存尚有空余,但一直有数据被剔除,命中率一直上不去。对于这种情况,解决方法为重启缓存。

主从双层结构

高并发&高可用

主从双层结构

通过数据分片,将mc从单台实例增加到一组缓存后,我们可以解决单端口容量、访问量不足的问题,但是如果出现某一台缓存挂了的情况。请求依然会落到后端的DB上。可以通过一致性hash的方式,来减少损失。

但基于一致性哈希策略的分布式实现在微博业务场景下也存在一些问题:

(1)微博线上业务对缓存命中率要求高。某台缓存挂了,会导致缓存整体命中率下降(即使一致性hash会在一定时间后将数据重新种到另一个节点上),对于命中率要求在99%以上的Feed流核心业务场景来说,命中率的下降是难以接受的

(2)一致性hash存在请求漂移的情况,假设某一段时间服务因网络因素访问某个服务节点失败,则在这时候,会将数据的更新、获取都迁移到下一个节点上。后续网络恢复后,应用服务探测到服务节点可用,则继续从原服务节点中获取数据,这就导致了在故障期间所做的更新操作,对于原服务节点不可见了

目前我们对于这种单点问题主要是通过引入主从缓存结构来解决的。主从结构示意图如下图5所示:

图 5主从双层结构缓存

服务端在上行逻辑中,进行双写操作——由应用服务负责更新master、slave数据。

下行获取数据,先获取master数据,当master返回空,或者无法取到数据的时候,访问slave。

在这种模式下,为了避免两份数据带来的不一致问题,需要以master数据为准。即如果有更新数据操作,需要从master中获取数据,再对master进行cas更新。更新成功后,才更新slave。如果cas多次后都失败,则对master、slave进行delete操作,后续让请求穿透回种即可。

横向线性扩展

在双层结构下,我们可以很好的解决单点问题,即某一个节点如果crash了,请求可以被slave承接住,请求不会直接落在DB上。

但这种架构仍然存在一些问题:

(1)带宽问题。由于存在热点访问的情况,线上经常出现单个服务节点的带宽跑满的情况。

(2)请求量问题。随着业务的不断发展,并发请求数超过了单个节点的机器上限。数据分片、双层结构都不能解决这种问题。

上面的两个问题,其实总结起来是如何快速横向扩展系统的支撑能力。对于这个问题,我们的解决思路为增加数据的副本数。即让数据副本存在于多个节点中,从而平摊原本落在一个节点的请求。

从我们经验来看,对于线性扩展,可以在原来的master上引入一层L1层缓存。整体示意图如6所示:

图6采用L1的缓存架构

上行操作需要对L1进行多写。写缓存的顺序为master-slave-L1(所有),写失败则进行delete操作,后续由穿透请求进行回种。

L1可以由多组缓存组成,每组缓存相互独立。应用服务在获取数据的时候,先从L1中选取一组资源,然后再进行hash选取特定节点。对于multiget的场景也是先选取一组缓存,然后才对这组缓存进行multiget操作。如果L1获取不到数据,再依次获取master、slave数据。获取成功,则回种到L1中。

在采用L1的模式中,数据也是以master中数据为主的。即如果有更新数据的需要,需要从master中获取数据原本,再进行cas更新。如果cas更新成功,才同时更新slave、L1资源。如果对master的操作失败,则进行delete all操作,让后续请求穿透回种。

当线上流量、请求量达到一个水位的时候,我们会进行L1的扩容——增加一组、或几组L1缓存,从而提升系统整体的承载能力。此时系统的整体响应请求量是可以做到线性扩展的。

可以看到,双层结构下,slave作为主的备份存在。假设线上master缓存命中率为99%,则落在slave上的请求只有1%,并且这1%的请求都是很偏、很少人访问到的。可以想象,在这种情况下,如果master真的出现问题,请求全部落在slave上,slave也是没有任何数据可供访问的。Slave作为防单点措施是失败的。

引入L1后,slave过冷并没有被解决,同时,由于master被放置到L1之下,也遇到了slave的问题,master的数据也存在过冷的风险。为了解决上面的问题,我们在线上配置的时候,会将整组slave做为L1的一组资源进行配置,让slave以L1的身份承担部分的热请求。同时为了解决master过冷的问题,我们也会让应用服务在选择L1的时候有一定的概率落空,从而让master作为L1逻辑分组,去承担部分热请求。整体结构图如图7所示:

图7 slave、master同时作为L1架构

微博短视频百万级高可用、高并发架构如何设计 如何从架构上保证流量暴涨时整体平台的稳定性?如果只是简单地通过调整服务器规模解决,流量较小时过多的服务器冗余带来成本的浪费,流量暴涨时过少的服务器又令平台服务处于崩溃的边缘。 立即下载

相关推荐

微博短视频百万级高可用、高并发架构如何设计?

本文来自于51cto,文章设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案等内容。我们的业务场景主要是应对热门事件的流量暴涨,例如明星绯闻、爆炸性新闻等势必会让流量在短时间内急剧增长的事件。如何从架构上保证流量暴涨时整体平台的稳定性?如果只是简单地通过调整服务器规模解决,流量较小时过多的服务器冗余带来成本的浪费,流量暴涨时过少的服务器又令平台服务处于崩溃的边缘。比较特别的是,我们面临的问题与诸如“双十一”这种在某一确定时间段内流量的可预见式高并发有着本质的不同,我们面临的流量暴涨是不可预见的。因此通过哪些技术手段来妥善解决以上问题,将是接下探讨的重点。以上是基

微博并发这么牛逼!看他架构如何设计的?

????????关注后回复“进群”,拉你进程序员交流群????????1架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈自己的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上要重视它 ,战术上又要藐视它。先举个例子感受一下千万级到底是什么数量级?现在的优步(Uber),从媒体公布的信息看,它每天接单量平均在百万左右,假如每天有10个小时的服务时间,平均QPS只有30左右...

<sdffdsfsdfdfs>sfsfsfsdfsdffds</sdfsDS>Fsd 1251

最优控制理论 二+、哈密尔顿函数法的补充

本章基于变分法所推出的哈密尔顿函数法,2、讨论了积分方程约束的转化、控制+状态等式约束的一阶必要条件。3、控制分段连续、状态存在内点约束等情况下的角点条件,给出了协态变量和哈密尔顿函数在内点处不连续的表达式。...

MSysの优快云 9396

太卷了,京东、微信与微博最新缓存架构直接开源了。。。

大厂高并发缓存架构非常复杂,也是很多同学欠缺的可以写到简历里的亮点。说到缓存肯定绕不开Redis,这次我专门给大家梳理了京东,微信,微博这些大厂线上的缓存架构,大家可以看下下面这些缓存架构核心点问题:1.十万订单每秒热点数据架构如何优化2.Redis集群崩溃时如何保证秒杀系统高可用3.Redis主从切换导致库存同步异常以及超卖问题4.秒杀链路中Redis与MQ如何保证事务一致性5.线上M...

欢迎关注公众号:【码农突围】,回复9999,可以获取一份LeetCode刷题笔记 192

Cadence PCB SI仿真实战:如何手动添加VIA过孔模型提升板级链路精度

本文详细介绍了在Cadence PCB SI仿真中如何手动添加VIA过孔模型以提升DDR4/5设计的精度。通过参数化建模和三维全波建模技术,工程师可以有效解决高速设计中的信号完整性问题,显著降低仿真误差。文章还提供了实战案例和常见问题解决方案,帮助优化板级链路性能。

weixin_28683391的博客 410

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 271

新浪微博技术分享:微博实时直播答题的百万高并发架构实践

本文由“声网Agora”的RTC开发者社区整理。 1、概述 本文将分享新浪微博系统开发工程师陈浩在RTC 2018 实时互联网大会上的演讲。他分享了新浪微博直播互动答题架构设计的实战经验。其背后的百万高并发实时架构,值得借鉴并用于未来更多场景中。本文正文是对演讲内容的整理,请继续往下阅读。 另外,即时通讯网整理的直播答题相关文章有: 《近期大热的实时直...

weixin_34106122的博客 518

SAP 配额修改 + 修改记录写入实现

采购配额修改并写入修改记录 cdhdr 和 cdpos

GAVIN 1103

抖音微博等短视频千万级高可用、高并发架构如何设计?

点击上方"IT牧场",选择"设为星标"技术干货每日送达!本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。作者:刘志勇,本文来自新...

ITMuch的专栏 9636

JDK8升级JDK17过程中遇到的那些坑

JDK8虽然非常好,但是JDK版本已经发布到JDK20了,且JDK8后的版本升级了很多新的特性,如模块化、ZGC以及虚拟线程、结构性并发等,也是非常有吸引力的,所以决定将基于JDK8的项目升级到最近的LTS版本JDK17。

BASK2312的博客 6686

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 360

微博短视频千万级高可用、高并发架构如何设计?

作者:刘志勇,本文来自新浪微博视频平台资深架构师刘志勇在 LiveVideoStackCon 2018 讲师热身分享,并由 LiveVideoStack 整理而成。 本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。 今天与大家分享的是微博短视频业务的高并发架构,具体内容分为如下三个方面: 团队介绍 微博视频业务场景 ...

优快云云计算 1536

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程

本文为三相四线制整流器在中点电位不平衡时的Simulink仿真教程。首先分析中点电位漂移的电荷不平衡机理,提出零序电压注入控制策略。详细演示建模步骤:搭建三相四线制主电路,构建中点平衡控制算法(含MATLAB函数代码),实现控制信号叠加与PWM生成。通过对比仿真验证控制效果,并给出零序电压限幅、中性线电感影响等工程建议。该方案能有效抑制三相不平衡负载下的中点电位波动,保证系统稳定运行。

xiaoheshang_123的博客 51

千万级并发服务器架构_阿里架构师解析抖音微博等短视频千万级高可用、高并发架构设计...

本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。今天与大家分享的是微博短视频业务的高并发架构,具体内容分为如下三个方面(Java自学网【javazx.com】推荐):团队介绍微博视频业务场景“微博故事”业务场景架构设计团队介绍我们是隶属于微博研发部视频平台研发部门的技术团队。平台研发是微博的核心部门之一,包括大家熟知的微博视频在内的微博所有核心业务的基础平...

weixin_39933336的博客 720

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

本地缓存需要高时效性怎么办_抖音微博等短视频千万级高可用、高并发架构如何设计?...

本文从设计及服务可用性方面,详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。作者:刘志勇,本文来自新浪微博视频平台资深架构师刘志勇在 LiveVideoStackCon 2018 讲师热身分享,并由 LiveVideoStack 整理而成。今天与大家分享的是微博短视频业务的高并发架构,具体内容分为如下三个方面:团队介绍微博视频业务场景“微博故事”业务场景架构设计团队介绍我们...

weixin_42484477的博客 418

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

. NET5实战千万高并发项目,性能吊打JAVA,C#排名万年老五,有望逆袭!

“秒杀活动”“抢红包”“微博热搜”“12306抢票”“共享单车拉新”等都是高并发的典型业务场景,那么如何解决这些业务场景背后的难点问题呢?秒杀系统中,QPS达到10万/s时,如何定位并解...

dotNET跨平台 1869

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

大型分布式系统中,缓存就该这么玩!

大家好,我是不才陈某~今天来聊聊缓存到底该怎么用以及企业案例,目录如下:1. 缓存是什么1.1存储宕机的致命代价2015年5月28号,携程网站和APP全面瘫痪持续12小时,数据库被物理删除的消息在朋友圈风传。按上季度财报估算,此次宕机直接影响携程营收大约1200w美元,携程股价也大跌11%。这还只是发生在互联网刚刚普及的2015年。如果发生在现在。。。据公司公告是由于员工操作失误导致。虽然这不在我...

码猿技术专栏 305
上一篇: 知乎服务化的实践与思考
下一篇: 只有程序员才能看懂的16张高端漫画
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值