腾讯分析系统架构解析

TA(Tencent Analytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从实时数据处理、数据存储等多个方面带你深入探寻TA的系统架构及实现原理。

网站分析(Web Analytics)主要指的是基于网站的用户浏览行为,对网站的点击流数据和运营数据进行分析,以监控网站的运营状况,为网站的优化提供决策依据。网站分析系统已成为站长日常运营必不可少的工具,业界比较流行的网站分析系统主要有Google Analytics、CNZZ和百度统计等产品。

TA作为网站分析产品的后起之秀在社区分析、用户画像、网站工具等多方面形成了自己的特色,其秒级的实时数据更新频率更是业界翘楚。在数据稳定性、准确性和及时性方面,TA在站长圈也是享有良好的口碑。随着接入业务量的不断发展,TA日均需要处理和计算的数据量达到TB级。如此庞大的数据量想要达到秒级实时且保证系统的高可用并非件易事。

TA的实时计算框架借鉴了一些业界流行的流式计算系统的思路。虽然在构建系统中遇到了一些问题,但由于海量数据的实时处理、实时存储具备一定的典型性与通用性,所以将TA的解决方案分享出来,希望能给大家一些启示。

基本原理及系统架构

TA的基本原理是通过嵌入站长网站的JavaScript脚本收集用户访问行为数据,并发送TA采集集群,采集集群收到数据后将其过滤、编码、格式化后继续向后分发。数据处理集群负责按照业务逻辑计算数据,并将计算结果“写入”到数据存储集群,最后将结果数据展现给广大站长使用。TA的基本原理如图所示。

TA后台是一套完整的数据流处理系统:由JavaScript采集的用户行为数据像川流不息的河水一样流入TA后台,经过清洗、计算后源源不断地流出到TA存储集群,供用户浏览和查询。TA的具体架构及核心部件如图所示。

TA的后台分为离线和实时两部分:实时部分负责系统的主要功能计算,数据更新频率为秒级;离线部分负责系统复杂的关联分析及跨天计算,数据更新频率为天级。

  • Http Access:主要负责HTTP协议的解析,数据的清洗及格式化。
  • ESC:Event Streaming Coder,主要负责将系统不可枚举的数据类型编码成为整型,并将对应关系持久化。
  • ESP:Event Streaming Processor,主要负责将数据按照站点、UID重新组织并计算PV、UV、停留时长和蹦失率等网站分析指标。
  • ESA:Event Streaming Aggregator,主要负责汇总ESP计算后的数据按照站点,并写入到Redis。
  • Center:系统的中心节点,负责系统配置、数据路由管理,并承担容灾切换功能。
  • Logserver:负责将Access收集到的数据以字符串形式写入文件,并上传到TDCP上。
  • TDCP:腾讯分布式计算平台,负责离线数据的计算,并由脚本将结果数据写入MySQL中。

实时解决方案

在介绍TA实时解决方案前,我们先来了解下TA支撑的业务量。当前TA日均需要处理几十万网站的上TB级数据,处理过后的URL个数仍有上亿条,系统存储的key个数超过十亿。如何高效、低延迟地处理如此大量的业务数据是TA实时系统面临的主要挑战。TA解决方案的主要思路可以概括为数据全二进制化、计算全内存化、存储NoSQL化。下面就实时计算和实时存储这两大子系统进行深入的讨论。

实时计算

对于计算子系统,我们参考了Hadoop、S4和Storm等开源项目,力图设计为一个较为通用,扩展性较强的全内存实时Event处理系统(或者套用流行的术语称为流式实时Event处理系统)。对于这样的一个系统,我们设计支持的典型输入输出流程大致如图所示。

实时计算系统的设计要点在数据组织、协议和增量计算模型上。

数据组织。万物皆int,考虑到内存以及计算过程的性能需求,我们将所有非int的数据类型转化为int。可以枚举的数据类型,将其配置化映射为唯一int;不可枚举的数据类型,则利用MD5算法近似得到唯一的int。例如,页面URL属于不可枚举的类型,则预处理通过MD5算法近似得到唯一的int;UserAgent里的浏览器类型字符串则属于可枚举的数据,则预先配置化映射为int。这个方法节省了较多内存,提高了整个系统的计算性能。

协议。协议层面上,我们首先设计实现了一种可扩展的Event结构,这种Event结构支持半自动化的序列化/反序列化机制(参考自msgpack的设计)和紧凑的二进制编码(基于Zigzag编码,参考Protobuf的实现)。这种Event结构在流式高性能I/O(网络传输和持久化)方面表现得相当良好。实时计算子系统被设计为可以扩展支持任意的Event实现。

增量计算模型。增量计算模型,指的是基本计算过程,被定义为以下三部分(如图所示)

  • Processor:负责具体业务逻辑的计算处理。
  • Data Holder:负责保存增量结果数据,以及计算依赖的中间状态数据。
  • Emitter:负责定期输出清空增量计算结果。

具体到流程方面,分为以下三步(如图所示)。

  • 接收Event,计算处理—Processor。
  • 保存计算结果以及计算依赖中间数据—DataHolder。
  • 定时触发输出时间片内计算结果,清空计算结果—Emitter。

增量计算模型弱化了分布式系统中单台机器的事务状态,相应地简化了分布式计算系统的实现,同时也提高了整个系统的性能。

实时存储

在TA系统中,实时存储的数据都是需要通过Web展示层读取的统计数据。这类数据存在两个典型特点。

  • 频繁更新写。更新频度视系统实时性而定,每条统计结果更新频度最快可以达到1秒。
  • 少量读取。“少量”是相对上述更新而言的。同时根据业务逻辑,可将统计数据划分为两类。
  • 固定不变数据:主要是URL、搜索关键词等数据。这一部分数据理论上是在不停地增加,不会修改旧有数据。
  • 动态数据:主要是频繁更新的结果统计数据。这一部分数据则需要不停地更新。例如,www.qq.com域名下的PV和UV统计结果。

考虑到上述的TA实时统计数据的特点,我们选择NoSQL实现我们的存储系统;同时,针对两类不同的数据类型,分别选用LevelDB和Redis来存储。

Redis

TA实时存储的主要构件。考虑到TA系统本身就是一个比较完善的分布式集群系统,因此我们需要的存储构件是“not clustering, but sharding”。也就是说像HBase和MongoDB这样的“重武器”并不适合TA,而NoSQL数据库中的“瑞士军刀”Redis凭借其出色的性能走入我们的视野。同
时TA的结果数据类型也比较丰富,有像站点PV、UV、VV和IP等Hash类型的数据,也有像用户访问轨迹这样set类型的“动态数据”,而Redis丰富的数据结构很好地完成了这项任务。

选择Redis的另一个原因是它足够简单且易于扩展。在实际应用的过程中,我们发现的问题都可以通过扩展Redis命令来解决。

例如,TA中有这样的一种应用场景:为了消除ESA模块的状态,存储在Redis中的数据往往并不是最终的结果数据,而是还需要进一步运算的中间数据。像bounce rate这个指标(bouncerate=bounce session数/total session数),需要前台查询两次再做一次运算后最终展示给用户。在高并发的情况下,无疑会影响系统的响应速度。

本着“移动计算,而不是移动数据”的原则,我们对Redis的sort、hmget命令进行了扩展使其支持四则运算,成功地将原来的两次查询优化为一次。扩展四则运算的另外一个目的是可以“通过计算换取存储”,例如需要将两种类型加总成总和的类型数据,可以只存储两份,加总数据“通过计算换取”。

除了数据读取,数据的写入也可以进行类似合并数据的优化。例如,TA在写入URL的PV、UV、VV、IP、停留时长和bounce rate这6个指标时,需要调用6次Redis命令。而实际上这6个指标是存储在同一个Hash内的,通过扩展hmincrby命令,支持将Hash的所有field一次更改,便能将调用次数优化至一次。上线之后也取得了良好的效果,峰值时的CPU利用率几乎下降了一半,同时也大幅提升了上层模块ESA的吞吐量。

LevelDB

它是Redis的有效补充。考虑到Redis为内存数据库,而使用内存的成本要高于硬盘,因此选择引入了基于磁盘存储的LevelDB作为补充。由于LevelDB的写性能足够好,而读性能也远远超过目前“在线少量读取”的需求,所以我们选择LevelDB存储“固定不变数据”。

在数据存储的架构设计上,由于实时数据服务与在线系统,可靠性要求较高,因此我们主要采取双写复制+Sharding的设计方法。

双写复制。所有的数据存储都会至少同步写两份,以提高在线系统服务的可用性。

数据分片(Sharding)。

基于域名:所有的数据以域名为单位组织分片;任何域名可以调整到任意分片中;单个域名数据原则上存储在一个分片中。

动态调整(如图所示):只调整分片策略,不移动数据;基于数据量计算分片负载。

此外,针对分片集群数据的查询,我们主要做了三项工作(如图所示)。

  • Redis Protocol Stack是一个较为完整的Redis协议栈,是上层应用的基础。直接用Redis协议作为对外提供查询的通用协议,这样外部用户可直接通过目前各种Redis Client实现来查询访问数据。Query Rule Engine是一个灵活的查询引擎。能够根据规则智能地在多个Redis、LevelDB数据源中查询,执行类join的操作;也简单扩展支持其他的异构数据源,如MySQL、HBase等。
  • Query Compute Engine是一个实时查询计算引擎,能根据基础查询结果实时计算。引入此部分的主要目的在于减少Redis数据空间占用。

未来展望

目前TA虽然在后台上已经做到数据秒级更新,但展示方式仍为传统的静态方式。后续TA会在数据的动态刷新上进行更多尝试,让站长可以第一时间了解网站营销效果,时刻感受网站心跳。

时间: 2024-07-28 22:06:36

腾讯分析系统架构解析的相关文章

日志收集分析系统架构

日志收集分析系统架构   一.部署架构 日志收集系统一般包括如图所示三层.Web服务器层,日志收集层,日志存储层.Web服务器层是日志的来源,一般部署web应用供用户访问,产生日志,该节点上一般需要部署日志收集程序的agent.日志收集层手机web服务器产生的日志传输给日志存储层,存储层一般使用分布式文件系统HDFS,日志可以存储在hdfs上或者hbase上. 以scribe作为日志收集系统架构,scribe分为scribe agent和scribe server 以kafka作为日志收集系统架

B2C电子商务基础系统架构解析(转载)

系统的开发与演化,前台严格follow消费者的购买流程,后台则盯牢订单流转,牢牢抓住这两条主线,才能高屋建瓴的看清B2C的逻辑链和数据流,更深刻的规划功能模块,从而更有效支撑实际业务的流转. 前台 前台系统包括:商品展示,内容展示,订单确认,支付系统,用户中心四大模块. 一,商品展示 按照Ebay的内部分类,任何将商品以单个或批量的方式展示给消费者的功能均应归入此系统.因此,该系统至少包括: A,站内搜索(搜索提示,搜索规则,搜索成功页,搜索不成功页,相似推荐) B,导航(频道导航,其他导航如销

基于AWS的web日志分析系统架构

AWS提供的服务和基础设施能够在云环境中建设可靠,容错和高可用的Web应用程序.在生产环境中,这些应用产生大量的日志信息.这些数据是任何公司运营web应用程序的重要知识来源,分析日志可以揭示信息,如交通模式,用户行为,市场资料等. 然而,作为Web应用程序的增长和的访问者数量的增加,存储和分析网络日志变得越来越具有挑战性.下图展示了如何使用AWS构建一个可扩展且可靠的大规模日志分析平台.该架构的核心组件是AmazonElastic MapReduce,  这是一个使分析师能够经济方便地进行大数据

nginx源码分析:架构解析

nginx启动流程: 根据上面的手稿得知,nginx在循环中调用ngx_process_events_and_timers该函数来处理事件,在该函数中,最主要的一个操作是调用了ngx_process_events函数,该函数是一个宏定义,然后我再工程里面搜一下ngx_event_actions,结果如下: ngx_event_action在每一个多路复用后端中被分别赋值. 在ngx_event_accept函数中,没接收到一个新的连接,就会建立一个ngx_connection对象,并将ngx_r

iOS vs Android 系统架构

iOS是基于UNIX内核,Android是基于Linux内核,iOS和android作为两款优秀的手机操作系统,他们有共性有区别. iOS的系统架构 分为四个层次: 核心操作系统层(Core OS layer) 核心服务层(Core Services layer) 媒体层(Media layer) 可触摸层(Cocoa Touch layer) 如下如所示: iOS系统架构解析: 1.Core OS是位于iOS系统架构最下面的一层是核心操作系统层,它包括内存管理.文件系统.电源管理以及一些其他的

系统架构设计师2009-2018历年综合知识、案例分析、论文真题及答案详细解析

https://blog.csdn.net/xxlllq/article/details/85049295 ??系统架构设计师复习资料当您看了这篇文章有何疑问,可先看最后的评论,有可能您遇到的问题其他人已经提出我已回复. 2018/12/14查询成绩后知道自己通过了系统架构设计师的考试(每科满分75,及格45分),特地记录一下.最终的成绩如下: 我是在9月份决定报名参加系统架构设计师考试,主要是想借此机会督促自己学习些除工作外的知识.准备了2个月,复习时间为周末,复习方式为看教学视频和真题练习.

秒杀系统架构分析与实战

0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有: 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动,

秒杀系统架构分析与实战(参考、转载)

目录[-] 0 系列目录 1 秒杀业务分析 2 秒杀技术挑战 3 秒杀架构原则 4 秒杀架构设计 4.1 前端层设计 4.2 站点层设计 4.3 服务层设计 4.4 数据库设计 4.4.1 基本概念 4.4.2 设计思路 5 大并发带来的挑战 5.1 请求接口的合理设计 5.2 高并发的挑战:一定要“快” 5.3 重启与过载保护 6 作弊的手段:进攻与防守 6.1 同一个账号,一次性发出多个请求 6.2 多个账号,一次性发送多个请求 6.3 多个账号,不同IP发送不同请求 7 高并发下的数据安全

【转载】秒杀系统架构分析与实战

本文转载自:http://my.oschina.net/xianggao/blog/524943 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4)一般是定时上架:(5)时间短.瞬时并发量高: 2 秒杀技术挑战 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是100