楼主: admin_kefu
2617 1

[经济类] 2017年中国数据分析师行业峰会:数据库与技术实战_分会场(十) [推广有奖]

客服管理员

泰斗

35%

还不是VIP/贵宾

-

TA的文库  其他...

管理文库

威望
3
论坛币
29361653 个
通用积分
12947.8867
学术水平
545 点
热心指数
662 点
信用等级
522 点
经验
111456 点
帖子
3202
精华
13
在线时间
32828 小时
注册时间
2010-6-2
最后登录
2024-4-23

初级信用勋章 中级信用勋章 初级热心勋章 初级学术勋章 中级学术勋章 中级热心勋章

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

2017年中国数据分析师行业峰会:数据库与技术实战_分会场(十)  



第四届中国数据分析师行业峰会

主题:数据库与技术实战

时间:2017年7月29日(下午)

地点:中国大饭店



    内容:



    韩锋:大家下午好,欢迎来到数据库与技术实战的专场,首先我代表主办方对大家的到来表示欢迎!也对有道云笔记对我们提供全场的速记表示感谢!


    下午我们安排了7个专题,时间比较紧,专题内容比较多,我们不安排问答环节了。三场后我们有一个短暂的休息时间,下半场开始我们会搞一个小的活动。今天下午我们有请了业内多位资深的专家,带来对数据库的经验和见解,首先有请来自哪儿网的资深DBA蒲聪,有请。



    蒲聪:大家好我是去哪儿网资深DBA,今天讲一下“分布式数据库原理和架构设计”。先后6年时间在艺龙、百度都进行过数据库的MySQL和HBase运维管理,现在在去哪儿网也有PB级别的数据量了。


    言归正传,分四点讲一下分布式数据库。第一,背景,数据库是如何诞生的。第二,面对大数据过去我们怎么处理,现在怎么处理,未来趋势怎么样。第三,去哪儿调研的开源分布式数据库TiDB。第四,说说TiDB在去哪儿网适用的场景和去哪儿网未来的规划。


MS@3`4(H9SP13@GEH[VK7.png


    第一,分布式数据库的诞生。


    数据库是爆炸式增长的,我刚入行的时候,2011年在百度500G磁盘就很大了。到了去哪儿之后开始有了TB,爆炸式的增长。2020年PB对我们来说已经不是一个陌生的字眼了,我们遇到了这么多难题该如何克服?所以就诞生了各种各样的理论。


    关系型数据库解决了业界大部分的问题,后来一段时间NoSQL数据库兴起了,关系级数据库本身是没法扩展的。随之而来,随着谷歌入门的开放,亚马逊入门的开放,接着Spanner、CockroachDB这些出来了,一些高效访问的会用OnceanBase里,有一段时间讨论关系型数据库是不是可以消失了。


    最近流行的NewSQL数据库,不知道大家有没有用过。比如说原来关系型数据库SQL用着很分辨,在NoSQL里就没有,这是易用性。最重要的是事务的概念,有一段时间NoSQL不要事务了,因为事务本身会造成一定的性能要求,但是这样实现失误的时候难度更大,我们又回归了它希望是有事务的。对于关系型数据库和NewSQL数据库存在着的是什么?关系型数据库不能扩展,取决于硬件是多大就是多大。NoSQL数据库的问题是什么?就是不能支持事务,另外也没有SQL那么方便。


    说到数据库的发展,我们不得不说一下谷歌的历程。不管怎么发展,最开始的祖先是谷歌。说说谷歌的故事,我们现在看到的很多产品其实是来自于谷歌的论文,比如说现在很流行虚拟化,最开始来自于谷歌,还也谷歌APP,BigTable论文最开始是它写的,但是谷歌错过了好几波。现在有好几个开源,包括DCOS的调度。2006年之前谷歌也是用关系型数据库的,MySQL,2006年发表了BigTable论文,但是那时候没有SQL的支持,只是支持行的事务,但是不支持跨行的事务。所以开发了MegaStore,至少需要事务ID,它又需要分布式协议。每一次要进行事务ID分配的时候都要走一遍分布式协议,它是高延时的,100—400毫秒之间。


    这个过程中谷歌发现,虽然延时和高,但是很多人用。谷歌统计有300个应用在上面,用它的云平台,所以有一个Spanner/F1,全球首个分布式数据库。在MegaStore的基础上,有一个全球是分布式数据库就解决了很多问题。基于这篇论文,就诞生了NewSQL的数据库。


    面对大数据我们过去怎么做?现在怎么做?如果是关系型数据库的话,我们采用什么方式?中间层的方式,也就是分布分表。架构是这样的,下面的底层是MySQL,上层有个中间层,根据接收到的命令五考虑分到哪一个MySQL集群中。


    根据分布式中间层的架构,历史中诞生了无数个分布式中间件。百度的DDBS,youtube的也有,淘宝的,基于Cobar,360的,京东的。最近两年特别火的是分布式中间件,但是中间件有什么问题呢?第一执行计划,大家知道MySQL是单机的,分布式不适用,分布式事务更难。很多实现了分布式中间层的都有一定的折衷,其实没法实现跨节点的Join,这是第二个。还有延时的问题,以及扩容,4变8,8变16,16变32,32变64,非常复杂。百度以前的扩容,32到64的话,起码要花一个月来准备,非常麻烦。


    还有用结合的方式,比如说大字段的,用HBASE来解决,响应比较快的话用REDIS解决,RIAK来解决,这也是相结合的方式。


    还有一个概念,OLTP,从MySQL或者其他业务中抽取大业务仓库,用这些东西进行离线的计算,再得出报表,这是过去的方式。


    在去哪儿这边有几种数据库,主要的是MySQL,还有redis、spark、麒麟。DBA组目前用的是redis额、MySQL和HBASE。但是现在的趋势不是这样的,最近谷歌新出了一篇论文,这个论文就讲到了一个概念,OLTP+OLAP是融合的时候了,数据库它能支持事务,又能支持离线分析。正好有一个融合的机会,包括谷歌最近出的这个,我们一般关系型数据库是行存储,离线分析是列存储,现在出了一种行列混合的模式,这就很好的加以融合,也是未来的趋势。


    这是根据谷歌来的,以后只需要一个简单的客户端,像用MySQL一样,这样用就可以了。F1层主要是负责生成分布式的计划,然后无限的分层扩展就可以了。由此诞生了围绕着谷歌有了一些数据库,OceanBase、蟑螂数据库、TiDB。我们为什么选择TiDB做调研?它不开源。OceanBase他自己内部的版本和外部的版本有点差异,所以我们没有选择。另外他们在杭州,也不能接触到核心。蟑螂数据库在国外,是PG的接口,不太喜欢用。TiDB正好跟我们公司在一起,有很好的支持,我们也进行了很好的调研,发现还不错,所以我们决定调研它、使用它,及时反馈。


    现阶段分布式数据库大概的架构都是怎么实现的,首先说一下TiDB是什么。它是兼容MySQL的,但是存储过程可能不兼容,这也是我们不建议在使用中用的。还有兼容、扩容,这是最基本的。作为运营人员,高回路非常重要。设计目标是80%的OLAP和100%的OLTP。他们认为我们一般用的比较负责的分析SQL是可以解决的,但是有一些特别复杂的,比如说能写几百行的,他们不能保证,还支持不了。另外我们都有开源的精神,不多说了。


    说说核心特性,也是分布式数据库的特性,水平线性扩展,扩展很好理解,什么是线性?我机器越多我性能越好。故障自恢复高可用,智慧负责怎么理解?传统的主库挂了会到从库,主库有问题的话我要备份,做一个从库出来,这都是耗费人力的。当你机器成百上千,上万,几十万个节点的时候,就不好做了,数据自己移动、平衡就行了。


    另外还支持事务,OLAP,在TiDB上,最开始是想OLTP的,实际上有很多的OLAP需求,他们很多都在优化器方面的优化工作。还有跨数据中心数据强一致,谷歌的副本可能有9个,会跨国家,跨州,美国这边挂掉了谷歌实际上是不受影响的,所以跨数据强一致也很重要。


    接下来简单说说他们的架构,因为他的灵感来自于谷歌F1和Spanner,一个是负责接MySQL,一个是负责底层的存储。这是一个更详细的图,TiDB、TiKV、PD,这三个大家记住就行了,后面会详细给大家讲一讲。


    先讲TiDB,TiDB实际上是无状态的,相当于一个中间层。它所要做的是什么?第一负责接受SQL,第二是执行计划和负责处理计算。他访问哪一个节点都是一样的,你前面加一个HA就可以进行负载均衡,相当于中间层。


    PD主要是原数据处理,这个数据到底存储在哪个地方,副本是多了还是少了,负责数据的转移,哪一个负载更高我需要转移一下。另外事务ID的生成,为什么Spanner很难开源?因为生成事务ID他们是用硬件来实现的,是原子钟和GPS结合的方式。


    TiKV是存储的,分布式数据库会把数据分片。


    多个节点之间的调度会通过PD来进行调度。


    简单说几个层,它是高度分层的。存储和计算是分开的,在实现的过程中是这种思路。另外它是用Raft来保证副本一致性和可扩展性的,没有分布式文件系统。主要是HDMS,但是它没有,这样就降低了运维的成本,因为我们要保证HDMS的高可用性。底下是用RocksDB,上一层用Raft来实现,我要实现多版本,再实现事务,主要是这么几层。


    一个是RockDB,也是来自于谷歌,后来交给Facebook维护就变成了RockDB,也是根据现在的磁盘来做的。它是LSM的结构,速度很快也稳定,但是不能容忍磁盘故障。它就是本地存储的一个东西,所以在这上面它是没法扩展的,只能依赖磁盘的容量。


    Rock层相当于存多个副本,某一个副本挂了,可以自动的进行高可用恢复。


    Region的话,一个是Hash,一个是范围的分片,这样有个好处,就是适合范围的扫描。反三在各个节嗲,实现负载军很,读写通过Leader进行。它可以存储多份,这是RaftGroup。


    这里分裂,比如说1—100,我从1—50,51—100这样分,相当于细胞分裂一样,就可以很好的分布在各个机器上。如果以RaftGroup来分片就是这样的情况。会传到Follower节点上,其他的也进行分裂,就是这么一个简单的方式。有兴趣大家还是看一下Faft的论文。


    扩容也很简单,比如说讲增加一台机器,他认为负载比较高的是A,A正好是Leader,他会把Leader转移到B节点,再把Region副本复制到E节点上,再把A去掉,这样就扩容了,也很简单。


    还有多版本控制,它实际上是key加上它的版本号,我们在读的时候就不用加锁,跟MySQL有点类似,我只要读以前的版本就行了。另外有一个好处,我可以恢复到历史版本,如果我们误删的数据,我们就要拿备份。现在不需要,如果你保存了,比如说我一小时之内版本保存,我就可以简单恢复到一小时之内。但是有一个折衷,你保存多版本,磁盘的耗用量更大。


    这也是基于谷歌的一篇论文,也是相当于二节段提交。MySQL传统都是悲观锁,我们试图先去加锁,而其他的要进行等待。乐观锁呢,我们不会加锁,只需要在提交的时候写冲突检测。这样有什么好处呢?就是冲突业务量少的时候很好,但是大量冲突的时候是不合适的。它支持的级别是可重复读,也实现了外部的一致性,它是为了支持金融级的,也支持外部的一致性。


    另外支持分布式的查询,可以简单说一下,原来我们只是在单台机器这是Count,现在可以把每台及其Count结果会聚,再进行结合。它的分布式的执行计划也是支持的,MySQL是不支持的,无非就是并行的思想,这也是他们官方的测试,主要是OLAP方面的测试。


    OLTP的测试因为他们不方便透露,他们是分布式事务,相对比较少台机器的话,时延会大于MySQL。如果是多台机器的情况下,他们就会有强大的QBS。大到一定规模的时候,他们时延是恒定的。


    再说说我们的适用场景,我们想用的是大数据量,MySQL可以很好解决,小数据量我们就不需要了。离线,可能大家想的有ES,但是我们这边还没有上,还在测试。有好几个业务说我要上离线计算,它也是很大的需求。适用的场景没有明显的热点,刚才说了是乐观锁,有热点也没有意义,就那么一行,他发挥不了多台机器的优势。另外二级索引,加个子段的索引可以吗?其实是不可以的。跨机房容灾、强一致。


    最后说说我们的计划,现在出了RC3版本,我们正在做性能测试。现在功能测试的差不多了,下一步开始测性能。8月份我们准备上一些非核心业务,我也问了他们的人,他们说1.0正式版预计在8月下旬发布,我们也会持续的跟进。后续我们会上一些更核心的业务,未来我们想上的就是私有容器云的方式,让它更方便我们的管理。甚至去哪儿现在也在提供企业的公有云服务,后续也想这么搞。


    0FNMYJ224O[HQ3~ZC@E72GS.png


    韩锋:感谢蒲聪为我们带来的精彩分享,下面有请来自润乾信息系统技术有限公司高级技术总监张政宏先生,大家掌声欢迎。



    张政宏:大家下午好,今天我给大家分享的题目是“新一代数据处理引擎”。主要给大家介绍一款由我们公司自主研发的,新型大数据处理引擎。


    今天的分享主要分为三块,第一块是在日常工作中经常会发生的问题我做了一些简单的总结,还有对问题的思考。第二块介绍一下我们的产品,主要是介绍一下它的语法特征以及我们应用了哪些技术保证了它的高性能。第三块看一下我们的产品,在整个工程上的应用都有哪些场景。


    先说一下我们日常工作中经常会碰到的问题,刚才前面的老师主要讲的是TiDB,其实它是OLTP和OLAP结合的产品。前段时间我也在群里收到了他们CEO的红包,在这里也做一个推广。


    数据引擎主要还是关注OLAP的业务,我们下面讲到的主题还是跟数据分析密切相关的。我相信大家在日常工作中做过这样一类操作,我们先把文本入库然后再做计算。我相信在座很多同学还是这么做的,为什么会有这样一种看似是操作型的过程,而不是直接拿编程型的方式直接处理呢?我分析了一下原因,主要是两点。


    第一,我们一些开发人员对现在好用的开源工具可能了解的还不是很够。我还是要解决这个问题,那我就要用常规的手段把它入到数据库里写SQL。


    另外,现在的开源工具也挺好用的,但是有些场景就不太适合了,或者不太适合工程上的应用。比如说我们写一个结构化的文本计算,但是要受本地内存的限制。或者写一个表和表之间的Join关系就很难写了,另外新一代数据处理引擎都会涉及到集群运算。


    有了分布式内存的模型就好了很多,但是因为没有自己的存储体系,所以它就需要Hadoop的存储体系帮助它。我们这里说的文本计算,带上Hadoop显然集成方面就没有必要了,现在看起来没有太好的方法用开源工具。


    这样一种操作型的处理过程,就导致了我们下面要说的两种现象。


    第一种现象,我们在客户那里发现入库时间和结算时间还长,计算可能半个小时就结束了,入库还需要三四个小时。


    另外一种现象,大家都知道ETL是什么样的过程,有一部分数据是从关系源数据出来的,我们就把它变成了不是ETL这样的动作,变成了先加载到数据库,再做抽取和计算的动作,整个过程就不是很合理,搞得数据库就很臃肿。


    即便我们的数据在数据库里面,但是还是有很多问题我们不太好解决,这里SQL就不太好写。大家知道SQL是命令式的描述语言,所有过程都要写在一句话里,实际上它是缺乏过程计算的语言。缺失过程计算,我们组内的运算就显得很麻烦,还有一些有序计算就更麻烦。


    主流的商业数据库都会给它贴个后补的膏药,就是存储过程,弥补过程中的缺失。但是存储性能跟SQL不是一个数量级的,我们主流的商业数据库处理引擎和SQL的处理引擎实际上是独立的。我们相同的程序实验逻辑,用SQL写,存储性能就高很多。


    存储过程还有耦合性的问题,我们用报表生成一个模板,用存储过程就会把存储过程写在数据库里。显然一个功能一个放在页面里,一个放在数据库后端,耦合性就很强。另外需要跟它边际权限,刚才提到了报表的业务,实际上数据只需要只读权限就够了,你给他开边际权限,就可以干任何事情。


    我们管理水平很高,要经过几个人的审批才能操作这样一类事情。实际上管理成本的上升就带来了效率的下降,我们本身很简单的过程经常需要通过一个审批的过程才能实现,显然开发效率很低。


    我们还会实践一些开源的数据库,但是缺失一些窗口函数,这些过程就更弱了。在库内用SQL去写,用开源的东西还有很多复杂的业务逻辑。我们的数据在数据库里也有在库外的,比如说要建立数据中心服务式的接口,数据中心就有很多种数据库,或者是NewSQL一大堆,我们要提供对外服务的接口,就需要多元混算。


    我们在互联网公司经常会算广告计算,我们引流过来之后点击事件会在日志里,我们要跟商品做计算,这都属于混合计算的场景。实际上很多场景不需要经过一个数据集成的过程放在一个数据仓里做,如果我们有库外的计算引擎的话,这种事情就变得好作很多了。


    另外大家对Hadoop的实践已经很多了,大家应该了解到这是学习成本、维护成本很高的产品,因为它设计的目标是超大容量的架构。另外Hadoop相关的SQL能力跟传统数据库相差很远,按照2013的标准来说,它实现了不到30%,这就给我们在数据分析领域里造成了很多的困难。


    现实的情况,我们处理业务的数据量并没有那么大,用Hadoop分布式计算工具其实显得很重,尤其是我们做一些工程项目。你要带着Hadoop去玩儿,客户也觉得很累赘。另外我们用相同的业务复杂度,开源工具的实践并不理想,包括一些开源的数据库。大家如果用一些开源的数据库作为分析库的话,用起来还是不如商业数据库顺手。


    另外我们商业的数据库还是很贵的,我们一个库够用了,用其他的方案可能更好一些,但是也许价格不菲。我们现在机器内存越来越大,上半年戴尔推出了160T内存的超大内存机器。将来我们的技术架构也会往这方面走,单机的性能包括大闪存,大SSD普遍的使用,实际上单机性能很高。如果我们有独立的计算引擎,其实可以处理很多事情了,而不需要在一些开源的工具上去浪费很多时间。


    基于刚才一些问题的分析,如果我们在库外就有这样一种计算引擎,它拥有数据库全套的计算分析能力,而不依赖数据库。我们数据库还会干什么呢?业务稳定性更强,我们还是应该放在数据库里。对于业务稳定性不强的,大家老去算一些数,看一些报表的,这不如前台稳定性强,这种的我们放在库外,我们还可以用到数据相关的特征去加速它的计算。


    另外我们经常需要一个良好的集成性,不能我做一个项目就带一个Hadoop玩儿,我要考虑很多事情。要跟现在很多主流的工程工具集成得很好,比如说我们要写一个数据分析的处理过程,这是很容易的。可是我要把它集成到我的项目里,跟Java程序集成起来可能就不太容易了。


    最好这个工具是轻量级的,不要让我的运营维护很麻烦。我本身就是要搞数据分析的事情,其实我只是用了Hadoop里很小的内容,这就是杀鸡用了牛刀了。


    数据处理工具我希望它的描述能力很好,开会前我碰到了我们的一个客户,说这块是专门写SQL的,有一些问题。处理引擎要有很强的描述能力,要解决在数据库里用SQL不好写的那部分。另外它一定要具备高性能,因为现在的数据是越来越庞大了。


    下面介绍一下集算器,主要还是上面提到的两方面内容,看在适用面上有多好的描述能力,另外高性能方面应用了哪些技术,来保障这个性能。


    润乾集算器是面向结构化数据计算的脚本语言,我们是一个动态的脚本语言。它提供了丰富的结构化的集算类库,也支持多线程并行。我们有很强的实施交付能力,很强的业务描述能力。因为它是过程式、函数式相结合的编程语言,又贴近人类自然思维,它对开发的帮助就很大。因为我们是库外计算的引擎,我们就可以抓住数据本身具有的特征,去开发一些算法和类库。我们在很多数据库里享受不到的优势就能发挥出来,这让它的性能得到了保障。另外有了数据库计算能力,而不依赖数据库库外计算的引擎,我们在设计体系结构和应用结构的时候就很方便,它的维护性跟管理性又得到了提升。


    首先看一下集算器有那些应用场景,我借用了传统数据分析的三层结构,大致显示我们这个应用场景所在的位置。这四个主要是我们的一些业务场景,这四个业务场景架构都可以做成集群式的。


    这以报表为例看一下应用结构,我们在传统LTP业务用到了一些框架,大家已经很习惯用了。但是我们在LTP分型业务里,中间层应用还很缺,我们就是为了弥补这一块的空缺。有了这样一个计算中间层,显然一些存储过程的算法,我们可以解耦到计算层里。报表有多元的处理,展现层也可以计算。有了这样的计算中间层,对于体系结构的设计和运行维护就方便了很多。


    下面介绍一下集算器的语法特征,我们这里面的基本说法就是集算器是集合化和离散化的结合。什么是集合化呢?如果这种事做不好的话,可能要写几行代码,挺啰嗦的,如果就是一句话的话,描述起来就很简单。离散性就是说,我们取出来一个集合,需要对集合其中某些东西单拿出来算,这就类似于在高级语言里一条一条算一样。


    OLTP这种业务经常会要求大家不要在数据库里写很复杂的SQL,我们需要让它单独拎出来算,因为OLTP是高并发的业务。我们在OLTP业务里也是一样的,有些用SQL很难算的业务,你把它搬出来算,用一个过程化的语言去描述它就相对简单了很多。


    这里大家还会有一个疑问,为什么我们不提供结构化计算的类库去做这种事情呢?比如说我们在LTP业务里,经常会用一些框架做这种事情。实际上光有计算的类库还是不够的,大家知道我们在做分型业务的时候有很多中间结果,中间结果称之为动态变化的。动态变化的结果你要用常规的JAVA里的集合类型就很麻烦,我们做的处理是要被一层层包起来的,是批量式的处理。


    我们又需要有匿名函数的处理,最好它是一种脚本语言。所以我们不能简单的给他提供一个结构化的计算类库,而是用语言呈现的这样一种基础方式。


    用离散性给大家举两个例子,上面是用SQL写的,我们的计算任务是求张三、李四的年龄差和工资差。熟悉SQL的人一看就和明白,它是两个标量子差,相减就行了。右边懂点英语,有初中代数知识的人都知道它在干什么,这是最简单的例子,就是我们怎么解释离散性的问题。


    另外一块就更高级了,我们称之为外键式的引用。我们求某个地区的交易记录,SQL的做法是交易表和地区表一观点,用地区明确就把相关的交易记录取出来了,而我们用集算器的做法,如果内存能放得下的话,我们漏在内存里,建立一次性的地区表编码的指针,实际上是多对一的。这样建立好了之后,从描述这件事情来说就很简单了,我们只需要用对象式的点取就可以表述它的关联关系了。


    另外后面谈到高性能的时候,还会讲这样一种处理关系,对性能提升也是很有好处的。这是我们举的最简单的例子,大家知道SQL多表的关联其实很头疼,写来写去就会很晕。用这种方式还会保证不出错,为什么呢?大家知道SQLJoin的数一定是减一的,少的话就乘出去了。


    分组子集,在SQL体系里,关系数据库里面分组就必须加上聚合,一定是groupby类似的操作,这就会给操作带来很大的方便。我们只关心分组后的子集结果,或者我们会根据子集的结果还要做相关的计算,你强迫我做聚合这显然就很不方便。在SQL一些相关的做法里,就是要把分组的ID取出来,再去做,显然就很不方便。

    另外指的是非常规聚合,大家知道聚合就是sum、count之类的,把这个概念推广起来的话,很多表达就很容易,我们书写起来也很简单。大家对比一下SQL的长短,底下的SQL还用到了窗口函数,这样对比起来表现就非常容易。


    有序分组,这是我们归纳总结的例子。有序分组是最简单的例子,比如是我们要求一顾股票连涨了多少天。这种运算大家如果用结构化的语言写会很简单,无非就是排个序,涨了+1,跌了清0,取个最大值。但是如果用SQL写的话,这是用甲骨文的窗口函数写的。这就表明了,在很多时候我们如果仅仅依赖关系数据库的计算能力,它表达起来很麻烦。如果我们把这一类的操作搬出来写,其实还蛮简单的。


    另外一块就是更复杂的例子,找出连涨三天的股票。大家可以对比一下长短,牵扯到组合问题,分组和有序组合在一起用SQL写就很麻烦。


    再谈一下用了库外的计算方式,在性能方面有哪些好处。我们使用了这样一些相关的技术提高了它的性能,首先说一下我们对聚合的理解。刚才也谈到了聚合,我们取一条记录或者取一个子集,我们都推广成一个聚合,它就好写了。这里面谈的是性能方面的问题,比如说我们要取一张表的前三条记录,它的前十名。如果在关系数据库里是个单表的话,建立了相关索引的话还是比较快的。但是如果是中间结果,用不到索引的时候,实际上关系数据库的机制就必须先做大排序。比如说一条记录我们取前十,排完序之后取出前十条。


    大家写过一些程序的,其实知道是不需要这样去做的,但是在关系数据库里没办法,机制就必须这么搞,在于库外去算的话跟在数据库里的做法是不一样的。


    外键指针对我们的描述能力有很大的帮助,同时外键指针化对性能有很大的提升。大家知道,在关系数据库里做Join,这是世界上最快的对齐方式,但是还是没有指针快。指针是从这样一个地址指向另外一个地址,是常数的时间。尤其表多了之后,性能提升就更加明显。究其原因,关系代数没有指针这种数据类型,导致了很多很高效的方法在数据库里都用不到,你搬出来的都可以用,理论上你自己写JAVA都可以进行,但是复用性很差。


    这里我们做了一个测试,当你单表的时候,跟Oracle比差不多,但是做五张关联表的时候,用指标化就比Oracle高一倍,大家知道Oracle已经是商业数据库里最牛的了。包括现在很多内存数据库都放在里面,大家每次都要现算,它就用不到指针的好处。


    外键序号化跟外键指针化差不多,我们数据落到盘里的时候就是天然有序的,或者我们有目的的做个排序,给它个序号。这时候我们就可以用序号找另外一个表的序号,这种时间也很快。实际上这一类事情放在关系数据库机制里就不行,因为数据库是不知道你这里已经排了序的,如果表很大的话还是会做分段的。数据库的特征就享受不到这种好处,它数据本身就在库外,你再搬到库内又享受不到这种好处,这就自讨苦吃了。


    还有有序归并的情况,后面的操作我们都可以变成很低成本的有序归并的计算。ETL的过程中如果我们在库外处理的话,它的性能非常高,但是在数据库里就享受不到这样的好处。


    总结一下,我们习惯性的会利用数据库的能力,然后去做相关的计算。但是如果我们在库外拥有一个跟数据库相同计算能力的引擎,我们就能享受到很多好处跟便利。第一就是描述方面更简单了,它有结构化语言的支持,另外我们可以抓住数据的特征,写一些高效的算法,我们后面的场景分析中还会跟大家做分享。


    后面看看集算器在工程领域上的应用场景,分主题给大家阐述一下。数据的多样性很普遍,本身不在库外的数据我们又经常习惯性的做一些数据集成的动作,要放在数据库里,其实很不划算。如果我们在库与本身就有这样的计算能力,我们可能会很高效的处理完就完了。


    我举了三个例子,就是我们在项目中碰到的,数据订阅的服务。你的合作伙伴或者你的老板,仅仅是要看一些数据就行了,订阅一些数据。比如说一些财务数据在用友里,ERP的数据在SAP里面。我要把两边数据结合起来看一下,这时候通常业务人员都会把数据导出来再算。如果没有库外的这种计算能力,都要通过技术人员的辅助去做相关的数据分析计算,才能去做。如果有库外引擎的话,我们去读相关的ERP跟财务的接口,我们就可以做到订阅服务。所以订阅服务业务稳定性并不是很强,运营人员提出一个需求就想看相关的数据有什么变化,如果此把它集成到数据库里,那就很啰嗦了。如果有个库外的引擎直接算,这就很方便。


    再说一下我们在互联网上的一些应用,我们经常会抓取一些商品信息做分析,或者竞争对手的数据做分析。大家知道这个数据是海量的,我们经常要做结构化的分析,抓取我们可以用很高效的方式丢到消息数列里,再算的时候又要丢到数据库里。你往数据库里写的性能又不是很好,而且随意性也比较强。如果本身把它放在库外,用库外去算就很方便。


    刚才提到了跨系统的数据整理,应对这种业务性、稳定性不是很强的方式,我们推荐大家不要再把数据放在数据库里了,而是在库外有很强处理能力的引擎就很方便。


    ETL是一样的,从数据源来说分为两块。一块数据本身就是在关系型数据库里了,就是SQL导过来,也没什么好做的。另外一部分本身数据不是带关系数据源的,起来要尽量的用库外的计算能力,不要搞成ETL的动作,导致整个数据库非常臃肿。


    另外讲一下报表方面的应用,还会分解一些其他的好处。因为我们做报表还比较擅长,这方面可以说的事情比较多。我们引入了一个独立的中间计算层,在应用体系上就有很多的好处,我们可以把一些数据库的算法外置到计算引擎。


    它在库内,离数据更近,比SQL差一些。我们日常跑批的动作还是很合理的,但是这里要减少的是紧紧围报表计算来做的存储过程,这在开头问题的发现里也提到了,耦合性非常强,也不易于管理。我们这时候把相关的存储算法,移植到库外就很方便。


    曾经碰到一个案例,他的需求差不多,一个是用DB2,一个是月Oracle,实际上你可以用一致的算法去搞。


    另外中间表产生是很有道理的,一个是SQL一步写不出来,很复杂。另外数据量很大,它也需要落地之后再计算。基于这种批量处理中间表的产生是很合理的,为了报表查询产生的中间表,有时候我们叫汇总表或者宽表。这一类完全是为了前端报表展现,或者是用户体验冗余的中间表,实际上是完全不需要的。


    我们库内有这样的存储能力搬到库外,做数据的外置,性能就会好很多。不同的集成商来搞,我们曾经在运营商那里看到很极端的现象,这种表能够上万。一个系统的设计几百量表已经很多了,大量的这种表都是为了报表服务的,管理起来就很不方便。如果你把相关的数据,为报表提供查询服务的数据,你为了用户体验和汇总表,这种宽表外置出来。而根据维度建模的数据还是需要放在数据库里面,因为除了报表固定动作的查询以外,我们要支持为报表固定动作查询服务的中间表外置出来。


    有些项目随着它的下线不用就不用了,也不会在数据库里产生更多冗余的数据。在数据库里产生这样的表,数据库现状管理起来很不方便的。


    最终报表的体验跟你在数据库里的时间,数据传输时间,页面呈现时间,三者是乘法的关系。大家知道JDBC性能普遍比较慢,如果我们能做多线程的取数,在取数环节上能加大它的通道,这也是很有用的处理方式。


    第三块是数据汇总的功能,我们有了库外的数据引擎,我们也不在乎数据集群是同构的还是异构的。我们要向各个数据库发出取数的请求,再到我这里做汇总计算,这样就很方便。


    T+0报表也差不多,我们经常会把当期的数据库做得很小,让LTP业务跑得很快,历史放得很大。我们碰到的案例,在业务系统放在DB2里,这TiDB又要做全量的T+0报表,这时候如果有一个库外的引擎去帮助它就很方便。


    另外就是数据中心的服务,后面也是有多集群的,是多元的。这时候我们不能开SQL的接口,否则灵活性就太强了,我们可以用服务性的接口提供服务。服务性接口后面需要有很强计算能力的计算工具去支持,很多案例都不是在分装算法,而是在移动数据,把数据移动在数据库里,对外提供服务。当你的需求方发生了变化,你又要搞一圈,显然就很不敏捷,这一类的需求都是用库外集群的方式,这样就很方便。


    另外谈一下数据集群的方式,我们说的四种业务场景都可以支持集群业务方式,是独立业务计算引擎。Hadoop本身是非常庞大的沉重解决方案,它对标解决的目标承载力是几百到几千台机器,才能发挥它的功效的,现在来说没有太大的意义,更多的意义是存储而不是计算了,它节不是作为计算产品摆在体系结构立了。


    MPP是由一台机器升级为多个集群,好用的MPP是一体机,是用硬件去堆的。如果你只是网络里搞一个集群,搞MPP,效果是很差的。我们也测试过相关的MPP,如果你只是普通PC搭的数据架构,性能衰减是非常厉害的。衰减的原因是MPP是基于SQL传统的计算模型去做,搞的非常累,有些好处也享受不到。


    我们NewSQL就是要打破在SQL上的算法和局限,才能加速我们的性能。集算器的集群是轻量级的,我们可以在一个机器上开多个进程,在多个机器上开独立进程,这个集群就跑起来了。我们是无中心的节点模式,返回结果都是很方便的。


    大家有兴趣可以扫一下二维码,这是我们集算器产品的官方文档,这里的介绍比较详细,大家有兴趣的话可以阅读一下。今天的报告就到此结束,谢谢大家。



    韩锋:感谢张志宏先生给我们带来的分享,下面有请来自热璞科技的刘小成,掌声欢迎。



    刘小成:我分享的题目是“私有云数据库构建之道”,大家做数据分析的时候有没有想过,数据库本身也是需要维护、优化、管理的。从数据库角度看,我们怎么做到在数据分析的时候为规程是提供一个非常方便的数据库服务,这是我们要聊的议题。


    我们首先聊一聊为什么要做这个事情,第二个简单过一下我们怎么做,最后结合数据分析要怎么做。


    我目前就职于热璞科技,我毕业之后就一直做数据库这一块,也经历了原始的过程,到现在的数据化、服务化。现在大家都在构建自己的混合云,不会只用公有云和私有云。私有云和公有云在构建上没有什么本质性的区别,我们构建私有云的时候就是对技术的转型和技术的体系有很明确的针对性。


    我前两天调研,发现互联网数据40%的速度在增长,这个数据指的是在公网或者在整个万维网暴露给大家可以拿到的数据是这样,因为最近暴露出了一个暗网。我们只是用到整个网络里面的很小一部分数据在做分析,很多数据我们还看不到。


    我们现在面临的问题是数据爆炸性增长,从这些数据当中大家拿到,大家会把它变成价值、规则,各种各样的东西。对于数据库来说,首要目的是要把数据存下来,而且不丢。常规的方式,如果企业在做数据库这一块规划的话会发现,我们用分散性方式做数据库,就会面临有很多人买很多软件,要做很多硬件的规划,做硬件实施,所以成本就非常高。而且随着时间的推移,不管是人员变动还是什么原因,风险会越来越大,很多时候会出现机器、数据库之资源处于长期未使用状态,或者处于很大的浪费状态。


    我们运维人员每天很被动的在运维,在救火,DBA最恨的可能就是抽数。


    Database as a Service这样一个平台,我们要让使用数据库的部门用这样一个方式去做,任何一个数据库就是要做成服务化的方式。另外高可用,安全体系、兼容体系不涉及数据库,但是今天我们以开源的MySQL为范本来聊。


    云数据库有一些特征,首先是服务化、多租户、快速响应、动态调整、成本控制、容灾,一旦谈到数据,首先就是安全,不管是数据本身的安全还是数据持续化的安全。这两个图很清晰的描述出了我们做资源规划的时候是什么样的,我们把物理资源、软件资源首先要做梳理,层次化。然后生命周期,从初始化到下线,要经历哪些过程。我们把这些资源分类之后就要做密度的整合,要形成一个高密度的组织方式。


    层次化比较简单:应用层、数据库层、系统层、硬件层。生命周期也一样,每一个状态的变化一定是某个事情引起的,而某个事情我们把它认为任务调度,迁移因素,这些都是所有平台要做的事情。密度整合,就像我们做的规格运算,我们要把整个数据库的单元变成很清晰的规则计算,整合在一起,形成整个资源,特别是物理资源高的利用率。


    调度这一块不细说了,有模块、自动化、标准化。我们要做调度的任务托管,就一定要把所有跟数据库运维相关或者管理相关的任务,全部放在平台里。备份是数据库必谈的事情,异地容灾、延时备库,做迁移、误操作、顶点恢复、测试、脱敏的,工具就不详细说了,就是MySQL现在用到的。


    现在所谓做MySQL的复制,都是基于一个园林,从一开始的半同步复制,到现在MGR都是基于事务主库和从库关系之间的区分。以及不同的方案有很多,最开始的异步到CLUSTER,有一个权衡。


    数据库跟硬件有些区别,要搜集的信息有点多,有运行状态、资源状态、性能状态、任务状态。有的是用来回溯查看性能和整个表的,有些是用来做警告和报警的。最终回形成的效果,就是要谈一谈预警、报表的问题。我们对整个数据库要有全方位的数据监控,安全体系这一块就更多一点,我们从四个维度理解就好了,一数据、审计、隔离、用户。备份是一种,隔离主要是资源的隔离,对用户来说,或者对使用者来说,他只想知道自己的数据库处于独享的状态。


    企业现在都是在构建混合云的云架构,API就是云架构里面非常重要的角色。所有的组件,不管是部署的还是监控的、任务调度的都需要对外提供接口。咱们做的是PaaS平台,一定会依赖某个数据库平台,不可能让用户申请PaaS平台的时候还申请数据库平台。接口一般分为任务、资源、状态,所有的平台提供的功能都需要对上下游的云平台组件提供一个接口。


    这就构成了整体的系统架构,比如说从分层来看有底层的资源层,硬件资源、软件资源、服务资源。还有托管平台,就是服务层。还有面向应用工具的、数据的、监控体系和安全体系,最后肯定会有自己的平台管理界面或者是管理的组件,包括用户、配置相关的东西。


    有了这个之后我们要聊一聊怎么样在这样的平台里做进一步的操作,我们刚刚做的效果是具备把数据库托管起来的了。如果仅仅是这样的话,它实际上是个运维平台。一般我们人做决定的时候,它会通过当前的状态,加上自己以前的经验得出一个决策。但是对于机器和平台来说,我们首先需要四个因素:实体、属性、规则、数据。


    我们对于这些资源的变动、变化都要提供一些规则出来,然后是数据。其实整个平台的核心或者关键点在于,我们怎么运用数据。有了这些之后,我们也可以把只能通过人做的事情,可以通过平台来完成。


    我们从采集角度来讲,我们可以采集到基础数据、状态数据、运行数据,从不同维度来看他们是相互独立的,但是又是相互有联系的。有了这些数据之后,我们再细分一下,比如说从CPU硬件、磁盘网络、服务容量以及负载、性能、备份,能得出什么信息?所有的采集都是互相独立的,互相补依赖,但是当你在分析某一件事情的时候,发现全部都要用上。


    比如说我们分析备份的问题,我们要知道整个企业的数据库备份的状态是什么样的,整体备份时间,以及备份期间对存储有什么影响等等一系列的疑问。你分析的时候干什么?比如说我们之前遇到的情况,可能会把我们的存储做好。另外磁盘的状态是什么样的,不管是硬件还是磁盘容量。另外关于负载这一块,最近我们有没有业务增长,为什么最近备份变化特别明显。备份不再是平稳增长的曲线,有可能是因为业务增长,负载也会受影响。因为你数据量变大了,可能优化这一块也要做。


    我们就谈到了智能化的问题,智能化可能还不是那么智能,换句话来说我们也在逐渐探索这一块的东西。首先是评估,我们可能没这么清楚,但是我们要有一个全局的概念了解数据库处于什么水平,有了这个之后我们就可以做预警,就是刚刚所有的数据。接下来可以调优、资源整合、测试。


    首先聊一聊评估,我们从几个方面看数据库的状态,如果性能、负载、管理、容量、安全几个方面,像雷达图一样,从各个维度评价。一目了然可以看出你的数据库处在什么状态,以及各个维度的趋势。我们可以打个分,这个分数有没有加值不重要,重要的是我们知道它在我们评估体系里是什么样的状态。


    有了这个评分之后可以做资源程式化问题和整合的问题,如果我们清楚的知道数据库容量方面的趋势,我们就可以让它做整合。大的可以拆分,小的可以整合在一起,或者硬件条件已经不满足了可以迁移。如果我们认为单库容量已经到达上限了,我们可能要做的事情就是分布式,做垂直也是OK的。


    预警这一块最有价值的就是这儿,我们要解决最开始提的数据库的问题,我们现在运维人员处在被动状态。你总是在等待问题的来临,总是在等待别人打电话跟你说我的数据库体慢了,有问题。我们做预警就是让你提前发现问题、解决问题,甚至是提前自动化解决问题。


    另外规则匹配,就是我们去定义这个平台哪些是属于我们的预期范围,我们可以拿到所有相关联的数据进行全面的分析。当然有的问题,一如说你最近要锻炼一下身体,有的可能要复查一下才能解决。我们可以把这个预警本身做分级,有的预警只是提前提示,有的预警需要你马上处理。另外优化建议,数据库优化可以做很多。自动处理比较靠后,在规则以及前面的分析结果里对风险是可控的,就可以做到自动化处理。


    大家肯定都在写SQL,大家有没有想过自己SQL有时候很慢,要找DBA调一下优,因为自己不是和专业。DBA也无非就是能加的索引而已,调优有三方面,配置、设计、SQL。


    怎么优化SQL?现在我们谈到的是所有平台要做的事情,我们要确认这个SQL有没有必要优化,它的执行次数、周期,所在的数据标的容量是不是值得我们优化。它的优化代价、价值在哪里?我们要分析它的执行计划,以及目标表的数据量以及数据趋势,这样才有必要优化。我们看到它数据本身的趋势,我们可以给出的是,按照我们的规则可以做的就是在我们有限的规则范围内提出优化建议。比如说SQL改写,所谓的调整。


    在这个基础之上,我们还可以进一步的模拟,我们不可以直接破坏线上的数据,但是可以模拟。在低峰或者测试环境模拟,SQL改动正确性是否达到了,优化结果是不是我们想要的,有没有破坏掉其他SQL结果,或者是别的SQL的执行效率。


    优化真正要做到自动化、智能化是很难的,刚才提到的只是SQL本身,还有设计相关的。比如说表的设计,表数据量增长,这一系列信息都需要做到采集、分析,最终形成自动化的调优。


    另外是测试,为什么会把测试放在智能化里面?这个准确说叫基准测试。这个测试并非功能性验证也非性能测试,而是我们要对数据库的状态有一个基准的把控。我们要知道,某一种特定的条件下数据库的表现是上来样的,这是我们的基准。如果我们的业务已经上线了,数据库在运行过程中,电商经常会提到一个问题。6·18、双十一业务增长量会很大,那请问数据库能扛住吗?这种问题是没法回答的。业务增长10倍,数据库增长不一定是10倍,可能是50倍,有可能是1倍,也可能没有增长。这种问题我们要细化,变成更准确的回答,就是我们数据库当前的情况,以及负载的情况要考虑。在周末、晚上,负载都是不一样的,以及每一天的SQL分布都不一样,所以我们要做第二个事情。


    第一个是基准测试,第二个是模拟测试,也可以说是方针测试。我们要对线上已经存在的数据库服务进行非常准确的负载以及容量的把控,我们不知道业务增长10倍会发生什么情况,但是我可以知道数据库容量、性能增加10倍会发生什么,以及在业务高峰期我们会做什么样的准备和容灾计划,这是之前怎么做测试的一个持续图。


    简单来说,我们要建立两个模型。一个模型就是你的目标数据库本身SQL分布的模型,哪种频率运行。以及数据本身的分布,数据的规模,加上这两个我们就可以做模拟测试了,最终得出一个结论。


    另外讲一讲后面的效果,怎么做呢?从资源池、任务调度、监控、安全各个方面做这样一个平台,我们通过这样一个架构就是要把它变成代码,变成可运行的,变成服务或者是方案。有这个之后我们转化一下,首先我们要解决运行问题,要面向几种用户。面向应用程序、用户以及管理员。应用程序需要反馈数据库,用户需要申请,去管理资源,做交互。另外就是数据库,比如说今天用MySQL做样板,MySQL本身有一些节点。


    有了这个架构之后,我们再梳理一下怎么做资源交付,最简单的交付流程就是要完成一套数据库资源,让我们的数据库服务对象或者是用户做到随时可以用。往资源池里添加资源是最基本的,有了资源之后我们的平台用户会申请这样的数据库资源,他提出我要什么样的数据库,然后由服务层完成整个资源的分配、托管,以及后续资源分配配置,有了这些之后程序员就可以直接反馈了。你可以看到你数据库里当前的状态,以及一些优化操作。


    这是资源交互,另外我们刚刚提到的只是一个概念。一个用户不可能只有一个数据库,大家肯定都管理过数据库,数据库从来都是有很多个,不可能只有一个。有很多数据库资源,它处的状态,配置本身肯定是不一样的。这个用户会有三组数据库资源,有不同的架构。可以是三节点方式,也可以是集群分布方式。如果你面临自己一堆数据库的时候可以很清晰的知道,这个数据库有问题,那个数据库还OK。


    我们看一看它为什么会得出这样的分数,分数本身不重要,重要的是它为什么会得出这样得分数。直观一点说,容量相关,它的CPU内存、磁盘方面的容量是不是已经超过、达到或者即将达到它的域值?比如说他本身申请的是50G内存,现在已经使用了48G,需不需要做扩容?以及数据安全,比如说备份是不是有效的,最近有没有做备份的恢复测试,以及备份的大小,备份占用的资源。另外性能表现,就是我们刚刚雷达图里提的维度,它的吞吐量是不是在希望值之内,有没有出现异常,节点是不是正常运行,有没有出现硬件故障和软件故障。


    我们做了一个解决方案,就是怎么把自己的后台库扩容的问题,解决这个。64TB的存储能量,监控对象可以达到十万以上,而且对Zabbix是完整兼容,而且你当前使用的是单个MySQL,可以直接月我们这个脚本迁移到分布式方式去。另外这个是我们公司的一个产品,大家感兴趣的话可以扫码关注。





    韩锋:我们先在群里抽个奖,可以找到我们的工作人员要礼品。


    上半场干货很多,头脑有点转不过来,我这个话题大家可以放松一点。话题的题目叫“数据库的前世今生”,这是我对数据库的现状和未来的一点观点,以及对DBA职业未来发展的小观点,跟大家分享一下。


    我是一个70后,做数据库很久了,最开始做开发,后来有兴趣就转做数据库这方面了。我分几个方向:数据库发展现状的整理;针对数据库相关的领域,包括大数据、云、硬件、虚拟化之间的关系;数据库管理的变化,以及对DBA职业发展的小观点。


    我开始做数据库的时候大概是2001年,那时候做数据库没什么可选的,就三四种。现在你想做数据库的时候,发现有很多东西可以选。这也没有列全,列全的话图就没法看了。我们先做一个简单的整理,里面都包括了什么。大概分四部分:


    第一是传统关系型数据库,Roacle、DB2、SQL Server为、SybaseIQ等等。


    第二是非关系型的,Hbase、MongoDB。


    还有不算是数据库的产品,包括Exadata、Netezza。


    非数据库的,Memcached,实际上可以理解为数据的处理平台,跟数据库关系不太大。


    很多公司运营的时候,实际上是提供了一个统一的数据库能力,包括了我们上面讲的数据库和非数据库,这些领域大家都会在泛数据库的概念里遇到。


    这张图我们可以看到,有做数据仓库的东西,我们很少能找到一种架构支持多种应用的,我们不得不为了应对各种变化,比如说结构化多元化,以及导致多种架构来应对我们数据类的服务。这后面为什么会诞生出这么多种的类别和划分呢?实际上就是数据规模增大了很多。如果我们现在退化到15年前、20年前,那时候数据库应用规模很简单,可能有一个数据库可以通吃,都能解决这些问题,就不会发展出这么多种数据库的种类,这是近一二十年最明显的变化。


    从另外一个维度看看,大概三种不同的类别对应数据价值和数据容量有什么样的选择。


    TB级、PB级、EB级,传统交易型到分析型,结构和半结构化,实际上是有这样一个选择的。从数据密度来讲,传统的价值密度最高。什么样的数据有价值?可能是公司里的订单数据、客户价值。价值低的可能就是爬虫,从互联网上爬了很多数据,这些数据你不挖掘是没有什么价值的,你挖掘它才有价值。正是应对不同的数据体量,包括数据结构,以及价值的不同我们有不同的应对方案去支撑我们的业务。


    跳过刚才这些东西,我们看另外一个层面的东西,对传统数据库集成的发展。因为我们的数据规模不断增大,我们不得不去应对更大的数据体量。两个方面,一种是数据规模,我们要把我们存储的能力扩大,另外一方面是计算能力扩大。什么样的策略呢?最开始我们用传统的单机模式就可以了,你扩CPU、内存、硬盘等等。到一定体量不行了,比如说SMP架构,它可以扩充你的计算资源,存储资源首先与共享存储,也就这样了。再后来有MPP架构,把计算资源扩充了,存储资源也进行了扩充,通过这样的方式更好的支撑你的业务。当然不能直接类比,它各自有各自的特点。


    大家回去可以类比这个,我们用什么方式做扩展?MPP扩展就很简单,通过网络把集成资源和存储资源捆在一起。带来的缺点是上层软件决定了扩展能力,所以牺牲掉了很多东西。这样架构的软件都有同样的问题,必须要牺牲掉某些数据库的特性,才能达到一个比较好的扩展能力。


    这是NoSQL,前几年炒得比较火,那时候说可以达到关系型数据库了。这两年大家对这方面的使用越来越务实了,越来越能够精确找到NoSQL和传统关系型数据库的定位。什么样的场合使用NoSQL,什么样场合使用关系型数据库,对NoSQL这么多种类怎么做取舍,在什么类型场景下使用。最近两三年,通过跟很多朋友交流,包括在很多公司看他们的方案,确实这方面大家慢慢务实了,而不是过去四五年这种炒作的状态,现在好了很多。


    右边是所谓的CAP图,大家都很熟了,我就不讲了。


    这是一个很老的PPT,就是所谓的去IOE,这应该是在2012年、2013年的时候,参加任何一个会都要有人讲这个事情。以阿里为代表,去IOE这个事情炒得非常热,大概2012年达到了高峰。最近两年声音小了很多,因为很多公司也在尝试做这个事情,发现这里事情很多,去IOE并不那么容易,大家就会更务实。原来不是像会上听的那么完美,他们有很多心路历程,但是会上不会讲这些事情。


    确实有很多公司、很多厂商出来,去帮助企业解决怎么样用好开源数据库,怎么去替代传统大型集中商业数据库,一系列的问题都会有。慢慢这两年大家也确实务实了,我也负责过类似的工作,我跟领导的说法是,我们讲去IOE从来不是DBA的事情,或者不完全是DBA的事情。更多是对你整个应用体系架构的改变,所以要有个清晰的认识,我今天去这个东西,意味着谁要付出这个成本和代价,这要有一个很清晰的认识。


    我总结了一张图,什么意思呢?左上角是精华。一个企业在什么情况下使用开源数据库,什么时候使用商业数据库,或者用开源软件和商业软件。在企业发展初期,你投入相对应成本的情况下,你开源收益往往低于商业收益,这个很正常。随着企业不断的发展,到了一定的规模,你会存在这样一个拐点,这个拐点之上你开源的软件收益要大于传统商业软件。


    阿里发展到一定阶段,因为你的商业软件无法支持你的服务你必须做这个转变,这是被迫的。我们不拿成本衡量了,这是因素之一,但是不是唯一的。你企业发展到什么阶段,你要做一个评估,你企业想去IOE,要去在什么阶段是最好的?如果一个快速发展的企业要应对你大量的业务变化,要上规模,企业要生存下去,这时候你要招很多人,投入很多技术资源做这个事情吗?其实是不知道的,这时候我们关心的是快速的活下去,你真正活好了,一定体量才可以考虑这样的问题。


    右边是因为这样一些东西,你才可以把这些事情成为一个可能。比如说硬件处理能力的提升,开源软件的成熟度,人才积累等等。正是这些因素,加之企业发展到达了一个阶段,这时候你才可以考虑是不是应该做这样一个尝试。


    我们会有定期的数据库排行榜,做数据库的大家都比较熟悉,是国际的排行榜。国内也有公司在自己做排行榜,它实际上是对数据库的搜索做排行,搜索相关东西做了排序,基本上可以把它作为热度的排序。


    现在数据库的发展还是属于比较稳定的状态,前面三大一直都比较稳定。我们国内也有人做这个事情,可能是MySQL到了第一位。国内很多传统企业包括互联网企业,慢慢在做技术的转型。在国外,可能更重视商业模式,所以对于数据库来说只要能支撑业务就行了。国外相对用Oracle的要很多,国内在搜索规模上比较小。我过去是做Oracle的,现在看Oracle,确实本身Oracle这个软件作为关系型数据库的引领者有二三十年的历史了,在数据库方面确实达到了一定的高度,很多人都在学他。


    MySQL我认为它不是做得最好的开源软件,但是却是一个最流行的,生态圈建设最好的开源软件。前两天开数据大会,你开Oracle大会屋子是坐满的,但是开DB2的大会可能会场就一半的人,开MySQL的大会人都在外面站着,确实在国内用得很普遍,体量非常大,这是MySQL做得比较好的一方面。


    过去一段时间MySQL走了一段时间弯路,卖给了Oracle,Oracle也不太理这个东西。后来Oracle对这一块也确实引起了很大的重视,这两年MySQL的社区版本、企业版本有很多变化,加快了自己更新迭代的速度。MySQL5.5、MySQL5.7、MySQL8.0,更新速度非常快。Oracle也感受到了危机,如果MySQL再向以前这么玩儿的话已经没法玩儿了,改变得也很多。


    第三个是底蕴很深,时间也很长,有很长时间的数据库积累。原来是首先与微软的Windows平台。如果未来支持了跨平台的使用,从应用型角度来讲是没有人跟它做比较的。


    下面是PG,我觉得是挺好的对象,我用的时间不长,但是是很优秀的学院派的开源数据库,大家可以了解了解。国外用得比较多,国内相对少一点。MongoDB也有自己的特点。


    搜索类的、文档类的,我们都可以找到这些身影,数据库不断在有变化,但是第一集团是比较稳定的,这是目前大概的变化。


    这是我自己的小总结,我看到了很多公司在尝试做一些东西,会弱化一些关系型数据库的特性,比如说跨表JOIN,事务等,做自己定制化的DB,这实际上是两三年前做得更多一点。我们可以充分利用开源数据库的功能,通过加入中间层达到高可用、水平扩展,很多公司也基于开源方案来做工作。集群数据库也有很多了,是很有特点的集群数据库。在某些场景下,建议大家考虑使用NoSQL,但是你要注意你的使用场景。


    因为我们公司就有这样的例子,大家以前没有使过什么东西,速度很快,把所有东西都放里面,不停的扩。其实应该规范使用,会面临这样的情况,所以要注意使用场景。


    还有硬件问题,传统数据库也还有很多的发展空间。比如说MySQL5.7,Oracle、BD都支持了新结构,自身功能里要不断加强,支持这样那样的特性,也要跟NoSQL做一些对比,实际上双方也是在不断融合的过程中。


    下面谈一下大数据,我本身不是做大数据的,只是自己有一些了解。所谓的大数据就是四个V,大家在很多会议、文章上都看到了:容量、结构、密度、获取方式。


    这是对技术发展做了一个评判,就是技术是什么发展阶段,是初始期、快速上升期、技术稳定期。这是2014年的图,这时候BigData在这儿,2015年的时候已经找不到了。什么意思?大数据从2014年、2015年的变化可以看到,已经不再是作为新兴技术存在了。为什么是这样的?我们现在讲所谓的大数据,大数据对应的是小数据。大数据是因为我们在过去的某一个历史发展阶段,我们面临着一些问题,比如说数据量大,数据格式的问题,导致我们必须用一种非传统数据库解决的方式来解决,我们起了个名字叫大数据。大数据一般都是什么能力?其实也完成了跟传统数据库变化不大的能力,也完成了存储计算的能力,在这个阶段我们叫它大数据,仅此而已。




来源:CDA数据分析师峰会:数据库与技术实战-分会场

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据分析师行业峰会 数据分析师行业 中国数据分析师 数据分析师 中国数据

沙发
admin_kefu 在职认证  发表于 2017-8-11 16:45:18 |只看作者 |坛友微信交流群


    很多人去学大数据技术,薪资也很高。其实现在回过头里看,大数据处理的也是数据,数据库处理的也是数据,都是做数据存储与计算的。谈大数据的声音越来越小了,因为这已经是常规的处理数据了,不用再单独强调这是大数据技术了。


    很多原来的大数据慢慢向关系型数据库,向老的数据模型靠拢,他们需要提供各种各样的能力。现在关系型数据库也往大数据靠拢,大家在互相取长补短,慢慢的在做融合。


    这是2007编程语言排行榜,SQL排在了第二位,我搜了一下最近这一二十年编程语言的排行榜,一般SQL排在10—20之间。一种语言能在长达二三十年的时间里,能稳定在前20位意味着什么?这个语言大家很喜欢。但是多少人会把SQL作为一个语言看待?这是数据库领域非常大的一个贡献,大家处理数据已经习惯于SQL接口了。我们可以看到各种各样的方案都要兼容SQL接口,大家使SQL都使得很爽,这也是为什么关系模型使了这么多年,大家还是觉得很好使,因为它能满足我们的需要,SQL就是为我们带来的很好的武器,现在SQL还没有过时,过去的关系模型还能在相当长的时间内发展,未来很长时间还要把SQL作为我们的武器,它是我们访问数据的一个利器。有多少人愿意在Hadoop上写程序?谁也不愿意,很多都是写HQR。有各种各样的东西出来都是这样的,因为大家使SQL特别爽。   


    下面谈云,云其实已经是很普遍的了。云上的数据库非常多,现在很多公司,不光是中小公司,有很多具有一定体量的公司把它的权限都放在云上去了。上云这个事情是很必然的选择,数据库上云也是一样的。当然我这里不特指公有云,也可能是企业的私有云。为什么我说上云这个事情是一个必然的选择?因为有后面的这个问题。


    如果你的公司现在没有上云的计划,你就要面临这些问题。这个小人负担很重,要背一堆东西,这些东西你都要自己解决掉。你可以看到很多公司的人自己会做各种各样的平台,去完成这些事情,特别是有一定体量的公司,每个公司都有自己的一套标准,也有很多商业公司做这个事情,为什么?因为这对企业来说是很大的负担。特别像数据库这种很依赖人的原因,到一定体量必须通过一定平台解决这个问题,而且人的成本又很高。


    上云就是另外一个选择,我企业可以通过云上的管理把这些东西解决掉。所以我看到大量的新兴公司考虑上公有云,为什么?它很轻,很方便,可以快速支撑公司的服务。很多传统公司也会上云,因为我的体量大了,我必须要有一个方式便于我管理这么大的体量。无论是公有还是私有,都会考虑这样一个选择。


    这里简单总结一下,我们作为数据库的运维最开始都经历了这样的阶段。最开始是手工处理,然后脚本、工具、平台、云,我叫它“四化工程”。是不是你的公司也经历了这样的阶段?最开始我们公司什么都没有,一片人肉,文档标准化。把你过去做的事情标准,怎么样做标准呢?就是一步一步写下来形成文档落地,大家以后做事情请参照这样的文档。有数据库备份文档、迁移文档,很多。之后把文档落地,通过一些工具、脚本。你做迁移用这个脚本,做初始化用那个脚本。再往下我们可以通过一种方式让它自动的做工作,就有自动平台化,我们可以自动完成一些工作,或者通过平台,以更好的方式去运行它。


    到了这一步,再往下还可以做平台运维管理向两个方向发展,一个是智能化运维。随着你的管理规模不断发展,不断庞大。你传统运维模式就会发生变化,场上有类似于这样的想法,怎么做智能管理。所谓的云化是什么?把我的下层资源做云化的管理,这样有更大的灵活性和弹性。


    大家可以回想你的公司、企业现在发展到了什么阶段,大多数都是在这两个之间。能做到智能/云化的少一点。


    下面我谈一下硬件,最近这五六年硬件的发展确实对数据库的发展影响相当大。我们可以看看,大家最熟悉的CPU,这是最近40年CPU的发展。通过这个图大家可以看到,CPU处理能力还是在不断增加,CPU整个还是在发展,但是主频已经受到了限制,不变了。变化的是什么?CPU核心数提升了很多,这导致整体效果CPU还在涨,但是涨的不一样,现在大家拼核数。这个地方出现了Wumber,一个服务器核数越来越多。


    一般情况下数据库真正的资源,CPU不是它的短板,还是共有的,经常出现跑不满的情况。所以我们经常会看到多实力混部,CPU还是比较赋予的资源。


    除了CPU还有什么?这是另外一张图,可以看到另外一种处理器,GPU。CPU和GPU有什么区别?我也没用过GPU,找一张图给大家对比一下。我看到了越来越多的数据库尝试使用GPU帮你解决一部分数据库计算能力。我通过CPU画一张图,是这样一个喷桶,按照指令画出人脸,包括眼睛、嘴巴。GPU的处理方式很简单,你先构造一个图的像矩阵一样的喷管,把颜色对应好,喷一下图就出来了。这样大家可以比较直观的对比CPU和GPU的区别,GPU适合干相同类工作,大数量的处理。你有这样的操作,可以到GPU上干,会比CPU更有优势。


    这是一个卡,里面签的是FPGA卡,它不推于CPU和GPU,前两者是通用的处理单元,我们要给它编码做事情。GPU不是,是相当于把我们的逻辑通过硬件固化下来,是按照既有的处理逻辑做一件事情的,而不是通过灵活的通用的设备做。灵活通用的设备意味着效率不够高,但是FPGA是固化的逻辑。


    可以看一个简单的对比,CPU、GPU、FPGA在吞吐量、功耗方面有着巨大的差异。最下面的ASIC也是专有芯片,我们确实看到有些公司在做一些尝试。比如说实时数据列分析,在主机后面插一堆GPU卡,扩展你的能力。包括微软、百度都有这样的尝试,在数据中心部署大量的数据。这就给我们带来了很多过去想象不到的能力,怎么处理海量数据,以非常高的速度去完成。大家脑子里不要想我只有一个CPU,还有很多其他的选择。


    这是关于存储这一块的,这两年发展得特别快。这是英特尔的一张图,列举了传统的存储,包括了内存和外存的简单对比,包括延迟和带宽对比。NAND闪存,3DXpoint和DRAM和SRAM,对比非常风险。现在很多公司对NAND的使用已经很常见了,性能会有提高。现在就有一个问题,SSD的价格问题,虽然现在价格已经很便宜了,但是相对其他还是有点贵。现在有36层、48层,以后会有更多的都出来。


    到2020年SSD真正钱的成本已经会低于HDD了,公有云厂商会提供基于闪存的数据归档服务,这是过去不敢想象的。为什么?因为价格确实很便宜了,特别是NAND的的推出。


    3DXpoint是英特尔新推出的标准,是在内存和闪存之间的产品。它提供了更强的能力,这对于我们来说意味着什么?其实还不知道,因为现在还没有对应的东西出来。但是我们想象存储产品已经推出了这么好的能力,包括NVMe。未来我们会发现,做数据库的痛点是IO,现在IO已经不是痛点了,有这么多东西帮我们解决IO的痛点。现在随便一块卡可以达到几十万、上百万IOPS的能力,过去的短板现在已经没有了。


    网络技术最近发展也非常快,可以从饼图看到三大块。第一块是带宽不断加宽,万兆现在已经很常见了,40G、56G、100G、200G的都会出现。延迟也会降得非常低,未来几年会有一个明显的降低。包括RDMA技术,可以降低CPU消耗,这对我们来说分布式数据库春天到了,我们可以感一些ScaleOut的事情,现在网络发展得非常快。


    我们的硬件技术确实在最近一段时间发展得非常快,也为我们下一代数据库提供了可能性,比如说分布式数据库,在未来几年随着硬件的不断成熟,对数据库不断的发展成为了可能。


    我们过去是软件引领硬件,现在好像到了硬件引领软件的程度,我们的数据库还没有准备好这些东西。这么好的一些硬件我们怎么发挥能力?数据库还没有做好准备,我们硬件好像第一次领先了软件。


    新兴数据库也不断涌现,NoSQL硬件用的好像更好一点,传统DB受固于几十年发展能力,我们发现有很多这样那样的问题。对于我们来说,过去很多思想也发生了一些变化。我们怎么做故障诊断分析,聚簇因子不再重要了?NoSQL好像适应的更好,分布式数据库的春天来了,数据库化还重要吗,这都是我们要考虑的问题。


    另外就是虚拟化,一个是计算资源的虚拟化,一个是存储资源的虚拟化。虚机很多,我们可以把有限资源打散。还有就是存储的虚拟化,我们把存储通过虚拟化软件连在一起,甚至SDS这些都可以做整合。作为数据库资源来说,可以做一些高可用、本地保护,这都是虚拟化的应用,对数据库来说也是共生发展的。随着虚拟化的不断成熟,也可以有更多的设计空间。


    还有一种就是所谓的容器化,最近也比较热。从我的角度来讲,我在年初的时候也在考虑,我是不是要上一套东西上到容器里,是比较好的选择。阿里、京东都在做,他们有很大体量规模的容器承载他们数据库的业务。我也看到很多公司没有这分析的尝试,因为公司发展到不同的阶段,需要思考的角度不同。如果你公司想把你的数据库做容器化,你要问自己为什么。在我看来,95%的公司可能是没有必要做尝试的,为什么?因为你完全可以通过其他的手段达到一定数据库的弹性,提供一个类数据库云化的服务,而不需要通过容器解决这个事情。


    如果你为了引入容器,后面有一系列的问题,你是不是hold住?有一系列的问题,不详细说了。


    数据库管理的变迁,这是前一段时间炒得比较火的帖子,亚马逊数据库可以支持所谓的自动调优。卡耐基梅隆大学做的,他是基于机器学习的东西,有这样一个原理。它会收集你数据库运行情况,比如说我想调整响应时间,根据这样的指标看什么的参数组合对你里说是有效的,这个事情已经不需要人去做了,它会帮你做这个事。


    这个帖子出来之后有很多人说,DBA是不是快失业了。我也跟阿里聊了,他也有类似的东西,有内置的东西想做这样一些考虑,昨天我还看了一篇帖子,写得也很好玩。机器学习这个东西会应用到数据库的管理领域,是很常见的事情。


    这些事情对我们来说DBA意味着什么?过去DBA就做这三个事:运维管理、架构设计、性能优化。如果是未来发展,这三个事还要不要做?哪些是有侧重的?这都是会对DBA产生冲击的。


    我自己做了一个简单的分析,DBA现在面临一个选择。给我个人感觉,确实DBA发展到目前为止,过去这样一种工作未来会怎么变化?可以这样讲,过去你是做传统运维DBA,你未来发展方向可能只有两个。一个是乙方公司,你要为客户的数据库做运维保障,要对数据库挖掘得很深,看数据库内核,有很多故障和难题,帮客户恢复。另外去一些云服务公司,去帮他搭建底层数据库的云,这是未来可以想到的两条出路。


    另外企业上云了之后,传统DBA还有多大生存空间?这是几个点。比如说开发,这是指本身数据库应用的开发,包括数据库内核开发。如果是运维类的,那可能是你未来的两个选择。另外架构类的,永远不会通过云解决,你要通过自己解决,而且这个不会随着时间变化而变化,随着你对企业数据的越来越了解,对业务越来越了解,你可以有更好的东西为企业付出,包括做数据分析的领域,数据治理。企业有很多数据,怎么治理起来?我目前也在做这方面的工作,包括更高层面的做数据管理以及业务。


    每个人都要成长到业务线里,跟业务打成一片,不能为公司很好服务的DBA不是好DBA。未来发展可能在你业务上就是一个亮点,这是DBA未来可能的一些方向。


    数据库这几年的发展非常快,原来你学一两种数据库就搞定了,现在要学更多。原来学一个模型就够了,现在需要不同的模型。数据库本身发展得很快,首先DBA不要怕变革,要勇于拥抱变化,否则你就要落伍了。但是要避免出现下面的问题,我经常看到我们的小孩,今天是Oracle,明天是MySQL,书一本比一本厚,他一本书就看一个礼拜,这会有什么问题?你不要盲从这个技术,要选择一个重点学好它,所有数据都是相通的,你学好一个会对你产生不一样的影响。


    无论是数据库技术还是其他技术,你要把它学到你自己的最高点。这个最高点对你意味着什么?意味着你的技术视野。我们要承认人和人之间是有差距的,是有天赋差异的。你到了这个高点之后可能没法再突破自己了,这就决定了你的技术视野、高度,你可以考虑做横向扩展,再学习其他的东西,甚至非技术类的东西,这会扩展到横向领域,这对你是有收益的。


    很多公司的CTO可能不做具体的技术,但是讨论问题的时候往往能一针见血,因为他过去达到了非常高的高度。虽然你现在的东西他不了解,但是他可以根据过去的经验快速定位判断。结合公司的自身情况,不要追求很高大上的东西,你要脚踏实地的做一些事情,在平凡朴素的业务中也可以发挥你的价值。


    最后要深入公司业务,真正从业务考虑,不是你优化一个SQL就行了,你要优化它的业务诉求是什么。最好的一句话是把SQL都优化掉了,我们可以考虑怎么去实现它,所以一定要深入业务,这对你来说是你为企业带来的最大价值,企业不在意你数据库多牛,而在意你业务支持的多好,我的分享就到这里,谢谢大家。



    韩锋:下面有请上海丛云信息科技有限公司总经理宫学庆先生。



    宫学庆:谢谢韩老师,各位下午好,很高兴有这样一个机会在这里主要介绍我们自己做的一款数据库产品,以及这个产品的一些特点,还有这个产品的实际应用案例。因为前面几位嘉宾比较多的在讲数据库行业的发展前世今生,历史、过去等等,我主要介绍的还是我们自己做的原生的数据库系统,它的最大特点不是基于任何MySQL的数据库中间件搭起来的,是原生的数据库系统,支持ORTP操作。


    很多同学、老师比较熟悉开源的企业,这些比较多的是倾向于分析应用,我们这一款数据库系统比较多的是在事务处理上。


    这是我们基于开源的数据系统自己开发的,在国有大型银行系统里也上线了,运行了3年时间。我们在市场推广上,或者向其他行业推广的还不是很多,主要精力在研发上,系统功能在不断加强,对数据库功能的领域支持也在不断扩展。


    整个系统架构是采用分布式的架构,底层是基于分布式存储,存储引擎完全是自己实现的。存储的原理是跟Hadoop类似的,实现多副本冗余。


    分布式系统比较传统单点集中式数据库Oracle相比,最大的特点是高可用、扩展性。我们在我们的系统中主要是基于了Raft协议实现集群的高可用,我可以搭建完整逻辑上的集群,数据可以在集群中做同步。跟中间件的解决方案,我们知道现在有很多基于MySQL上的中间件。基于中间件解决方案最大的不同,对用户来讲这样的用户平台完全可以把它看成是关系数据库,不需要做分布分表的定义,也不存在跨节点的事务处理,JOIN的一些限制。


    数据在底层,由数据库系统来完成划分。数据的冗余在集群中是多副本的,我们支持1—6个副本,能做迁移和复制。它主要是面向OLTP的应用,在很多分布式系统中,如果去掉了事务处理这一块,在分布式系统中完全可以把很大一部分,比较复杂,比较难做的事情扔掉了。


    这里面我们可以支持ReadCommited事务隔离级别,我们有一个内存的事务引擎实现集中式的写事务,避免在分布式系统中的提交。可能很多同学、老师都很熟悉,我搭一个MySQL的集群,如果有一个事务跨节点,需要做事务处理,我往往需要两阶段提交。在学术界来讲,一旦在你的应用中跨节点的事务,两阶段提交的事务超过10%的话,整个数据库性能会急速下降。


    我们支持SQL,可以直接使用MySQL的客户端来连,在协议上我们是参照MySQL的语法标准来实现的,基本上实现了SQL92的标准。


    这里简单看一下,目前我们能够支持的情况。传统我们用到的大多数数据类型都可以提供支持,日期、时间,涉及到数据计算的都可以。我们提供了几十种函数支持,包括字符串处理日期,聚集函数,包括在Oracle用到的分析函数、窗口函数,我们也做了实现。支持数据库的最基本概念,数据库、表、索引,我可以在数据库当中用任意的属性建索引,事务处理也都能支持。同时支持在数据库层面的用户管理、授权、回收权限的基本功能。


    这里花一点时间简单跟大家交流一下,有些嘉宾可能有疑问为什么会实现这一点。左边大家比较熟悉,这是传统关于数据库的模型。不管是MySQL还是Oracle,基本上都是在这样的模型下实现的。会分数据库引擎和磁盘,磁盘是原数据的这些管理,数据库引擎当中包括SQL解析、编译,查询执行器,缓冲器管理等等,会包括事务引擎还包括存储引擎,这是传统RDBMS架构。


    这边是拆成了多个部分,有几个部分,其中是用SQL解析、编译、执行计划组成的,它是无状态的,在集群当中可以部署很多个节点,所有的SQL都提交给这样一个进程。另外是存储引擎,CS这一块可以看成是分布式的存储引擎,这里面数据分片上有文件管理、缓冲区管理。除此以外我们在集群中会部署事务引擎,来实现数据库中的事务管理。


    跟传统数据库不同,在一个集群中我们有来做集群管理的引擎,这边是基于Raft协议容错的。


    OBASE系统我简单介绍一下,本身的特点我们主推的是多活部署,我可以在多个机房里布大的集群,在大的集群中查询节点和存储节点可以布很多个,可以把数据分布在这里。可以把整个集群部署在多个机房中,每个机房都是同时对外服务的。有的机房中有主管理节点,这可以跟多台备机之间通过Raft协议规律。几秒钟可以把备节点切换到主节点,数据库服务切换的过程中,查询服务或者处理服务,除了事务处理稍微受一点时间影响以外,大多数整个数据库会始终保持在在线的状态。


    2013年我们支持了一个银行的系统,2014年上B系统,今年有A类系统钱过来。银行当中用到的各个业务系统,所有的历史数据全部迁到了这个平台上,整个集群规模是达集群,在上海这边做了同城异地双活的部署。



    提问:140亿的记录,应该是分布式数据库,怎么把140亿通过刷新的方式做的呢?



    宫学庆:用户只看到我表里有140亿条记录,我们是按照主键做的,分成了一个个小的,我们是按照256兆来分的。140亿条表数据文件大小是在1.3TB左右。对于数据库用户来讲,看到的是逻辑独立的数据库,你不需要考虑我哪些数据在哪些节点上,数据的迁移、备份、副本容灾全部是数据库底层考虑的。



    提问:不会有跨结点的数据是吧?



    宫学庆:JOIN算法我们支持多种类型的,简单的数据量不大的话,可以把两个表拉过来,如果数据量很大的话,我可以从单表检索一部分数据,再把数据下发到各个节点,我们是支持多种专业算法的。



    提问:不同机房的数据库之间会有不同吗?



    宫学庆:我们目前管理节点是基于Raft容错的,比如我有三个机房,每个机房都有一个更新节点,肯定有一个主更新节点。事务的日志会发给两个备机房,只要主节点收到超过半数的日志同步消息我这边就可以提交了。只要不超过半数机房挂掉,这个数据是不会丢掉的。


    我们可以跨机房部署,一般你对实施性要求比较高的话还是建议做同城机房,因为做异地机房有物理性的限制,有比较高的延时,对事物的实施性有影响。


    跨机房容灾,当主机房出现故障的时候,基于Raft协议会自动选主。新主出现了之后,其他负载就可以迁移到另外两个机房。只要容灾不超过半数节点挂掉,数据是不会丢的,服务是不会停的,这是我们要推的第一个优势。


    第二个就是分布式系统,分布式数据库,我可以做在线扩容或者缩容。我们的数据在整个集群中都有多个副本,整个集群如果在三个机房中,我们会把三个副本分布在三个机房,同时保证对每一个机房都有完整的数据副本。这两个机房挂掉了,只剩下一个机房,但你这一个机房的数据还是完整的,不会丢掉的。


    当你机房中的负载不断增加的时候,我负载太高的时候,可以直接在机房中加机器,提高它的处理性能。后面我们也会有一些测试,大家可以看到这样一个效果。


    新的机器加上来以后没有数据,整个系统会做一个负载均衡,会把数据从其他负载高的节点迁过来。如果某一个数据分片机器挂掉了,系统会自动的判断整个副本数达不到基本的三个副本,会形成一个新的本,迁移到机房中。


    很多人对于国产或者自己做的数据库有担心,这样一个数据库是不是可靠?数据会不会丢?数据的安全性是有保证的。数据文件是冗余存储的,你没有同时超过三台机器损坏或者数据节点下限,数据是不会丢的。机房断电以后,重启是会自动回放更新日志的。


    与传统数据库相同的所有处理是用的WAL日志策略,日志落盘包括日志在主更新节点上,同时日志要被同步到超过半数的节点,这个事务对节点才是提交的,保证数据的一致性。


    一般部署的时候,不同机房,不同节点间会存在网络延迟或者抖动,两三台机器收到信息就可以了。中间经历了一次系统的扩容,从单集群20台机器现在已经超过30台机器了。


    我们定位也比较清楚,第一个面向的是海量结构化数据,简单来说还是关系模型。现在讲大数据一讲就是上BP,在关系化结构上可以达到几个TB或者几十个TB的数据规模已经不小了。理论上单表记录数没有上限,在银行历史库系统是2014年10月份上线的,当时做了两个双活,单集群21台X86服务器,40TB,单表最大140亿条记录,这张表数据文件是1.3TB。


    我们在银行这边也做了一个性能测试,对比了一下。我们搭了四台集群,不考虑容灾这些。MySQL加中间件也是一样,配了四台机器。我们单独跑了一个SysBench,从一个线程并发跑200个,每次测试跑30分钟,纵坐标是系统的TPS,我们面向的主要是事务处理。橘黄颜色这条线是MySQL的性能指标,基本上达到50个、60个并发线程的时候,TPS也就达到了峰值。1500TPS左右,这是3500TPS以上,在图上。有些人觉得这个数值不是很高,涉及到TPS,很多人在很多场合会听到更高的数字,这跟负载有感,包括十几个点查询、范围查询,插入更新和删除。


    这里要提一下,在负载不高的场景下,1—30个并发线程负载,MySQL中间件解决方案要比TPS性能要好。原因是这样的,负载不高的时候大家都没有遇到性能的瓶颈,对于MySQL+中间件来说,一个事务如果正好落再一个节点上,正好是MySQL的事务处理。对于我们来讲,要把一个事务涉及到几个节点协同来完成一个事务。

    在没有负载的时候,没有资源竞争的时候,MySQL需要跑几个毫秒的话,这个事务同样在没有竞争的时候我们要跑十几个毫秒,这是分布式系统所决定的,因为多了一些网络上的开销。但是负载上去了以后,会发现出现资源竞争了,MySQL中间件负载只有1500TPS。后面看一下在测试环境中,我对所有服务器资源的监控,可以看到负载的瓶颈,资源竞争的瓶颈是不一样的。


    这是跟刚才测试所对应的,上面是平均响应时间,可以看到这根线是MySQL+中间件解决方案,负载不高的时候平均响应时间不如我们好,在高负载的情况下平均响应时间上升的斜率是比较平缓的,下面是99%的显示时间。

    这是我们做这个测试过程中对服务器做的资源监控,第一类是做MySQL测试的时候,节点资源监控。我们一个是更新节点和管理节点,和查询结点和分享结点。第一行是CPU使用率,第二行是用的SSD固态盘,第三个是网络的IO。可以看到在CPU上,相当于每跑30分钟停一下,再跑下一个测试任务,中间有一个间隔。可以看到,在这里CPU对于MySQL的节点来讲不是瓶颈,CPU利用率很低。我们在管理节点和RS上利用率也是很低的,资源主要是消耗在MS和CS节点上,TPS达到了峰值以后,最主要的是CPU使用率达到了80%以上。


    对于MySQL来说它的的瓶颈在于每个节点的磁盘IO上,资源竞争或者性能竞争在磁盘IO上。对于集群来讲,MS和CS节点,本身是没有任何磁盘IO的,主要是用于写日志,一开始都是保存在更新节点内存中的,我们的磁盘IO主要是在日志上,是有顺序的。我们主要是以写日志的方式刷在磁盘上,是顺序写,对于固态磁盘里讲就是避免随机写。


    对于网络IO来讲,MySQL节点的网络IO很小,我们要大很多,原因是所有的事务处理,节点和节点之间要做配合,也有大量的节点和节点的传输。大家可以看一下数值,虽然比MySQL多很多,但是传输的数据量远远没有达到我们现在网络传输的瓶颈。我们万兆每秒钟可以传几百兆的数据,双千兆可以每秒钟传很多,我们远远没有达到这个级别。


    因此可以这样来说,我们能够做到比MySQL+中间件的性能好,原因不在于我技术有多高。我把磁盘IO瓶颈分散到各个节点上,用CPU和网络传输替换了磁盘IO的瓶颈。对于CPU来讲,这一点我们可以通过添加机器增加CPU的处理能力。


    我们一共用了四个节点的集群,其中三个节点是用来存储和查询的,后面我们把三个节点增加到四个、五个、六个,做横向扩展。在三个存储节点的时候,TPS是3565,四个时候是5945,五个时候5911,六个的6436,线性的不断向上增加。


    整个性能是在CPU上,我加了一个节点就相当于加了CPU的一个处理能力。数据迁移没有这么快,需要定时任务起来判断,把一些数据迁过去。


    后面介绍几个代表性,我们单集群刚开始都是21台PC服务器,目前来讲在生产环境中已经稳定运行了两年多了,30个月。日均交易量,包括查询是超过300万,数据量已经达到150TB。由于分布式系统的扩展性,可以不断通过添加机器把更多历史数据保存在系统中,单表超过140亿条记录。高并发情况下查询响应时间小于300毫秒,这不是简单SQL响应时间,这是从银行交易角度来讲。我做银行业务一整套的SQL,包括多条SQL银行业务,这个交易平均响应时间小于300毫秒。


    这是最早上线的一个业务系统,而且选这个系统最大的考量,历史系统对于数据的安全性、可靠性比交易系统要弱一点,任何一家企业在选这样一个平台的时候都有这样的考量。后面可以看到,2015年—2016年上线了新型的金融资产管理系统,这完全是一个业务系统。我利用我的订单和其他的一些资产做抵押,做贷款审批流程处理,贷中管理、贷后管理。这样的系统从数据规模来讲不是特别大,但是很有意义的是交易类型非常全。银行的业务来讲,包括批联机交易,业务流程类交易,各种交易都涉及,而且这样一个系统最早是银行当中基于DB2实现的,从DB2迁移到了OBASE平台上。


    原来供应链金融这样一个系统在银行中是用DB2做的平台,现在已经完全跑到OBASE上了,已经不月DB2了。在大型银行来讲,这应该是属于比较吃螃蟹的一件事情,最早第一家。


    第三个是最近在上的一个系统,网联支付。现在大家手机支付非常流行,大家用了很多支付宝、微信。不管是支付宝还是微信,你都要绑定你的银行卡,最终支付是要到银行去的。对于银行来说面临着这样的问题,第三方支付会有很多支付请求,对原来银行支付的系统会提出很大的压力。比如说在高峰的时候,每秒支付请求会超过10000笔,传统银行是没有这么高的支付请求的。


    去年之前,各家银行都是独立跟第三方支付机构做接的,跟支付宝、微信支付做接口。今年开始银监会推了一个网联系统,所有第三方支付都接到网联系统,网联系统作为转发的平台,对于银行来讲最大的挑战在于短时间峰值可以遇到比以前支付请求更高的。


    以前银行峰值就是每秒两三千笔,现在是一万或者更高的请求。做选型的时候一个是考虑了OBASE,另外考虑了DB2的解决方案。最后评估下来,还是选了我们这样一个解决方案。我们用了5台PC服务器,做压测,每个交易中包括5个查询,2个更新,1个新增,8个SQL。我们5台的时候能达到1.2万,每秒1.2万笔的TPS,用了OBASE这样一个平台,也比较符合OBASE的定位,就是高并发的事务处理。


    另外很多人会关注经济效益,原来老的历史库是4600多万,现在是1200万硬件成本,一个人来做运维。供应链系统,老的硬件成本是500万左右,现在300万左右,运维成本是30万和10万的对比。相比传统的数据库来讲,OBASE运维相对里说还是比较简单的。网联系统是新系统,所以没有经济效益的数据。


    最后总结一下OBASE平台,还是面临结构化的存储和管理,就是传统的数据库。主要支持高并发的事务处理,这并不是说我不可以做分析。道理是一样的,基于SQL也可以跑,只不过响应时间长一点。基于PC集群,总的拥有成本会比较低,这并不是跟X86比或者跟银行中的小型机比,总体来说低很多。分布式架构有良好的扩展性和可用性,这也是分布式系统最大的优势。另外我们有20几个人的原生研发团队,现在还是在不断的做版本的迭代。因为从银行的角度来讲,他不断的上新的业务系统,新业务系统中会涉及到一些特征,要不断的做支持。

    支持SQL语言是优势,大多数开发人员还是习惯在SQL语言上访问数据库。支持容灾、扩容,多活部署。

    我们这个团队是一个比较新的,背景是高校,包括我个人也是高校出身的,一直从事数据库方面的研究。从2013年开始转向做数据库系统的研发和应用,借这样一个机会简单介绍一下,如果大家有感兴趣的话可以做进一步的交流。谢谢。



    韩锋:感谢宫学庆先生给大家的分享,下面是来自威客安全技术合伙人安琪先生,掌声欢迎。



    安琪:今天主要是来学习的,因为我并不是一个数据库方面专业的人,并不太懂数据库,我们一直在做安全方面相关的工作。包括Hadoop,我们公司自己的一些产品也会应用到这样的技术,我们就对安全进行了相关的分析,总结了一些经验。


    为什么我们要注重Hadoop的安全呢?之前韩老师讲了,我们分布式的数据库的瓶颈不再是性能的瓶颈,我认为未来可能是安全的瓶颈。为什么?本身数据库就是存储数据的一个系统,包括Hadoop通过分布式的结构去处理大量的数据,包括人工智能、机器学习,都是基于Hadoop的底层技术。这样Hadoop就存储了PB级的数据量,国家非常重视大数据的发展,2017年6月1日也推出了《网络安全法》,里面明确规定,未来如果想使用大数据创造企业价值、社会价值的话,首先要保证数据的安全,就是Hadoop或者大数据平台自身的安全,如果做不到的话,可能会触犯法律,企业也将会受到相应的处罚。


    在我们接触的很多项目中,包括智慧城市、物联网、云系统的建设,其实越来越关注Hadoop架构下的自身安全。今天我主要剖析一下Hadoop十年来的发展,在安全上自己是怎么完善和发展的。


    首先看一下Hadoop的安全现状,包括Hadoop安全的历史。首先在2012年CVE公布了它的一个漏洞,主要是认证的时候没有做验证,所以导致了整个越权的访问,所有HDSF文件泄露。之后阿帕奇的这一块,可以对整个生态组件进行管控,但是由于Web漏洞造成了这样的事件,通过恶意的攻击者可以远程对Hadoop服务、进程操作,并且图取里面的数据。


    后面,包括数据文件,用户中间产生的数据,加密密钥存储到了同一个磁盘和文件中,这导致恶意用户获取了加密密钥,这也是出现了很严重的漏洞。包括后续,可以实现钓鱼攻击,结合底层操作系统,以及Hadoop的漏洞,可以实现恶意代码的加载,包括病毒的植入等等的攻击。


    2017年刚暴出来一个新的漏洞,由于Hadoop没有对整个输入过程中进行认证,而这个命令又是通过Root进行得,进行了全线账户的集权,这是2017年刚刚发布的漏洞。Hadoop面临着非常严重的安全问题,包括2013年的时候Hive,由于Hive是通过HQL进行类SQL语言操作,它可以定义脚本,可以对执行操作系统层面的命令作用,获得了整个Hadoop架构下所有的权限。


    举一个实例,2015年我们的友商,一家安全公司,自己做了态势感知的平台。这个平台实际上是通过大数据的技术,结合人工智能的算法,去解决用户的一些安全问题,可以通过机器学习方式,结合用户内部网络的数据,来考虑到一些风险,可以通过这个缩影看到Hadoop未来安全上将产生非常恶劣的影响,如果不做好Hadoop安全的话。


    刚才看了一下漏洞,我们总结了一下,整个Hadoop的安全漏洞,由于Hadoop自身业务特点一般都是部署在用户的内网当中的。所以在早期设计的时候就不是特别注重安全方面的设计,更多是实现业务的功能。现在我们分析,这些漏洞的产生大部分都是Hadoop访问控制权限负责做好,或者身份认证授权没有做好,这是Hadoop现在最需要解决的问题。Hadoop推出了认证体系,但是实际上也是不够的。


    早期Hadoop默认的状态下,所面临着一些安全的问题,包括身份的认证,首先它是没有身份认证和访问控制机制的,基本上是继承了LINUX权限账户体系,包括组的权限。以及对数据的加密,Hadoop在数据传输过程中和静态数据保存过程中,都没有进行有效的加密措施,可能早期是处于性能的考虑,不能在海量数据中引入加密的机制。


    以及我们说的配置补丁的管理,看起来没有什么,但是它非常重要。2017年勒索病毒事件,它利用的是S445漏洞,去年微软就发布了漏洞和补丁,大部分企业并没有打这个补丁,导致勒索病毒全世界的扩展。我们是不是应该防止这些恶意的人进行破坏,以及如何实时发现Hadoop的安全问题,以及出现的安全事件,就要通过审计日志的方式,以及API的安全性,应用层的漏洞,我们如何通过一些有效机制进行防御。


    还有很重要的就是脱敏,这是《网络安全法》里严格要求的,未来你承建大数据系统,企业向通过数据产生商业价值的话,必须对个人公民信息的敏感数据进行脱敏,要隐藏这些敏感信息才能对外出售你数据的价值,这一块也是我们需要进行考虑的。


    首先我们通过Hadoop面临的安全问题,反过头来思考,我认为Hadoop现在面临的几个要想实现安全的Hadoop,要从几个点看一看Hadoop哪些方面需要做一些安全措施。


    1.认证。Hadoop是否应该提供单点登陆,实现用户身份的认证。


    2.授权。我们要能确定什么样的用户可以访问什么样的数据级,什么样的用户可以请求什么样的服务,都应该进行相应的控制和授权。


    3.访问控制。那些用户能够访问具体的数据处理能力,进行基于角色的访问机制。


    4.数据加密。Hadoop在数据处理过程中中间数据的处理,安全的处理,以及在数据传输中的处理,以及在数据存储中的处理。


    5.网络安全。Hadoop访问的网络安全,是不是有一个有效的隔离措施,以及对业务行为的安全控制。


    6.系统安全。Hadoop是基于LINUX操作系统的,服务器安全要进行保障,包括病毒跟操作系统也有相关性。


    7.基础架构安全。Hadoop是基于什么样的安全架构来逐步完善安全措施的,这也是非常重要的。


    8.审计监控。Hadoop能不能对所有的用户行为、授权行为、访问行为进行有效的监控?并且通过这些行为识别一些潜在的危险行为,这是监控。


    通过这些安全因素,首先我们一步步来看,先看一下Hadoop现在的认证授权是如何做的。


    我们要了解Hadoop认证授权的安全,先大概了解一下Hadoop目前自身认证模型的缺陷。在默认情况下,没有开启任何安全防护措施的时候,Hadoop是什么烛台?这是Hadoop服务和数据块的图,它是分布式存储的。当用户登陆访问数据的时候,用户的权限是可以访问到它数据目录权限下的东西的,这时候非常不安全,因为Hadoop没有对用户组进行分类。当执行Hadoop命令的时候,这时候只是进行了身份的识别确定,这时候一个黑客可以自己编一个脚本,加到LINUX,可以模拟用户,甚至是Hadoop的超级用户,几乎所有的事情都可以干。


    2012年会爆出这些漏洞就是这个原因,Hadoop自身安全控制模型非常薄弱,而且现在很多企业用户根本就不开启任何Hadoop安全措施,因为嫌麻烦,效率也比较低。他认为在内网里,相当于是裸奔的情况下在运转。


    如果我们要想实现Hadoop的安全认证,包括阿帕奇,我要提高Hadoop安全从哪两个层面着手?


    第一是用户层面的访问控制,要对用户组进行机制,识别什么用户是什么身份,是不是合法,是不是有访问权限,我们必须要进行控制。


    第二是服务层次的,Hadoop生态组件中每一个组件提交作业,这个过程中他们服务之间互相的认证,这样的访问控制,不能被恶意认证进行请求。当然曾经也有黑客出现过,注册一个恶意的DataNote,在服务层面上是没有访问控制的。


    Hadoop就引入了Kerberos,Kerberos是Hadoop安全的基础。未来Hadoop所有的安全措施,其实都是基于Kerberos认证的原理才能做到实现。Kerberos其实是一个网络的认证协议,它可以做到在网络中不传输密码就可以做到身份认证,生成一个时间非常敏感的授权票据,是这么一个原理。


    Kerberos首先是由客户端向KDC进行请求,认证请求要通过KDC获得授权,这就是TGT,数据票据授权。

KDC就会返回TGT给客户端,给他目标服务器的时候给一个访问权限,失效时间一般是8—10小时。客户端和服务端都掌握了通信密钥,这是session key。提供TGT请求服务票据,这是第三步,这时候KDC再范晖目标服务器票据,这时候session key就变成私有的了,你只能跟你请求的服务端通信,通过session key加密这一段数据通信的过程,这就是私有的session key,它也有一个返回时间,大概是8—10小时。


    客户会拿着TGT找目标服务器,识别了客户端是合法的请求,返回自己的session key,再加密,两人就实现了传输通信上的加密,同时也实现了身份的认证,这基本上是Kerberos的原理。当然Kerberos可以应用到很多地方,不仅可以对用户账户进行授权的认证,也可以对整个生态组件进行授权的认证。它是通过文件分发到不同的节点,实现每个服务的Kerberos支持。Hadoop内部集群通过Kerberos就解决了身份认证的问题。


    Hadoop基于Kerberos认证就拥有了一定的安全能力,在Kerberos认证下的Hadoop,由于它实现了拥护和服务的认证,在整个交互的过程中是如何进行安全交互的?我们就要明确三个概念。一个是整个交互中,有授权令牌、作业令牌、数据访问令牌。


    授权令牌就是客户端去请求的时候,Kerberos会做一个身份认证,这时候会给客户端返回一个授权令牌,可以增加认证的效率。包括作业令牌,是为了保证客户端向Hadoop提交认证作业的时候,认证用户的文件权限必须是这个认证用户下的权限,这时候就靠作业令牌进行控制。还有数据访问令牌,一般是客户端先去请求,请求完了之后进行认证,发一个授权令牌。这时候如果身份合法,会返回一个文件块的ID以及位置信息,这时候客户端拿着这个信息去请求。这个过程中,这两者是有认证的,另外是没有的,这就需要数据块平台,这就平移了数据信息,一次授权、两次认证,是这样的概念。


    之后整个访问交互过程就是三步,第一步服务要向KDC注册,客户端向KDC的注册,通过授权令牌客户端的注册,还有数据块的注册,识别客户端相应数据访问权限,这是Kerberos实现了整个生态体系认证的结构。

    Kerberos是Hadoop的基础安全架构,我们还有网络安全风险。网络访问是怎么做的?首先作为关注安全的企业,往往都有自己的统一一套身份认证管理系统,主要是为了管理企业内部的终端,网络设备以及上网行为等等机制,会通过统一身份证管理机制。Kerberos如何和企业的统一身份认证管理有效结合?将会实现整个企业网络的生态安全,这是第一步。


    首先向Hadoop请求的客户端用户,需要在统一身份认证系统里注册身份,由EM系统向终端用户发放Kerberos的授权,也就是票据。这时候客户端拿着Kerberos票据向Hadoop集群进行请求,这个过程中,EM系统就需要和Hadoop的本地KDC进行数据同步,建立信任。目前Hadoop基本都是支持这方面的集成和接口结合的,首先要建立一个统一身份证认证管理机制。


    完善了之后,我们再来看Hadoop整个集群的网络访问安全的措施。现在主流的措施都是通过防火墙,防火墙把客户端和Hadoop集群进行逻辑隔离。防火墙对没有必要的端口,恶意端口以及无用的协议进行有效的过滤,之后通过部署网端服务器,里面装了很多Hadoop生态组件工具。用户就可以通过登陆网端服务器,对Hadoop集群进行维护和提交作业,初步实现了网络层的网络控制以及用户认证授权,以及行为的访问控制和过滤。


    随着Hadoop的发展,实际上Hadoop在网络安全上又引入了一些开源项目,基本的架构和上面是类似的,无非是多了HUE的安全功能,HUE提供了更完善的安全功能。它可以实现跟EM系统的身份认证结合,第二可以实现LDAP同步用户组的信息,同时也支持HTP的代理。可以通过这样一个用户认证协议对用户进行认证,就会更加安全,还有用户访问HUE的时候,这个过程是通加密的。HUE比传统方式基于Hadoop的业务又多了很多用户的访问控制规则,这是很有价值的地方。


    包括Hadoop网络又推出了一个安全组件,它是结合HUE和传统优势,还是以网关形式为代理,对端口、协议进行过滤,同时对用户进行访问,而且要单点登陆。它的功能有点类似于安全行业堡垒机+防火墙+入侵检测的功能,是这么一个安全的组件。


    Hadoop最重要的就是数据安全,毫无疑问,Hadoop所有的生态都基于它的数据,数据安全保证是重中之重。Hadoop中间产生的数据,用户访问数据的权限以及传输数据,静态保存数据安全的解决。它对传输的数据,Hadoop目前是采用SASSL协议,可以实现客户端向服务端请求过程中的数据加密。SASSL分成SSL和HadoopLPC协议。SSL是外部层面的,一般解决外部层面数据通道的加密。还有客户端请求的时候,走的都是HadoopLPC协议,以及基于TCPIP的协议,我们就必须分装SASSL框架。包括SSL还能支持GDBC的保护,以及Flume未来也是支持的。


    Hadoop最大的数据量是存储数据的加密保护,我们有两种思路。第一种是先加密后存储,但是它可能有问题。Hadoop是分布式文件系统,它把文件打成数据块存储。如果你把文件加密了,它存储的时候就没办法解密,这样性能会大大降低,因此这种方案是不太可行的。现在推出来的数据块的直接加密,我们直接把数据块加密了,把解密和加密都放在这个执行过程中,这样可执行力就非常高,扩展性也很好。


    现在有一个开源框架正在做这方面的工作,它利用的技术就是压缩文件处理能力,利用的底层技术就是这个。它自己做了压缩解码器,我们通过配置压缩解码器进行压缩,并且进行相应的加密。这个过程中在处理的过程中,把配置叔叔格式设置为压缩文件格式,以及对应的编解码器,在中间数据的处理过程中,包括把解密的密钥配置过来,或者直接读取,就实现了整个数据在传输处理计算整个过程中直接数据块的加密,性能和效率都非常高,开源项目也在做这一块。


    最后说安全审计与监控,最主要的我们要总结出来我们到底审计监控Hadoop的哪些问题,现有Hadoop能提供的支撑。当用户或者服务标识在KDC或者EM系统进行身份认证的时候会产生登陆事件,如果登陆错了也不行。我们要看看有没有非法的登陆请求,还有HDFS文件操作系统错误,存在越权访问的时候会在Hadoop日志来出现,我们要整理收集。还有RPC的授权错误,Hadoop安全日志就会记录下来,我们就可以识别一些攻击行为。还有HDFS的文件下载,是不是下载了一些我们不应该下载的文件,也要进行审计。包括MapReducs作业事件,执行审计日志的提交行为、启动行为、查看、修改行为都会被记录下来,我们也要关注这些日志。还有其他一些生态组件,每个生态组件都有自己的日志记录,跟阿帕奇一样。我们能不能结合这些日志做一些规则,统计分析Hadoop存在的已知风险,或者潜在的风险等等。


    这一块也有开源的组件,就是IBM的OSSEC,它是支持了目前Hadoop集群下所有日志的工作,而且原理是通过在各个组件里部署日志代理,去收集每个组件的日志,把这些组件统一汇聚到管理端,通过制定的安全规则进行筛查和报警。


    这是可以开启日志的方法,在相应的文件下进行设置,包括HUE的日志都有相应的文件位置,我们获取这些日志就可以了,可以对这些日志进行筛查和管理。


    最后总结一下Hadoop现有能提供的安全技术架构,Hadoop的关键因素,首先就是基础设施安全。一个是物理安全,我们就要保证整个Hadoop集群服务器的性能,我们要进行深入的考量。包括数据的可用性,容错的能力,包括机房的湿度,供电能力,还有Kerberos,这是Hadoop最底层认证体系,组成Hadoop基础的安全。在操作系统层面,我们采用的是主机架构基础,通过白名单的机制,对操作系统的服务、进程、端口、软件进行白名单规则控制,让非法攻击进不来,包括操作系统的杀毒、补丁管理的工作。应用安全是通过HUE,提供一些应用安全的用户的访问控制。包括网络编辑安全,通过堡垒机和防火墙的技术,不仅在网络上实现了控制,在应用上也实现了控制,用户行为上也实现了控制。


    数据的隐藏,IBM做得比较好,就是数据脱敏。可以把公民的敏感信息,比如说身分证号隐藏,把Hadoop数据进行脱敏处理。还有数据加密措施,静态数据加密,通过压缩文件的能力对数据块直接进行加密。其有认证授权,还有安全监控与审计,IBM已经实现了相对比较多的功能,已经支持了Hadoop很多的生态途径,包括英特尔也在做这方面的工作,这是Hadoop目前的安全架构的介绍,谢谢。



    韩锋:感谢安琪的分享,下面是本次会议最后一位分享嘉宾,是来自于灵雀云的高级工程师刘梦馨,有请。



    刘梦馨:我给大家讲一下AWS如何兼容MySQL,我先讲一下Agenda是什么东西,再讲一下设计,以及宕机的恢复和星梦指标。


    首先讲一下数据库的背景,大家如果用AWS会知道,它跑了很多数据库。AWS自己有一个数据库,兼容MySQL,2014年内部测试了。2015年可以用,现在在中国还没有上,大家可能还用不了。


    说一下特点,它完全兼容MySQL5.6,做数据库的话这是很难的事情。AWS用了什么方法,后面会说到。它是六个副本,可用性是四个9。保证了宕机恢复是10秒以内,比较亮眼的是可以达成原生MySQL5.6的吞吐量,所有的技术细节都是在今年论文上它都介绍了。


    首先讲数据的持久和高可用,对于数据库来讲最重要的还是持久合高可用方面。六个副本在三个可用区,简单讲一下AZ概念,相当于是同城异地三个机房的概念,有独立的供电和网络,就可以保障故障域是隔离的。每个AZ之间有专线相连,延迟2毫秒。


    六个副本如何保持一致?做分布式存储的都知道,这是很麻烦的事情。AWS采用的是用NRW协议,对六个副本我要写入四个才算成功,至少要多到一半,这样就可以把数据返回了,类似于投票的该连。既然是不保证每次六个都写的话,肯定会有一些空缺,那就会在后台把这些空缺填上。


    他会把MySQL异步的同步到AWS最早的产品,在所有的副本都挂的形式,我也有这样一个兜底的方式。这个6是很奇怪的数字,大家如果做的话一般是3个或者5个,他选择6个,是很奇怪的。


    3是大家比较常见的数量,对于我们来说,一个高可用的MASTER三选一就可以了,但是AWS是提供了很多服务的,很多用户可能会有同时上万个数据库跑。如果他只有三个副本的话,AZ之间网络可能会出现问题,如果是三个副本的话相当于这个时刻你所有用户的数据库都是2/3的副本数。某个AZ里面及其宕机还是会发生,不是所有用户都挂掉,但是肯定有一台机器会挂掉,对某一个用户来说已经是1/3的副本数了。对于AWS有成千上万的用户在跑,是不可以用三副本的,这样就意味着出现问题,你有一个副本不可用,这种情况下数据库还是可用的情况才可以。


    考虑比较极端的情况,AZ已经通过访问了,里面又有一台机器挂掉了。属于你是六个副本数,相当于你是3/6的副本数可用,写入数已经不行了,因为你没有办法写到多数。但是还是可以读的,读到一半。这时候就可以做一个恢复,有三个副本数我可以读,可以很快的恢复出一个副本数。这样有一个挂掉了,我们还是可以恢复到4/6。


    但是如果做数据库恢复的话,这是很长的时间,在很长时间内再有一个机器挂掉了,又是很头疼的问题。如果恢复时间很长的话,你的可用性还是会受到很大的挑战。我们再来看一下这个情况AWS是怎么处理的,可以看一下左下角是传统的数据库,如果你是全量的做个更新是很耗时的,会再做一个分段,他是10GB,10GB的小段,这样只恢复10GB的数据就好了。你即使出现了AZ挂掉了,但是你里面又有一个机器挂掉了,这样我10秒钟就可以迅速把你恢复回来,特别极端,特别特殊的情况就不考虑了。


    这样的操作带来的一个好处,相当于副本是可以自动恢复的,对于运维操作是很大的方便。我要升级节点的软件,升级系统,没有必要再做数据迁移了,把节点下掉,直接做软件升级、更新就可以了。我硬件已经挂掉了,硬盘要送修,也不需要做特殊处理,加一台新机器上去就可以了。


    计算机的点可能只有四核的能力,但是我卖出去了十六核,这有可能出现数据热点,有一个用户把其他用户给挤占了。这时候不需要做太多迁移,只要把这个用户节点上的数据干掉,他自动就会迁移走了。这种分段加自动恢复的模式,是很友好的模式。


    但是多副本肯定会影响到性能,EBS是三个AZ,是网络传输的过程,网络IO是很昂贵的,而且是六副本,这是比较高的副本数了,你把你写操作放大了六倍。很有可能你是同步操作的话,速度取决于你返回最慢的速度,会把你整体往下拖。如果是原生的设计,是不可能达成宣称的5倍吞吐量提升的。


    下面看一下究竟是通过什么样的设计来达到5倍的吞吐量的提升,先看一下MySQL的情况。有一个Primary节点,有Replica节点。可以看到MySQL是同步的,可以把一二和四五合在一块看,是本地存储。本地存储写完之后把所有消息同步到Replica节点,再回来。相当于你有一个Replica,IO就完全放大了两倍,如果这时候考虑六个节点的话,这可以想象到这不是可以忍受的事情。


    我们看一下MySQL为什么要这么做,实际上你写个DATA就可以了,不需要写这么多LOG,而且还有这么多种类。他这样做,其实是因为他不相信你底下的存储是可靠的。操作系统有可能会缓存,会断电,我并不一定能真写进去。他为了防止这些情况,他才需要有这么多LOG。他不相信本地存储,就更不相信其他的了,他的操作就都是同步的,这是MySQL的设计。


    是不是所有的LOG,DATA都是必要的?如果底层是可靠的,我存储就是不会断电的,MySQL是不是还需要做这样一些事情?


    先来看第一个事情,是不是所有数据都是必要的?事务一般是通过LOG来做的,可以看成是右边的一个事务,我插入一套A=10,然后A-5,这是完整的LOG。我们可以计算出A是多少,类似于写代码管理,你就没有必要记录最终的代码,你只要记录最初的代码和变更就可以了。


    现在的数据库或者很多存储结构,基本上都是写LOG的形式,不会记你最终的数据结果,整体效率会高很多。所以对于刚才那种情况来说,其实没有必要记住那么多东西,我们只要记住这一点,可以重写数据。但是我本来只需要读一次A=15就可以了,但是现在要读一长串,后台就会定期把你日志做一个聚合,这样方便读取的性能。


    MySQL做了太多的事情,都是跟你的SQL处理没有关系的,都是在性能上的东西。如果我们把MySQL存储节点做分离的话,MySQL就不需要关心跟存储相关的事情了,他认为存储是可靠的,可以专心做SQL相关的事情。


    这是论文里面的架构图,这是Primary和两个Replica的实例,他们可以共享存储节点。写入都是通过Primary,写入的时候Primary除了会把它写下来,还会同步到每个Replica上。这就不用做IO操作了,之所以把它们传过去,就是为了更新本地的缓存,这是为了用户性能的提升。


    我们看一下,最终还是要写6个节点,大家可以想一下,延迟是2毫秒的话,一个线程1秒之内只有500个,这个性能还是不的的。网络IO是同步的话,你性能依然是上不去的。我们看一下AWS这一块改得很精细,做了一些操作。


    我们传统的MySQL写入一个事务是这么一个过程,写入磁盘操作是同步的操作,需要等待磁盘写入完成之后可以返回做下面的事情。AWS这里的事情就是说,我的LOG会分成两个线程。我直接把LOG直接打到INCMING CUEUE里,然后返回到ACK。当我完全写入了四个节点,再成功返回给MySQL,MySQL这时候有另外单独的线程,这是专门写入成功或者失败的ACK的。等到返回消息之后,再说你这个是正常还是失败的,实际上它还可以处理其他的。


    相当于单个来说过程是变长了,但是你这个过程中是没有同步等待的,相当于所有操作都异步化了,可以通过CPO的时间让等待时间下降。你至少要读三个节点,最少也是两毫秒,你单线程的又退回到500也不太好接受,但是读的话就容易很多。


    你在本地根本没有必要下降到底层,直接从本地就可以返回了。即使你本地缓存没有,但是你MySQL可以记录你当前所有的事务,他是知道哪个存储节点完成了哪些操作的,他可以直接找到这个存储节点,也是一次就可以找到我对应的去哪拿到真正的数据。只有在MySQL都到了,完全没有信息的时候,我底层数据库需要恢复数据的时候,需要考虑哪些节点是最新的,哪些数据节点是可靠的。


    再讲一下它的故障恢复,传统的MySQL的故障恢复。传统DBA每天都会进行备份,或者云上每小时做一个备份。如果是MySQL的话,就要重新把LOG重新执行一遍,才能恢复到当前。如果你业务量很大,每天写入更新请求很多的话,你所有的东西都要执行一遍。小的话10分钟,如果是大的线上业务需要很长时间才可以恢复过来。


    MySQL还有一个半同步的机制,可以保证你在主库执行了一个事务,同步到图库上。它会带来一些性能的开销,并不是特别推荐使用。


    再来看一下AWS的做法,AWS实际上是把计算和存储分开了,真正的数据恢复都下沉到nade来做了,如果你有一些LOG没有同步到其他节点,它是可以执行到其他节点的。数据库时间长了,大家知道硬盘上会有坏块,文件坏掉的情况。在这种情况下会定期的做一个检查,也可以把一些坏块修复。当MySQL起来之后,我不需要做太多的事情,因为底层存储已经同步好了,这时候要做的事情就是把MySQL当时没有执行完的LOG执行掉。我断电的时候还没有执行完成的,我把它都给运行掉,不要有一些垃圾在就可以了。这时候你的存储键是不受影响的,只要处理当前没有处理完的事务就可以了,基本上是10秒之内就可以搞定的。


    剩下就是AWS自己做的性能对比,这是主节点的性能,随着CPU的提升,可以看到写入和读的每秒的情况,MySQL5.6和MySQL5.7,到2xlarge实际上已经没有什么其他的同步了,这边会限制住,差值已经不只5倍了,前面也是专门跑的读和写的请求。


    还有几个其他的例子,左上角是根据库不同大小跑的,随着数据库不一样,MySQL下降的还是很厉害的。到100GB的时候,只有1GB的1/6了,基本上没有明显的下降,只有到ETP的时候有明显的下降,这也是好几倍的差距。


    还有对并发请求,上面Conneetions的时候下降得比较厉害,这时候Aurora性能起来保持得比较稳定。最后是延迟的对比,在数据库架构层面其实没有什么改动,还是比较传统的一写多读的情况,你读库和写库肯定有延迟。Aurora传输量很小,不用传其他的东西,延迟也可以保证很小。每秒一万写的情况下,从库主库延迟还是在10毫秒以内,但是对于传统MySQL来说这个延迟就已经很大了。


    总结一下它设计上的东西,首先是通过六副本,是出于公有云的特殊情况,所以会有一个看上去很奇怪的数字。把每个副本都进行了10GB是的运维和故障恢复的保障,保障它的可用性和数据持久。比较独特的特点就是log as database进行流量传输,是用了比较先进的数据存储的方式。


    还有比较多一点的工作,就是把MySQL原有的事务保障的功能都下沉到下面的LOG SERVICE来做。给我们带来的启发是,MySQL做的时候并不知道你底层系统、底层存储是什么。但是AWS底层存储和系统都可以定制,我可以给你MySQL提供安全可信的系统,你MySQL就不用做这么多的事情了。传统一些软件可能都是在单机的情况下考虑的,但是如果你卖给一个云厂家,或者云厂家自己想做MySQL,它可能会有一些独特性的优势。MySQL已经这么做了,之后redis、es、Hadoop云厂商会不会给你一个单机厂商提供更高的动力?实际上后续版本已经很快会放出来了。


    Hadoop底层存储系统是可靠的话,是不是就可以不做多副本了?你原来传统的原生软件,一个云厂商想跟你竞争的话,你有没有想到他们究竟会比你有什么样的优势?


    大概就是这些,这是我的公众号,如果有什么问题可以跟我一块讨论。



    韩锋:感谢刘梦馨,感谢坚持到最后的同学们,本次分享到此为止,谢谢大家。







使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-23 22:34