热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅析TencentAnalytics腾讯网站分析系统的架构

ta(tencentanalytics,腾讯分析)是一款面向第三方站长的免费网站分析系统,在数据稳定性、及时性方面广受站长好评,其秒级的实时数据更新频率也获得业界的认可。本文将从

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

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

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

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

基本原理及系统架构

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

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

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日均需要处理几十万网站的上tb级数据,处理过后的url个数仍有上亿条,系统存储的key个数超过十亿。如何高效、低延迟地处理如此大量的业务数据是ta实时系统面临的主要挑战。ta解决方案的主要思路可以概括为数据全二进制化、计算全内存化、存储nosql化。下面就实时计算和实时存储这两大子系统进行深入的讨论。

实时计算

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

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

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

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

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

processor:负责具体业务逻辑的计算处理。

data holder:负责保存增量结果数据,以及计算依赖的中间状态数据。

emitter:负责定期输出清空增量计算结果。

具体到流程方面,分为以下三步(如图所示)。
2016129100519184.jpg (309×167)

接收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)。

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

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

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

redis protocol stack是一个较为完整的redis协议栈,是上层应用的基础。直接用redis协议作为对外提供查询的通用协议,这样外部用户可直接通过目前各种redis client实现来查询访问数据。query rule engine是一个灵活的查询引擎。能够根据规则智能地在多个redis、leveldb数据源中查询,执行类join的操作;也简单扩展支持其他的异构数据源,如mysql、hbase等。

query compute engine是一个实时查询计算引擎,能根据基础查询结果实时计算。引入此部分的主要目的在于减少redis数据空间占用。
未来展望

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






推荐阅读
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
手机用户2602915211
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有