【APMCon 2016】阿里云数据库产品专家萧少聪:Greenplum实现100亿监控数据的秒级分析

如需转载请联系听云College团队成员小尹 邮箱:yinhy#tingyun.com

中国应用性能管理行业盛宴——2016中国应用性能管理大会(简称APMCon 2016)于8月18日至19日在北京新云南皇冠假日酒店隆重召开。APMCon由听云、极客邦和InfoQ联合主办的作为国内APM领域最具影响力的技术大会,首次举办的APMCon以“驱动应用架构优化与创新”为主题,致力于推动APM在国内的成长与发展。

阿里云数据库产品专家萧少聪于基于云架构的性能优化专场发表了题为《Greenplum实现100亿监控数据的秒级分析》的演讲,现场解读了如何通过阿里云ApsaraDB最新的Greenplum数据仓库引擎实现100亿监控数据的秒级分析,并以实际案例讲解Greenplum中包括PostGIS、MADlib及OSS存储整合可以为数据监控行业带来的功能及性能提升。

以下为演讲实录:

1.jpg

萧少聪:大家好!今天其实是个很凑巧的时间,上个月在阿里我们开始做Greenplum产品的发布,正好在开这个会之前也碰到了包括我们集团自己以及其他一些用户谈到,我们有很多很多的监控数据怎样进行快速的分析?以往在互联网上面很多时候我们用到的是MySQL,但在做海量分析时很困难,第一服务器资源有限,第二整个计算或者做分析的时候有很多问题。今天想要跟大家分享一下,在Greenplum如何把百亿级的监控数据分析压缩到秒级的,包括也会谈到Greenplum除了做这种分析以外,现在移动端、互联网端越来越多,我们的分析往往不单是服务器的性能,甚至我们在手机端的某些业务或者手机端的某些软件里面,一些应用的数据分析都可以在Greenplum里面去做。

2.jpg

这是我今天介绍的五个话题。包括Greenplum产品的介绍或者说现在Greenplum已经开源了,不是说你一定要用云计算或者阿里云才能用Greenplum,大家感兴趣的在线下也可以下载Greenplum,在自己的公司里面直接使用,甚至说这个是免费的,因为它是Apache的开源项目,所以你也可以自己做很多定制。

3.jpg

我们首先看一下Greenplum现在的发展情况。Greenplum是一个基于PostgreSQL的开源数据库,如果你打开它的内码会发现有很多PostgreSQL的影子,实际上我们也一直在中国做PostgreSQL的推动,所以Greenplum也是其中的一部分。当中有几个时间点,从2015年10月份就已经开源了,大家有兴趣可以到GitHub上看到Greenplum这个项目。

4.jpg

我自己做了一下统计,截止到8月14号整个Greenplum项目非常活跃,当前已经Fork出432个版本,commit次数也很多,半年多一点的时间有28607次commit,做了很多的修正和修改,而且有90位代码贡献者提交过代码一起做维护。阿里云这边我们是从7月11号开始正式对外公测,如果大家有兴趣也可以在阿里的官网上面去看,可以申请公测资格,一直到10月底左右都是免费的公测期,当然资源有限我们也会审查一下是否适合大家的应用。

5.jpg

接下来我们谈一下一百亿级的监控数据怎么在Greenplum上面一步一步压缩到秒级?首先我们看下为什么会出现一百亿这么多的监控数据?大家可以算一下,其实一百亿的监控数据真不多,如果我们有700多台服务器或者一些应用,每一个应用收集的指标有25个,如果每分钟收集一次,实际上一年的数据就已经达到百亿了,这种设备量或者这种应用的级别,其实不是一个特别庞大的量。

传统在做的时候我们经常会通过一些分库分表,把所有的数据打散到数据库里面进行查询、写入分析就可以了。最通常的做法,我们的应用或者服务器会有一个ID,我们会做一个取模,把不同取模结果放到不同的地方。通过这个方法切分完数据,我们得到的结果数据可能会不平均,为什么?因为很有可能某一片区域或者说刚好某一个取模的结果里面数据量大,其他的结果量低。所以会造成一个情况,虽然我们的数据已经在后端打散成好多好多数据分片,但是有些分片的数据量很大,它的热度很高,有些分片相对来说热度比较低。当进行数据统计或者分析的时候你会发现,有一部分用户的性能很慢,有一部分用户的性能OK,可以在几秒钟或者更短的时间输出结果。这时候会造成很多应用或者用户的体验下降,这就是我们通常会看到的一些情况。

6.jpg

我们通过Greenplum怎么做呢?首先这是Greenplum的结构图,我们可以看到Greenplum的做法是把数据非常平均的分布在所有的服务器中,而且当服务器数量不够或者计算能力不够的时候,可以横向做扩展,会重新做一个二次分片,也就是重新把所有的数据打散。从这个图上可以看到用户的SQL从上面传过来,然后用户的数据可以通过分布式的形式快速入库打散到各个系统里面。

7.jpg

这里我截取了一个Greenplum的建表语句,我们首先来看,既然要把数据打散,第一步就是怎样打散?这里面有一个CREATE TABLE,跟我们普通SQL的CREATE TABLE有点不一样,会有一个DISTRIBUTED BY column或者RANDOMLY的语句。如果用RANDOMLY则是完全随机分布的,数据是100%打散到每一个子计算节点上,每一个计算节点上面可能都有相同数量级别的数据,因为是随机全部打散的,绝对不会出现某一台节点数据量变大另外数据量变小的情况,所以比较适合做一些全打散的情况。但是前面还有一个BY column,为什么会有这样的值?我们做一些分析的时候,有时候并不单只是在一个Table里面查数据,有时会跨好几个Table。如果有两个Table,每台机器都会有这个Table,但是这两个Table之间需要做JOIN,如果是用全打散的这种模型每一次查询很可能都要进行全局扫描,就是每台服务器都要扫描到。但如果要按照查询条件特别是按照JOIN条件进行少量表格的抽取,我们可以怎么做?我们就可以用column。这里面要注意一点,如果应用当中某几个表之间需要用JOIN的操作,可以把JOIN的列写在column这个位置去做性能上面的优化,这样数据会打散到每一台机器,同时当需要做JOIN的时候会定位到你JOIN的列或者数值相对应的几台服务器,去提取更少的数据,而不需要全表或者全局进行扫描,由此降低整个搜索的范围,提高性能。

我们自己做的一些测试结果,如果是普通做的百亿数据分片的表格,在Greenplum先做了这段操作,性能上面差不多会有二三十倍的提升。所以你可以理解成在这种情况下,一个10分钟才能做完的查询,到这里可能会变成一分钟或者30秒左右。

8.jpg

除此之外在Greenplum上面我们允许行列混合的方式,部分数据以行的方式存储,部分数据以列的方式存储。为什么这么做?行存储的好处是如果需要查询某一条记录,它的性能相对来说比较快。哪些情况我们需要查某条记录,往往是我们最近两周或者最近一个月的数据。但是更长的数据我们通常做的是统计,比如说针对某一个列,比如在做监控时经常要知道整个系统里面CPU的平均值,就会把所有CPU的列全部进行一次统计。如果所有这些CPU的信息都放在一个行表,你会发现需要对每一个行表进行全表扫描,哪怕是内存、IO或者网络这些我用不到的数据,但是也需要查询一遍才能进行最终的统计。而如果把这个Table变成列存储,完全不需要管内存、IO等等,我要查的是CPU就把CPU的值整列拿出来进行计算就可以了。因此如果Table监控的量越大,监控的column本身越多,分析过程中把行存变成列存以后,性能就得到了很大的提升,基本上可以理解成如果有25个column,行存变成列存性能大概会快了25倍。所以在存储的时候可以对历史分析的数据变成列存提高性能。

这些技术其实很简单,我们不停的进行数据的拆分以及用各种各样不同的技术,每一个技术可能快个10倍或者几倍,加起来就会发现原来几十分钟的操作最后慢慢慢慢变成十几秒、几秒甚至毫秒。

9.jpg

在这里面大家可以看到,在Greenplum的语法上面会有一些存储的参数,如果大家选择APPENDONLY会把行表变成列表进行保存。

10.jpg

刚才我们JOIN查询的问题解决了,如果要统计某一列,要做一些SUM或AVJ的统计,可以通过列存储来解决。那如果我们SQL的SELECT后面带了很多WHERE条件,希望这些WHERE条件可以定位到某一个小的分区进行操作,Greenplum提供了一个PARTITION功能。通常在做查询的时候会有一个应用ID或者服务器ID,查询某一台服务器的历史,或者以往整个性能的曲线图,或者它的一些汇总信息。在有WHERE条件的情况下,可以针对条件进行分区,跟传统的数据库里面做PARTITION是类似的。

11.jpg

我们可以看到上图中PARTITION BY的一段语句。这里的PARTITION实际上可以做很多级别的划分,往往我们怎么去定义呢?通常第一层的PARTITION就是放入最常用的WHERE条件,比如查询条件有服务器ID或者应用ID,那么服务器ID或应用ID就会放到第一层,然后可能基于这个ID再查时间,那么时间就是第二层,如果有更深度的需求还可以扩展下面的层次。最终的结果当有WHERE条件进行查询的时候,我们不需要进行全局扫描,而直接把数据框到一个最小的位置上。

你会发现所有刚才看到的图片,或者说这些结构说明整合下来也就是一个CREATE语句,在Greenplum里面只要你有足够的服务器就可以把这个结构做完,把它的数据进行完整的分片。但是大家不要误解说用Greenplum一定要有很多很多的服务器才能达到一个性能的提升。实际上除了最开始的PARTITION,因为后面还有一个列存,我们自己实际测试的结果,同等两台或者同等四台的一个SSD的服务器所能达到的性能相比原来在MySQL上做数据分片达到的性能已经差不多有近百倍的提升。如果大家有兴趣可以关注阿里云后面的发布,应该在这个月底之前会拿出来Greenplum完整的性能测试报告,大家就可以看到整个性能的情况。

把数据量从亿级压缩到秒级的方法刚才讲到了。除此之外我们在业界会开始面对很多移动互联网,或者说移动业务的信息。比如,我们的监控未来不单只是在我们的服务器或者IDC中心,很有可能会深入到手机上,可能在你的应用软件上除了你会使用这个软件功能以外,你在什么地方点了什么样的广告,我们经常说到的一种情况就是我今天在机场看到了某一个广告,然后我用手机拍下来某一个照片,这里面会有一个定位,这个过程当中你在后续是不是完成了一次注册的过程,注册的过程是在车上完成的还是回到酒店完成的,最终会记录下来不同的信息,你可以分析用户个人的行为,产生其他有用的价值。所以在Greenplum上面我们会有PostGIS,可以通过SQL的方式直接分析我们的数据。

12.jpg

我们看上面这个图,最简单的情况,可能有一个需求希望从这个点周边画一个多大的区域,然后分析当中住宅、公园、商场、地铁各种不同的情况下App使用的频率,那只要App上面有GIS信息就可以进行分析。如果放到数据库怎么做?可能大家会想得很复杂,但是不需要,在PostGIS里面有非常强的SQL函数能力。

13.jpg

就像刚才说的在某一区域里面我想知道两个区域交界在哪个地方,通过这个SQL语句就可以找到。然后可以把它加入到另外一个查询上面,跟业务数据的定位配合在一起,就会知道A这个App的人群跟B这个App的人群在某一个区域里面是重叠的,可以找到很多相关的信息。同时我们在矩形上同样也可以进行这种发现,基于这样的操作就可以非常方便的达到我们查询业务的效果,这就是我们提到的PostGIS。

另外,在分析的过程中如果大家真的要做很深入的数据或者数学模型的分析,你可能需要用到很多的学习或者数学函数,我们也可以看一下在Greenplum上面有哪些函数可以使用。

14.jpg

举个例子,如果我们在做监控信息的时候需要求一些方差,比如我要求总体方差的信息,实际上在Greenplum上面通过一个var-pop就可以做,大家可以看一下这两个值,这个方差很简单肯定是2。如果说我后面再加一个1000的话,整个方差的计算就会得到一个数学模型。还有另外一种求样本方差,这一块我就不展开说了,因为这里面只是数学的计算模型而已。

实际上在Greenplum里可以找到非常多这样的数学逻辑函数,也就是说你不需要把你的业务数据提取到你的应用程序,通过你的应用算法重新再写一遍开发,然后再去进行分析。这些数据你直接在数据库里面就可以进行分析,再加上刚才提到的Greenplum在做分库、分表,或者数据平衡切分的性能,优化过程中你就可以非常好的实时计算到你的曲线图,甚至一些性能监控的信息。

这里面还提到了一个包括我们说的计算相关性。这些东西看上去都很枯燥,给大家讲一个比较好玩的例子。如果你手头上已经有一些股票样本,这是不是跟我们性能监控的CPU波动图有点类似,有的时候我们会说我已经有过去六个月内存的使用情况,我要去发现一定的规律推算一下后面六个月可能会发生什么事情,以往你是怎么做的?把这个数据拿回来,让你的数学专家重新写一个程序,重新计算。但现在这种操作你也可以在数据库上面通过SQL直接做。这里我只是把模型展现出来,最终可以算出这样的一条线,我们自己玩了一下还算可以,差距不算太大。如果大家有兴趣把这个信息看得非常非常深入,大家可以再看一下这个网页,上面包括完整的语法以及可能会牵扯到使用某些函数,这里面会有非常详细的解说。我们自己用的话通常是做一些系统性能对后面的六个月,或者说一年的性能推演。因为在云计算里面,可能会有这样的情况,我不知道我未来要买多少台服务器,我也不能就简单乘一个系数,我昨天买了100台,下个月买200台就OK,精算的过程中我们需要做很多操作,所以有了这种模型之后我们可以做更多自己定制化的业务。

除此之外我们还可以进行聚类的分析。可能在系统里面已经有很多数据,我们希望把这些数据按照业务或者按照不同的逻辑进行业务分类,这时候也可以用这里的K-means函数,它有什么好处?我们可以在SQL里面进行直接的分析,得到的信息是什么?得到的信息是在一个已有的存量数据里面可以发现一些倾向性,例如我现在系统里面有100万个应用,这100万个应用每一个应用上面都已经有大概25个性能的表象,然后我希望把这25个性能的表象分成7类或者8类,或者分成10类,我直接就可以在SQL上面进行分类的操作,分类操作结束之后可以看到每一个类型的表象参数或者倾向性,最终可以通过这样的一些数据表象,去反推说可能某一类型的应用,哪一些应用可以进行重新的归类。以前我们的归类是怎么做的?例如说这是A行业的应用,另外是B行业的应用,会通过这种归类。但是在K-means以后,你往往可以发现某一类应用它的CPU、内存和IO的使用值倾向于某一种特性,未来你可以针对这样的特性把它剥离出来,让我们的应用或者业务部门对这些应用进行重新的分析定位,甚至把它重新列入到其他的集群,或者说对它进行一些特殊的硬件配置更新,去优化我们整个系统的性能。所以在这个过程中,我们也可以非常方便的进行使用。

15.jpg

最后我们会发现一点,刚才有提到的一点是Greenplum现在的业务模型里面,在搭建Greenplum数据库的时候,我们会推荐用SSD的硬盘去搭建,因为它本身的分析处理能力很强,而且可以打散到每一台系统上面进行横向可扩充分析能力的处理。但是问题在于,如果你需要购买20台、30台,甚至50台、上百台的Greenplum服务器,而且每台服务器都是用SSD的硬盘进行数据存储,你的性能确实会很高,但是你的成本也有很大的压力。在阿里这边我们做了一件事情,如果是阿里云的云系统我们会提供一个Greenplum到OSS的数据流动功能,我们来看一下实际上Greenplum在阿里的整个体系中我们希望接入到什么样的业务场景。

在传统的企业上面可能是这样使用数据库的,首先会有一个应用程序,会有一个Oracle或者其他一些关系型的数据库,当进行数据分析的时候无法在在线业务系统上进行分析,因为分析会进行全库的扫描,对系统的压力很大。往往我们会通过ETL抽取的工具,把数据通过数据建模放到数据仓库,然后通过一个专门的BI软件进行分析,这是我们传统的环境。

现在在阿里云里面我们会有一系列基于PostgreSQL的系统去打通整个运行的过程,如果原来用户是Oracle,我们会提供跟Oracle兼容的数据库。同时如果用户需要数据分析,就像我刚才说的,我现在有上百亿的数据,我不太可能在在线系统上面查询分析,我就需要抽取到OLAP的分析系统,这时候我们会提供Greenplum。中间也会提供一种近乎透明的数据运作,以前可能是ETL,ETL软件需要做很多的逻辑处理,把数据转存到数据仓库,现在我们是前端的数据只要写进来,就会自动的流入到Greenplum上面,让数据先到Greenplum,然后在Greenplum里面再做一个分布式的建模,让系统性能更快。

最后解决的问题就是Greenplum的成本很高,我们用的都是SSD的硬盘。以往我们的数据都是怎么做的?我会有一些热数据,就是在线的数据。然后历史的数据可能会做归档,如果只能存三个月的数据,那三个月以后的数据可能会放到归档系统里,当我需要这些数据的时候再把数据读出来,先要把它load到生产系统才能进行查询。而现在我们会做一件事情,Greenplum可以把这些数据当成一个文件直接写到非常低廉的OSS存储上面。这个可能会差两到三倍的存储费用,但好处是什么?存到OSS的数据并不代表是一个冷数据,当需要进行查询的时候,只需要把OSS上面的一个数据文件当成一张Table,就可以直接查询了,实实在在都是在线的,随时可以查询,不需要先把OSS的数据load进来再去做操作。当然通过这个方式,因为存储的位置是在OSS不是SSD的硬盘,查询的性能可能会降低,但是免去了把某一大批量的归档数据先导库再做查询的风险和麻烦。

通过这种方法,如果Greenplum设计一个百TB级别的库,你去存几个PB,十几个PB,甚至百PB都是有可能的。而且存下来以后你随时可以按照你的需求通过SQL直接查询这上面的数据,所以我们打通了这几块东西,让SQL更简单,让存储也可以变成PB。在传统的业务下如果光单纯搭建Greenplum的话,性价比有可能比较低,因为你的性能确实很好,但是你能存的数据量有限,因为你的硬件成本很高,这个时候可以通过这个方式去做。

如果大家用的不是阿里云上,其实Greenplum也非常方便,要做这件事也很简单。因为Greenplum整个的接口非常开放,通过跟OSS相同的开源接口,你也可以开发一个你想要存储文件的地方。比如我不是用阿里云,不是在OSS上面,我是自己搭建的一个文件系统,同样也可以通过Greenplum把这些文件或者说数据存到你的系统。所以不管在云上还是云下,这件事情都可以去做。

今天给大家做了一个分享,反过来我们可以再看下Greenplum业务模型上面的一些重要点。

  • 首先第一点,当我们有很大的业务数据需要进行分析的时候,完全可以通过开源的数据库模型进行数据的拆分,让它达到一个非常好的业务性能。拆分过程中,第一个就是你要不要进行JOIN,如果你的表经常需要进行JOIN,你应该要设置一些 DISTRIBUTED BY column的值。如果不需要,完全就是单表查询的话,你可以把你的整个Table进行完全的打散。

  • 第二,我们可以对一些经常要做汇总分析的Table,把它用APPENDONLY的语法变成列存,它的性能会提高很多。如果有很多必须要填写的WHERE条件,可以通过PARTITION针对WHERE条件查询的方式把这个条件加入进来。所以不管是汇总条件,还是JOIN条件,还是WHERE后面的查询条件都可以在CREATE TABLE的时候进行性能的提升。

  • 如果未来大家针对移动信息进行分析的时候,在Greenplum上面可以用PostGIS,我相信未来一两年移动端的业务分析也将会是大家面临的非常重要的信息数据。

  • 因为时间非常有限,MADlib我只说了一点,其实MADlib当中差不多有上百个模型,如果大家需要做一些智能分析、业务分析就可以详细参考里面的内容。

今天我分享的内容就到此结束,谢谢!

APMCon2016 演讲PPT合集下载

链接: http://pan.baidu.com/s/1mhFwaZQ 密码: bezk


想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

关于作者

APMCon2016

驱动应用架构优化与创新

我要评论

评论请先登录,或注册