江迅谈阿里巴巴数据架构设计经验与挑战
如何做到蒲公英模型呢?我们有一个概念叫列交换。因为这种指标化如果之间见不能相互解耦,最终目的还是无法实现,所以在某个指标过时的时候这个指标能够快速下线而不影响其他指标,这种功能在基于SQL的架构中是无法实现的,因为你必须把这个指标有关所有代码全都改一遍才能把它下线。我们希望做到的是每个指标都是一个独立服务,这个服务能够快速加入也能快速下线,这是我们想做的。这与我们目前基于关系型数据库设计有关,因为现绝大部分的数据分析都是基于关系型数据库模型,所以我们现在这个模型实际上是基于KV这种结构去设计的,我们认为所有数据都是基于key/value/description这么一个三元组,这个三元组足够描述一个对象的属性。你可以按照不同的方式组合这个三元组,假设这个数据你要去使用的时候,你是想按照对外提供访问的,那么你就可以把这个三元组,这个KV对应的三元组能。比如把一个Key的数据能够放在一起,那么这样的话,你就能够支撑,对这个人,你想要知道这个人他的所有数据,就能很快的拿到,那如果说,我是要把他做分析的,那么实际上你就可以把这个三元组,把某一个Description16:29放到一起,那这样的话,我就可以知道说,对某一个属性,它的有多少个不同的值,这个是说,我们可以,当你把所有的这个指标,把它都拆解,抽象化后,你都会得到这么一个KV对,这也是其实我现在理解,为什么由此以后他会变得这么热的一个原因。
你可以把所有这种对象描述做成一个KV描述,这样你能够很方便地组合,我能够很方便地添加。例如我能够set一个对象,这个对象可以是没有这个架构的,这不像关系型数据库,它必须有一个列,如果女性增加一个属性比如服装的颜色,你就必须有一个字段颜色来支持,如果没有就必须增加一列。但如果是KV结构就不需要了,只要set属性就可以了,而且不需要预先定制。因为每个对象属性会越来越多,特别是现在,我们做用户分析的时候,实际上每个人对用户的理解都不一样,例如我们会分析,你是杭州人吗?你是个高价值的人吗?是男人吗?会给每个人打上各种不同的属性,每个人的属性都会不一样,因为每个人不一样。如果说一个对象要打这么多属性,可能那张表有几千几万个字段,数据库也能够支持,如果我们的模型能够把每个人不同的属性不断插进来,把出去,这个就变得很方便。我想看这个人的信息,我就可以把这个人所有值都拿出来,我想按照区域来看,就可以只把区域这个东西放在他一起,我就可以把杭州关于这个人的信息全部筛选出来,而且这个根据每个人的想法不同可以不停地增加,它不需要DB给你增加字段,要求做性能测试。一个做PI分析的人,或者一个业务发展人,他只有有想法就可以把值加进去,然后这个属性马上会回到系统里去,它能够被另外一个人筛选,这样整个数据统计就变成一个回环,前面系统收集到这个人的属性,紧接着这个数据就能被BI分析,而且整个过程不需要人工干预,系统自动支持。我们的数据库原来打算用IBM小机,从590升级,后来我们发现,590已经插满了,你怎么升?没办法升级,往上扩展也不足以支持应用,所以只能水平扩展,这必然要求有一个健壮的分布式机制,我们现在来看NoSQL,不管是Hbase、Cassandra,还是MongoDB,它们都是利用这种廉价PC来支撑整个系统,都是基于对象描述建立不那么复杂的关系模型,它对对象进行抽象、简单化,让整个系统获得非常好的扩展性。尤其对网站而言,我们愿意为了扩展性去牺牲比如一致性等,因为如果不能扩展,就不能支持业务增长。前段时间,Facebook上有一家公司Zynga,它号称一个星期要增加一千台服务器,这种增长真的是每天一个PB,一个星期就一千台服务器,这种增长,它里面更多的是视频这种信息,但确实,我们会越来越多看到这种PB级的数据中心或者说数据量,雅虎已经有60PB的数据,像这种你没有办法,你只有用这种KV分布式支持,我并不是说完全是NoSQL,我觉得我们现在谈NoSQL都是说它不仅仅是SQL,如果说是SQL,对我们分析而言或者对网站而言,SQL是一个非常简单易用的工具,我觉得没有一个语言比SQL更简单更易懂了,比如我要做一个聚类,用GroupBy就行了,要做去重,用Distinct就行了,这整个语言都是非常简单的。90%的数据需求通过SQL都能快速支持,包括Facebook的,他们也提到说整个Facebook数据开放,把HQL开放给整个部门,90%用Java没有用MapReduce,就是用HQL去写。因为这个任务非常简单,每个人都能理解它,只有被更多人使用,这个数据才能发挥它的价值。
但是SQL确实有很多场景支持得不好,这个时候我们需要有一些不同的方式来支持。我对NoSQL的理解是这样的,首先它不仅仅是一个SQL,它并不是说排斥SQL。另外,我觉得NoSQL有几个核心点或者说核心概念,它是一个可扩展的系统,我们要求系统的扩展性非常高。另外一点是它的架构,它是一个自由架构的结构,它不像关系模型一定要把架构制定得非常严格,这是我的理解。第三点是它基于大量PC结构来支持,因为现在PC很便宜,单机性能很高,它能够通过机柜堆叠来扩展以达到比一个小型机更高的性能。我理解NoSQL是一个过程,或者说,NoSQL对我们来说是对现有架构的补充,并不是说它一定要把谁干掉。