2017年8月5日,七牛云大数据高级工程师党合萱在“Gopher 杭州 meetup”进行《基于Go的大数据平台》演讲分享。IT 大咖说(微信id:itdakashuo)做为独家视频合做方,经主办方和讲者审阅受权发布。

阅读字数:2610 | 7分钟阅读程序员

嘉宾演讲视频及PPT回顾: suo.im/1h4oJc

摘要

大数据一直是咱们在谈论的话题,无论你数据到底有多大?党合萱将给你们带来全新的大数据处理思路。golang

什么是Pandora

Pandora是七牛大数据团队及整个系列产品的代号,咱们的目标是提供简单、开放、高效的一站式大数据平台。数据库

系统设计分析与架构

构建系统的挑战

在最开始作这个系统的时候,咱们先梳理一下有可能会遇到的问题。一个好的系统不只要解决当下的问题,更要考虑到将来可预期时间里业务上或者数据规模上可能面临的一些挑战。缓存

上图中左边的三点是咱们在业务上须要考虑的点,右边的三点则是咱们从具体实现和架构上去考虑的地方。微信

能够看到最核心的地方在于系统须要具有高吞吐、低延迟的能力。网络

如上图所示,在这个系统当中,最核心的部分是红色和蓝色的框图部分。蓝色部分主要是负责从消息队列中拉取数据出来,而后通过红色master模块进行任务分配和调度,把拉出来的数据导入到下游的各个业务模块中去。架构

最右边的绿色模块是咱们的监控系统,这个监控系统从最上层的业务指标、链路性能,以及机器的健康情况均可以作收集和监控。而黄色框图部分则是对业务和监控指标作可视化的展现。并发

图中的最顶部是咱们提供给用户的一个可视化的界面,用户能够在这个界面中进行一些鼠标式的拖拽来建立一个工做流。这个工做流的导出部分体如今导出系统中就是作数据的拉取、处理和推送的工做。运维

多种上下游适配

业务架构

咱们从kafka里面拉取数据,将数据进行必定的处理以后推送到下游的各个不一样的系统中去,因为下游系统各不相同,因此在这个过程当中咱们要考虑一下这几种下游系统在哪些方面有着异同。分布式

导出模型

导出模型有两种,一种是最基本的通用导出模型。接到任务以后要从上游取数据,通过处理或者过滤后把这个数据推送到下面去。

另外一种是云存储导出模型,它在通用导出模型中新增了两步,即把拉取到的文件存放在本地,而后进行一些压缩,上传到云存储。这样能够有效地减小文件个数,同时减小云存储空间的使用,而且可以下降用户的成本。

高吞吐/低延迟问题探究

这个问题解决起来是比较困难的,尤为是在数据量较大的时候,高吞吐和低延迟各自都有一些困难的点。根据咱们的实践经验来看,吞吐量方面遇到最大的问题就是资源的利用率不够高,或者上下游系统吞吐能力不一致,存在短板效应。

低延迟问题在不少的状况下实际上是对服务稳定性要求,所以咱们要注意规避服务热点。

除了这些以外,若是不能及时发现上下游系统间的负载变化也会致使某一环节被打爆。而越是复杂的系统,问题也就越容易在某个不经意的环节出现。

数据预取

Export server在向下游推数据的时候会预先从上游拉数据回来,由此保证网络最大的利用率,同时也减小了等待时间,提高导出效率。

预取时若是无数据可取,则休眠1s再取数据,既然?(后续还)没有数据则休眠时间加倍,一直到32s为止,过程当中若是取到数据,则休眠时间重置为1s,该机制有效减小了对底层存储的请求数量。

数据推送协议优化

咱们优化了export service与logdb之间的数据推送协议。最开始使用的是Json,可是它的序列化和反序列化的性能较差,下游系统中CPU的使用率很是高,影响服务的总体性能。

通过调研以后咱们将Json格式换成了Protobuf。经观察发现带宽消耗减小了近一半,吞吐量提高了,CPU的资源消耗也下降了一半以上。

资源优化使用

kodo导出为了达到节省存储空间的目的,在导出前的converter这一步使用了parquet压缩,能够有8比1的压缩比。效果很好,但缺点也一样明显。

缺陷就在于消耗大量CPU影响服务,只有在文件较大的状况下才有更好的压缩比。咱们对它作了一些优化,控制并发,优化压缩过程的内存使用,并精确控制CPU使用。

高可用与水平扩展

master/server架构

master/server间采用golang rpc通讯。server上报心跳证实本身存活,并汇报所执行任务的状况。master向server周期性下发任务,server管理自身任务决定哪些要执行哪些要丢弃。

master高可用

master自身无状态,身份信息注册在zookeeper。master failover时主备自动切换。主master丢锁会自杀,备master抢锁成为主master。

server高可用

server注册自身,防止单机重复运行。server注册每个任务,防止任务被重复执行。server高可用,节点故障时任务会被调度到其余正常节点。

水平扩展

资源不足时加入新的机器做为新server,新server从zk上获取master身份信息,并上报心跳给master。其余任务被调度至新server。

自动化运维

系统热点自动感知与调整

一方面利用日志对服务作审计、趋势预测,宏观上离线式的预知一段时间内的热点所在。另外一方面依靠服务自身的状态反馈实时微调,修正宏观预测结果。

线上系统现状

每日处理超过千亿数据点、百TB级别的数据量。线上导出延迟在1分钟之内,较少的人工介入。秒级扩容,实时的可视化监控系统,易用的报警系统,自动生成线上日报。

Go的应用

咱们用Golang作了些什么

流式计算、离线计算、日志检索、时序数据库等一整套服务的核心代码都使用Golang开发。

简单、高效、的数据接入工具logkit,除了pandora以外能够接入多种数据库、kafka、机器metric信息等等。以及全套监控工具。

为何选择Golang

Golang易上手,入门快。下降程序员的心智负担,能够集中精力在业务上。更简单高效的并发模型自然的支持分布式服务的编写,有丰富的库可供咱们调用。七牛是国内第一批在go语言方面进行实践的公司,公司内部基于golang的rpc、缓存系统等都已经打磨的很成熟。

今天的分享就到这里,谢谢你们!