亿级流量系统架构之如何支撑百亿级数据的存储与计算转载石杉的架构笔记伪全栈的java工程师

“本文聊一下笔者几年前所带的团队负责的多个项目中的其中一个,用这个项目来聊聊一个亿级流量系统架构演进的过程。

一、背景引入

首先简单介绍一下项目背景,公司对合作商家提供一个付费级产品,这个商业产品背后涉及到数百人的研发团队协作开发,包括各种业务系统来提供很多强大的业务功能,同时在整个平台中包含了一个至关重要的核心数据产品,这个数据产品的定位是全方位支持用户的业务经营和快速决策。

至于选择这个商家数据平台项目来聊架构演进过程,是因为这个平台基本跟业务耦合度较低,不像我们负责过的C端类的电商平台以及其他业务类平台有那么重的业务在里面,文章可以专注阐述技术架构的演进,不需要牵扯太多的业务细节。

此外,这个平台项目在笔者带的团队负责过的众多项目中,相对算比较简单的,但是前后又涉及到各种架构的演进过程,因此很适合通过文字的形式来展现出来。

二、商家数据平台的业务流程

下面几点,是这个数据产品最核心的业务流程:

每天从用户使用的大量业务系统中实时的采集过来各种业务数据

接着存储在自己的数据中心里

然后实时的运算大量的几百行~上千行的SQL来生成各种数据报表

最后就可以提供这些数据报表给用户来分析。

基本上用户在业务系统使用过程中,只要数据一有变动,立马就反馈到各种数据报表中,用户立马就可以看到数据报表中的各种变化,进而快速的指导自己的决策和管理。

整个过程,大家看看下面的图就明白了。

三、从0到1的过程中上线的最low版本

看着上面那张图好像非常的简单,是不是?

看整个过程,似乎数据平台只要想个办法把业务系统的数据采集过来,接着放在MySQL的各种表里,直接咔嚓一下运行100多个几百行的大SQL,然后SQL运行结果再写到另外一些MySQL的表里作为报表数据,接着用户直接点击报表页面查询MySQL里的报表数据,就可以了!

其实任何一个系统从0到1的过程,都是比较low的,刚开始为了快速开发出来这个数据平台,还真的就是用了这种架构来开发,大家看下面的图。

其实在刚开始业务量很小,请求量很小,数据量很小的时候,上面那种架构也没啥问题,还挺简单的。

我们直接基于自己研发的数据库binlog采集中间件(这个是另外一套复杂系统了,不在本文讨论的范围里,以后有机会可以聊聊),感知各个业务系统的数据库中的数据变更,毫秒级同步到数据平台自己的MySQL库里;

接着数据平台里做一些定时调度任务,每隔几秒钟就运行上百个复杂大SQL,计算各种报表的数据并将结果存储到MySQL库中;

最后用户只要对报表刷新一下,立马就可以从MySQL库里查到最新的报表数据。

基本上在无任何技术挑战的前提下,这套简易架构运行的会很顺畅,效果很好。然而,事情往往不是我们想的那么简单的,因为大家都知道国内那些互联网巨头公司最大的优势和资源之一,就是有丰富以及海量的C端用户以及B端的合作商家。

对C端用户,任何一个互联网巨头推出一个新的C端产品,很可能迅速就是上亿用户量;

对B端商家,任何一个互联网巨头如果打B端市场,凭借巨大的影响力以及合作资源,很可能迅速就可以聚拢数十万,乃至上百万的付费B端用户。

因此,很不幸,接下来的一两年内,这套系统将要面临业务的高速增长带来的巨大技术挑战和压力。

四、海量数据存储和计算的技术挑战

其实跟很多大型系统遇到的第一个技术挑战一样,这套系统遇到的第一个大问题,就是海量数据的存储。

你一个系统刚开始上线也许就几十个商家用,接着随着你们产品的销售持续大力推广,可能几个月内就会聚拢起来十万级别的用户。

这些用户每天都会大量的使用你提供的产品,进而每天都会产生大量的数据,大家可以想象一下,在数十万规模的商家用户使用场景下,每天你新增的数据量大概会是几千万条数据,记住,这可是每天新增的数据!这将会给上面你看到的那个很low的架构带来巨大的压力。

如果你在负责上面那套系统,结果慢慢的发现,每天都要涌入MySQL几千万条数据,这种现象是令人感到崩溃的,因为你的MySQL中的单表数据量会迅速膨胀,很快就会达到单表几亿条数据,甚至是数十亿条数据,然后你对那些怪兽一样的大表运行几百行乃至上千行的SQL?其中包含了N层嵌套查询以及N个各种多表连接?

我跟你打赌,如果你愿意试一下,你会发现你的数据平台系统直接卡死,因为一个大SQL可能都要几个小时才能跑完。然后MySQL的cpu负载压力直接100%,弄不好就把MySQL数据库服务器给搞宕机了。

所以这就是第一个技术挑战,数据量越来越大,SQL跑的越来越慢,MySQL服务器压力越来越大。

我们当时而言,已经看到了业务的快速增长,因此绝对要先业务一步来重构系统架构,不能让上述情况发生,第一次架构重构,势在必行!

五、离线计算与实时计算的拆分

其实在几年前我们做这个项目的时候,大数据技术已经在国内开始运用的不错了,而且尤其在一些大型互联网公司内,我们基本上都运用大数据技术支撑过很多生产环境的项目了,在大数据这块技术的经验积累,也是足够的。

针对这个数据产品的需求,我们完全可以做到,将昨天以及昨天以前的数据都放在大数据存储中,进行离线存储和离线计算,然后只有今天的数据是实时的采集的。

因此在这种技术挑战下,第一次架构重构的核心要义,就是将离线计算与实时计算进行拆分。

大家看上面那张图,新的架构之下,分为了离线与实时两条计算链路。

一条是离线计算链路:每天凌晨,我们将业务系统MySQL库中的昨天以前的数据,作为离线数据导入Hadoop HDFS中进行离线存储,然后凌晨就基于Hive / Spark对离线存储中的数据进行离线计算。

即使是每天凌晨耗费几个小时将昨天以前的数据完成计算,这个也没事,因为凌晨一般是没人看这个数据的,所以主要在人家早上8点上班以前,完成数据计算就可以了。

另外一条是实时计算链路:每天零点过后,当天最新的数据变更,全部还是走之前的老路子,秒级同步业务库的数据到数据平台存储中,接着就是数据平台系统定时运行大量的SQL进行计算。同时在每天零点的时候,还会从数据平台的存储中清理掉昨天的数据,仅仅保留当天一天的数据而已。

实时计算链路最大的改变,就是仅仅在数据平台的本地存储中保留当天一天的数据而已,这样就大幅度降低了要放在MySQL中的数据量了。

举个例子:比如一天就几千万条数据放在MySQL里,那么单表数据量被维持在了千万的级别上,此时如果对SQL对应索引以及优化到极致之后,勉强还是可以在几十秒内完成所有报表的计算。

六、持续增长的数据量和计算压力

但是如果仅仅只是做到上面的架构,还是只能暂时性的缓解系统架构的压力,因为业务还在加速狂飙,继续增长。

你老是期望单日的数据量在千万级别,怎么可能?业务是不会给你这个机会的。很快就可以预见到单日数据量将会达到几亿,甚至十亿的级别。

如果一旦单日数据量达到了数十亿的级别,单表数据量上亿,你再怎么优化SQL性能,有无法保证100多个几百行的复杂SQL可以快速的运行完毕了。

到时候又会回到最初的问题,SQL计算过慢会导致数据平台核心系统卡死,甚至给MySQL服务器过大压力,CPU 100%负载后宕机。

而且此外还有另外一个问题,那就是单个MySQL数据库服务器的存储容量是有限的,如果一旦单日数据量达到甚至超过了单台MySQL数据库服务器的存储极限,那么此时也会导致单台MySQL数据库无法容纳所有的数据了,这也是一个很大的问题!

第二次架构重构,势在必行!

七、大数据领域的实时计算技术的缺陷

在几年前做这个项目的背景下,当时可供选择的大数据领域的实时计算技术,主要还是Storm,算是比较成熟的一个技术,另外就是Spark生态里的Spark Streaming。当时可没有什么现在较火的Flink、Druid等技术。

在仔细调研了一番过后发现,根本没有任何一个大数据领域的实时计算技术可以支撑这个需求。

因为Storm是不支持SQL的,而且即使勉强你让他支持了,他的SQL支持也会很弱,完全不可能运行几百行甚至上千行的复杂SQL在这种流式计算引擎上的执行。

Spark Streaming也是同理,当时功能还是比较弱小的,虽然可以支持简单SQL的执行,但是完全无法支持这种复杂SQL的精准运算。

因此很不幸的是,在当时的技术背景下,遇到的这个实时数据运算的痛点,没有任何开源的技术是可以解决的。必须得自己根据业务的具体场景,从0开始定制开发自己的一套数据平台系统架构。

八、分库分表解决数据扩容问题

首先我们要先解决第一个痛点,就是一旦单台数据库服务器无法存储下当日的数据,该怎么办?

第一个首选的方案当然就是分库分表了。我们需要将一个库拆分为多库,不用的库放在不同的数据库服务器上,同时每个库里放多张表。

采用这套分库分表架构之后,可以做到每个数据库服务器放一部分的数据,而且随着数据量日益增长,可以不断地增加更多的数据库服务器来容纳更多的数据,做到按需扩容。

同时,每个库里单表分为多表,这样可以保证单表数据量不会太大,控制单表的数据量在几百万的量级,基本上性能优化到极致的SQL语句跑起来效率还是不错的,秒级出结果是可以做到的。

同样,给大家来一张图,大家直观的感受一下:

九、读写分离降低数据库服务器的负载

此时分库分表之后,又面临着另外一个问题,就是现在如果对每个数据库服务器又是写入又是读取的话,会导致数据库服务器的CPU负载和IO负载非常的高!

为什么这么说呢?因为在此时写数据库的每秒并发已经达到几千了,同时还频繁的运行那种超大SQL来查询数据,数据库服务器的CPU运算会极其的繁忙。

因此我们将MySQL做了读写分离的部署,每个主数据库服务器都挂了多个从数据库服务器,写只能写入主库,查可以从从库来查。

大家一起来看看下面这张图:

十、自研的滑动窗口动态计算引擎

但是光是做到这一点还是不够的,因为其实在生产环境发现,哪怕单表数据量限制在了几百万的级别,你运行几百个几百行复杂SQL,也要几十秒甚至几分钟的时间,这个时效性对付费级的产品已经有点无法接受,产品提出的极致性能要求是,秒级!

因此对上述系统架构,我们再次做了架构的优化,在数据平台中嵌入了自己纯自研的滑动窗口计算引擎,核心思想如下:

接着数据平台中的核心计算引擎,不再是每隔几十秒就运行大量SQL对当天所有的数据全部计算一遍了,而是对一个接一个的滑动时间窗口,根据窗口标签提取出那个窗口内的数据进行计算,计算的仅仅是最近一个滑动时间窗口内的数据

接着对这个滑动时间窗口内的数据,可能最多就千条左右吧,运行所有的复杂SQL计算出这个滑动时间窗口内的报表数据,然后将这个窗口数据计算出的结果,与之前计算出来的其他窗口内的计算结果进行合并,最后放入MySQL中的报表内

通过这套滑动窗口的计算引擎,我们直接将系统计算性能提升了几十倍,基本上每个滑动窗口的数据只要几秒钟就可以完成全部报表的计算,相当于一下子把最终呈现给用户的实时数据的时效性提升到了几秒钟,而不是几十秒。

同样,大家看看下面的图。

十一、离线计算链路的性能优化

实时计算链路的性能问题通过自研滑动窗口计算引擎来解决了,但是离线计算链路此时又出现了性能问题。。。

因为每天凌晨从业务库中离线导入的是历史全量数据,接着需要在凌晨针对百亿量级的全量数据,运行很多复杂的上千行复杂SQL来进行运算,当数据量达到百亿之后,这个过程耗时很长,有时候要从凌晨一直计算到上午。

关键问题就在于,离线计算链路,每天都是导入全量数据来进行计算,这就很坑了。

之所以这么做,是因为从业务库同步数据时,每天都涉及到数据的更新操作,而hadoop里的数据是没法跟业务库那样来进行更新的,因此最开始都是每天导入全量历史数据,作为一个最新快照来进行全量计算。

在这里,我们对离线计算链路进行了优化,主要就是全量计算转增量计算:每天数据在导入hadoop之后,都会针对数据的业务时间戳来分析和提取出来每天变更过的增量数据,将这些增量数据放入独立的增量数据表中。

同时需要根据具体的业务需求,自动分析数据计算的基础血缘关系,有可能增量数据需要与部分全量数据混合才能完成计算,此时可能会提取部分全量历史数据,合并完成计算。计算完成之后,将计算结果与历史计算结果进行合并。

在完成这个全量计算转增量计算的过程之后,离线计算链路在凌晨基本上百亿级别的数据量,只要对昨天的增量数据花费一两个小时完成计算之后,就可以完成离线计算的全部任务,性能相较于全量计算提升至少十倍以上。

十二、阶段性总结

在这套架构对应的早期业务背景下,每天新增数据大概是亿级左右,但是分库分表之后,单表数据量在百万级别,单台数据库服务器的高峰期写入压力在2000/s,查询压力在100/s,数据库集群承载的总高峰写入压力在1万/s,查询压力在500/s,有需要还可以随时扩容更多的数据库服务器,承载更多的数据量,更高的写入并发与查询并发。

而且,因为做了读写分离,因此每个数据库服务器的CPU负载和IO负载都不会在高峰期打满,避免数据库服务器的负载过高。

同时这套引擎自行管理着计算的状态与日志,如果出现某个窗口的计算失败、系统宕机、计算超时,等各种异常的情况,这个套引擎可以自动重试与恢复。

此外,昨天以前的海量数据都是走Hadoop与Spark生态的离线存储与计算。经过性能优化之后,每天凌晨花费一两个小时,算好昨天以前所有的数据即可。

最后实时与离线的计算结果在同一个MySQL数据库中融合,此时用户如果对业务系统做出操作,实时数据报表在几秒后就会刷新,如果要看昨天以前的数据可以随时选择时间范围查看即可,暂时性是满足了业务的需求。

早期的几个月里,日增上亿数据,离线与实时两条链路中的整体数据量级达到了百亿级别,无论是存储扩容,还是高效计算,这套架构基本是撑住了。

十三、下一阶段的展望

这个大型系统架构演进实践是一个系列的文章,将会包含很多篇文章,因为一个大型的系统架构演进的过程,会持续很长时间,做出很多次的架构升级与重构,不断的解决日益增长的技术挑战,最终完美的抗住海量数据、高并发、高性能、高可用等场景。

下一篇文章会说说下一步是如何将数据平台系统重构为一套高可用高容错的分布式系统架构的,来解决单点故障、单系统CPU负载过高、自动故障转移、自动数据容错等相关的问题。包括之后还会有多篇文章涉及到我们自研的更加复杂的支撑高并发、高可用、高性能、海量数据的平台架构。

如果大家去看看Java 8里的LongAdder的源码,他的分段加锁的优化,也是如此的麻烦,要做段迁移。

第二,我在那篇文章里反复强调了一下,不要对号入座,因为实际的电商库存超卖问题,有很多其他的技术手段,我们就用的是其他的方案,不是这个方案,以后有机会给大家专门讲如何解决电商库存超卖问题。

THE END
0.Pre如何创建斜架滑斜架滑道作为工业设计与船舶工程中的关键结构,其设计精度直接影响设备运行的稳定性与安全性。本文将从斜架滑道的基础原理出发,结合软件操作与工程实践,系统阐述其创建方法。 一、斜架滑道的工程定义与分类 斜架滑道是一种通过倾斜轨道实现设备或船舶纵向/横向移动的机械结构,其核心功能是将水平位移转化为可控的斜向运动jvzquC41i0vdqwqkpg4dqv3ep1~03B=513?95?>820nuou
1.「楼梯间」也可以落地企业文化?30+案例教你怎么做!知行晓政*左右滑动查看图片 02 ✦ 打造楼梯间“互动平台” 除了提前绘制好与企业文化相关的涂鸦,还可以打造一个楼梯间的“互动平台”,可以在这里交流意见,可以在墙面上肆意涂鸦。 通过这种开放自由的互动方式让原本的楼梯间耶鲜活生动起来。 三七互娱在楼梯间打造「三言七句转转墙」,员工可以在转动与当天相符合的三言七句,jvzquC41yy}/uqfpi{kykwjk0ipo8ftvkimg8<499>987mvon
2.跨平台开发怎么选?从性能实测到生态适配,ReactNative与Flutter全后来抽时间用Flutter重写了核心页面,不仅滑动帧率稳定在60帧,动画效果也更流畅,但又遇到了新问题——某些原生SDK(比如特定厂商的支付接口)没有成熟的Flutter插件,只能自己封装原生桥接代码,花了不少功夫。 React Native和Flutter作为当下最主流的两大跨平台框架,各有各的优势和坑点。很多开发者纠结于“选哪个”:有人说jvzquC41dnuh0ryrwd4og}48;;<1:@61xkkxuyfeg/9229>::1
3.→🌈2025·未来新章·荣耀体验💫入口💎官网🌿平台当用户每一次点击修正、拖拽关联、滑动调整的行为都被转化为算法进化的养分,我们看到的不仅是技术指标的提升,更是人机智能融合的全新可能。随着脑机接口、增强现实等下一代交互技术的成熟,实体识别算法或将进入"行为即训练"的实时演化时代,而把握这种交互与算法的共振节奏,将成为企业在智能浪潮中突围的关键。 展开 jvzq<84o0w~sl{qh0et0ijrg13724:>3:a?::95997e44<;20jznn
4.数学建模常用模型算法范文为了培养学生丰富的数学算法思想,为他们的想法提供了实践平台,在高校的《数学软件》课程教学中应该考虑利用多种有效的教学手段,开启学生的算法设计与构造模型的思维和技巧,鼓励他们大胆创新,促进学生对于一种或几种数学软件的偏好,达到提高教学质量的目的,为新时代的发展培养技术型人才。jvzquC41yy}/i€~qq0ipo8mcqyko1;;963;/j}rn
5.OrangeUI2.广告图片轮播功能,并且是可以跟随手指滑动切换,这是目前别的控件还做不到的。 3.列表ListView支持直接设置图片的URL,通过底层的多线程下载功能,可以轻松实现异步加载图片,并且不会感觉到卡顿。 4.列表框ListView自带下拉刷新、下拉加载的功能,在手机上加载2w条数据只需2秒。 jvzq<84yyy4ptjsigwo/ew4rtqjve}3rjr
6.滑动验证页面访问验证 别离开,为了更好的访问体验,请滑动滑块进行验证,通过后即可继续访问网页 请按住滑块,拖动到最右边jvzquC41yy}/q{fpigieu7hqo1
7.数学教学中如何运用信息技术国家中小学智慧教育平台(免费,百度直接搜)有个“分层作业”板块:基础层(巩固课本知识)、提高层(拓展解题方法)、挑战层(奥数难度)。我让基础弱的学生做基础层,中等生做提高层,尖子生挑战层,还能下载课件和微课,学生说:“不会的题看视频就能懂,不用总麻烦老师了。” jvzquC41yy}/srszwg9777hqo1lbppkc16979B;0jvsm
8.油田工作总结一、积极做好组织发动,认真构建活动平台 为保证“精细化管理”活动的扎实有效开展,结合我厂实际,召开了动员大会,成立了以主要领导为组长的领导小组和活动办公室,组织活动专班对本厂的管理现状进行了剖析,根据油田下达的精细化管理指标,制定了实施方案,并以文件形式进行了下达,将各项指标分解到责任部门和单位,落实到具体jvzq<84yyy4rwwqw0ipo8lqpi€vq86;76890qyon
9.Garena怎么注册Garena账号便捷获取攻略巨好玩平台入口:https://feixiazai.18183.com/transfer/trans-download/670?p=3 第二步:通过上一步链接即可跳转至代充页面,随后在搜索栏中搜索“Garena”。 第三步:确认你要充值的内容后点进去。 第四步:进入充值页面,在充值前,请玩家向下滑动充值页面,仔细阅读充值说明,根据自己的需要,选择充值方式。 jvzquC41yy}/3A6:50ipo8lqpirvg87245671=<5;5650qyon
10.椿萱茂创新研发养老信息化平台,让健康智慧化椿萱茂创新研发养老信息化平台,让健康智慧化 “福如东海,寿比南山”——这是中国人对于幸福长寿的诗意表达。但当下越来越多的人,对于“长寿”,不仅关注生命长度,更关注生命质量。也因此,“健康寿命”的概念越来越深入人心。 系列健康监测——指尖滑动,一切尽在掌握jvzquC41yy}/ezs0eqs/ew4o1ep0exsvgpz04973/3704B4eqpzfp}d:97=73;3jvo
11.DHDSS7016DSmart7016平台系列产品是我司自主研发的新一代软硬及智能一体化平台产品,基于“All-In-One”理念,全新的平台架构,产品集主控,转发,存储,智能,管理等功能于一身,具有建设成本低、部署运维简易、组合扩展灵活、性能强悍及安全稳定高可靠等特点,是构建基层治理解决方案的核心产品。 jvzquC41uvkwgw6432463|tng0ipo8hqorgo{wjyufkucrqa44=16>9580nuo
12.向上而生,追梦而遇,沐光而行他指出,上海医药作为国有医药企业,在当今充分竞争、完全开放的市场环境下,通过创新发展,做到了业务基础稳定、创新成果丰富、人才队伍强大,迎来了发展的黄金时期。希望新员工们能够在上海医药这个平台上充分施展才华,实现自身价值与企业发展的高效统一,向上而生,奋斗致远!jvzquC41v071lzpc0eun0ls1rkj`4>6:38=847xjvor
13.详解APIGateway流控实现,揭开ROMA平台高性能秒级流控的技术细节​​摘要:ROMA 平台的核心系统 ROMA Connect 源自华为流程 IT 的集成平台,在华为内部有超过 15 年的企业业务集成经验。 本文分享自华为云社区《ROMA集成关键技术(1)-API流控技术详解》,作者:中间件小哥 。 1、概述 ROMA 平台的核心系统 ROMAConnect 源自华为流程 IT 的集成平台,在华为内部有超过 15 年的企业jvzquC41zkk/kwkqs0io1jwvkerf1Ahf8;8dhB8:7g>7e>=e95=7hm
14.《纸片马里奥》全收集攻略奇诺比奥+宝物+隐藏砖位置在穿过山洞时,用锤子敲击喷气口上方的石锥,落下来可以堵住喷气口,从而让右侧通过喷气上下移动的平台到达更高的位置,从而获得墙壁凹室中的上限提升爱心+10。 嘿呵的嘿!嘿呵问答攻略 【赛跑问答】和【温泉问答】都是很简单的谜题,没有什么需要特别说明的地方。 jvzquC41yy}/ijrgtuqz0lto1jgofktqm181495913919=53a3680|mvon
15.面经总结(大数据开发相关)大数据面经本文深入探讨了大数据平台中Spark和Flink在实时处理领域的应用,分析了它们在容错、性能优化、资源调度等方面的策略。Spark通过内存计算和checkpoint机制实现高效处理,而Flink则凭借其流处理能力应对低延迟需求。文章还提到了数据倾斜、数据质量、容错性和扩展性等挑战,以及如何通过设置参数、优化计算逻辑和调整系统架构来应对这jvzquC41dnuh0lxfp0tfv8vsa5?4297;31gsvrhng1jfvjnnu1727;<3:2;