NoSQL专家王涛访谈:为什么我们还要做一个NoSQL?

来源:互联网 发布:php执行exec 编辑:程序博客网 时间:2024/04/30 15:10
ChinaUnix:各位网友大家好,今天有幸请到王涛先生到CU做客,与大家交流一些工作经验。首先请王涛先介绍一下自己。
王涛:大家好,我是王涛。过去八年里我一直在IBM多伦多实验室从事DB2引擎研发的工作。这两年我转向NoSQL方面的研究,作为创始人之一现在是巨杉软件的CTO,主要负责SequoiaDB非关系型数据库的研发。

ChinaUnix:您开始是从事DB2的,现在从事大数据和非结构化数据相关的NoSQL技术,能和我们说说是什么促使您做出上述改变的?
王涛:这个问题很有意思,可能在很多传统程序员和DBA的眼里,Oracle,DB2,MySQL才是王道,NoSQL只是市场上的搅局者。实际上根据我在IBM和全球很多财富500强的DB2用户交流的经验来看,传统的数据库确实有很多不适合的场景和技术局限性,其中主要的局限性包括数据模型僵硬,可扩展性差,处理海量数据时的性能瓶颈,缺乏处理半结构和非结构化数据的能力。关系型数据库一统市场的时代已经过去了,这也是我为什么离开IBM创业的重要原因之一。
最简单的例子,有一次美国某著名零售企业巨头要增加64个数据库节点,IBM调动了十来个人,配合他们的DBA 团队,24小时轮岗,在那边驻扎了超过一个月才扩容成功。而在如今企业中数据量越来越大的背景下,这种扩容速度在广大企业中是完全不可接受。
另外一个典型的例子是欧美很多大型金融企业都是经过了许多的兼并重组发展起来的,由于传统关系型数据库死板的数据模型,不同实体之间的系统整合(特别是客户和CRM系统)通常费时及其成本高昂,甚至有时不可能完全整合,这大大影响了兼并重组后的规模效益,现在NoSQL灵活的数据模型已经完全解决了这个痛点,NoSQL成为了这一场景的典型解决方案。
一说起NoSQL,人们通常认为这只是互联网才需要,但大家可能注意到我上面举的两个例子都来自传统行业,业界预测NoSQL特别是文档型NoSQL在未来2-5年内将会规模进入传统企业。这是我离开IBM创业的另一个原因,因为传统行业需要企业级NoSQL!

ChinaUnix:既然已经有了不少开源NoSQL项目,你们为什么还要做SequoiaDB?
王涛:如前所述,业界预测NoSQL特别是文档型NoSQL在未来2-5年内将会规模进入传统企业,传统行业有许多企业级需求并没有在已有的文档型NoSQL产品中得到很好的满足,例如事物,SQL支持,和Hadoop系统的整合等等。
以上这些功能需求都是由我们的传统行业客户在实际项目中提出的,在SequoiaDB v1.0 中已包含了这些功能,在我们的下一个版本(v1.2预计在9月底发布)我们将会增加数据压缩功能,同时索引和数据可以在文件系统分离以提高读写性能,并且可以运行在IBM power 机器上,这都是我们的竞争对手所没有的。另外,我国人口众多,很多应用产生的海量数据是欧美其他国家所无法比拟的,这对于处理海量数据的NoSQL数据库会产生不少定制化的需求,对于大多基于北美的NoSQL产品这是无法兼顾的,开源数据库引擎的定制化改动不仅仅需要较强的研发实力,同时也只有原来引擎的研发团队才能完全驾驭。这是为什么SequoiaDB未使用任何开源数据库引擎和代码的原因之一。最后,并不是传统企业才需要企业级NoSQL,其实除了拥有强大研发实力和无限资源的大型互联网企业之外,我认为广大中小互联网企业也需要企业级NoSQL。相关论述可以见这篇文章《企业级NoSQL与开源NoSQL的区别》,我在这就不重复了。

ChinaUnix:有人说NoSQL是未来数据库王道,您怎么看的?您认为NoSQL与关系型数据库相比,各有什么优缺点及适用场景?
王涛:我个人认为,关系型数据库和NoSQL将会长期并存,NoSQL现已是互联网公司的标配之一,业界预测NoSQL特别是文档型NoSQL在未来2-5年内将会规模进入传统企业。
下面谈谈NoSQL与关系型数据库的对比,关系模型把过去混乱的数据存储关系用一种严格的数学模型描述出来,而其查询语言SQL则可以用简单直观的语法,把各个实体之间的关系明确地表达出来。而NoSQL与传统数据库的发展历史相比还非常年轻,因此NoSQL现在主要是作为一种对关系型数据库的补充,在关系型数据库不适用的领域填补进去。那么这个“关系型数据库不适用的领域”,这个范围到底有多大呢?这个就要看所谓的大数据到底能走多远。
大数据领域强调的是分布式计算,而关系型数据库为了维持强一致性需要在实体间进行非常多的数据交互。因此分布式计算就是关系模型的一个不大适用的领域。所以我认为可以这样总结,当需要强一致性的场景,最好使用关系型数据库。在分布式计算和高性能存储的场景,考虑使用NoSQL。其余场景现在看起来大多数人依然会选择关系型数据库,但有超过70%的现有关系型数据库场景其实是可以使用NoSQL的,随着NoSQL的发展,从成本和易用性角度出发,我相信越来越多的用户会开始考虑NoSQL的。

ChinaUnix:NoSQL技术纷繁复杂,各家大公司纷纷推出他们的大数据解决方案,开源的MongoDB、Redis、Memcached也纷纷登场,能给我们说说这些NoSQL技术的核心是什么?他们主要的差别在哪?
王涛:实际上NoSQL里面也有很多不同的类型。一般来说我们把它分为四类,包括key/value,文档型,宽表,与graph。SequoiaDB的核心NoSQL引擎是文档型。graph的应用范围相对比较窄,用于描述实体之间的关系,我们在这里不多说。key/value,文档型和宽表,各有各的特点,和传统关系型数据库比起来也拥有各自的典型应用场景。
key/value,redis就是一个非常典型的keyvalue内存式数据库,它的用途主要就是在高性能访问的时候。但是一般来说key/value数据库因为数据模型简单,所以更多时候被看做是一个键值存储引擎,而不是拥有强大计算能力的数据库引擎。因此key/value数据库在简单的高性能数据模型的场景下很实用,但是当业务逻辑越来越复杂的时候就会凸显其劣势了。
宽表是google bigtable引领的潮流,本质就是把数据切成多个块(也叫做column family),存放在不同的地方。应用程序的典型用法,是根据某种条件找到记录后,只在里面搜索有限数量个字段,这样的话宽表能够有效地利用切分的数据块,尽可能减少I/O。宽表一般被用于拥有大量字段的场景,比如每条记录拥有成千上万的字段,用这种方式能够有效地减少I/O。不过大部分的应用可能都到不了这种规模。
最后,文档型数据库一般来说被认为是最接近传统关系型数据库的NoSQL。这也要归功于MongoDB所引领的潮流。文档型数据库的核心是数据嵌套,将原本一些星形模式(Star Schema)的数据嵌套在同一条记录中以减少表之间关联的需求。这种设计可以从某种程度上大大简化传统数据库复杂的关联问题,同时由于摆脱了关系模型里面的强一致性限制,文档型数据库还可以做到水平扩张与高可用。
所以我个人认为,相比其他几种NoSQL,文档型数据库的应用范围要广泛许多。

ChinaUnix:我们在工作中有时候也许会面临着技术的转变,能不能和我们分享一下您是如何摆脱现有数据库的思想来设计新的NoSQL数据库?您能不能谈谈在不同类型数据库设计中,您的思路是如何转变的?
王涛:NoSQL与传统数据库的核心,从数据库的角度看起来没有太大差别,都是把数据通过某种方式存放在磁盘上以便以后访问。可以说,从最早期的网状数据库,到关系型数据库,到现在的NoSQL,其核心理念没有任何变化。都是要用最有效的方式减少I/O,将用户需要的数据,通过某种算法和数据结构有效地存储与访问。但是在上层来看,实现这种目标的方式则有了翻天覆地的变化。
关系型数据库的核心是强一致性的关系模型,当初的设计理念将ACID放在首位,其次考虑性能与可扩展性。而当人们发现并不是所有的数据都要求那么强的一致性,同时对于性能和数据量的需求越来越高时,NoSQL就开始登场了。NoSQL主要将可扩展性放在首位(也就是P基本是所有NoSQL的必备条件),而高可用或一致性则放到了第二档(A或者C)。这种设计自然和原本的关系模型产生了极大的差异,这也就是为什么说NoSQL叫做Not Only SQL。因为既然已经不是关系模型了,有些场景下使用关系查询语言SQL,可能并不能够最有效地发挥出NoSQL的优势。
所以,在NoSQL蓬勃发展的今天,所有的NoSQL厂商也都在探索一种最适合自己的存储与访问方式。

ChinaUnix:您现在一直专注NoSQL数据库的研发,如果作为使用者,NoSQL数据库性能优化方面与关系型数据库有什么区别?
王涛:不管是传统关系型数据库,还是NoSQL,性能优化从两个方面入手。
第一,就是增加CPU的执行效率:这在关系型数据库里面最常见,比如说一个表扫描和一个索引扫描,为什么索引扫描块?大家可能说索引扫描只要扫描几个数据页就行了,表扫描要搜索全部数据啊。没错,不过这个是表象,真正的核心思想是,用最少的CPU找到你需要的数据。索引扫描可以在有限的CPU cycle里面就找到我们需要的数据,而表扫描需要扫描无数不需要的数据,最后才定位到若干条有效数据,从CPU的有效性来看差别显而易见。
第二,就是减少IO开销:为什么数据库需要缓存?为什么需要预取?为什么需要异步写?这些无数调优理念的背后只有一个答案,就是减少IO开销。缓存的使用把热数据放入内存,就不需要在访问数据时进行I/O读取了。预取可以把数据在访问前读入内存,也是减少IO的例子。异步写入可以在后台把脏数据刷入磁盘,腾出来的空间可以预读或者缓存更有效的数据。
所以,从性能优化的角度看起来,NoSQL与关系型数据库的理念基本没有区别。

ChinaUnix:现在是一个大数据和云计算的时代,能简单说说NoSQL在云计算时代有哪些改变么?
王涛:可能很多人把云计算和大数据放到一起说。实际上两者还是各有其针对性的。
云计算更侧重随需分配资源。比如给你一大堆硬件,你在上面搭建虚拟化openstack之类的东西,然后有用户需要用计算存储资源了,你给他分配几个机器或者多少CPU,然后按需收费。大数据则是一个比较虚的概念。比如说我有100T的数据,这个是不是大数据?本身大数据没有一个标准。按照我自己的定义,凡是用户使用现有软硬件很难处理的数据量就可以称为大数据。同时大数据还有数据多样性的概念。原先数据都存在关系型数据库里面,现在可能很多数据直接放在裸文件或者共享文件系统里面。这些东西和底层到底用云平台还是物理平台无关。
所以说大数据不像云计算,核心只有一个按需分配资源的理念。大数据是一个更加抽象的概念,包含的东西更多更广更杂。而两者的结合是一个非常有意思的话题。在按需分配的云计算平台里面构建一个大数据分析平台,按照用户分析的需求来分配硬件资源,这是一个非常符合逻辑的需求。国外的一些银行已经尝试在私有云平台上部署大数据分析项目,我相信在一两年内我们会发现越来越多的企业开始在私有或公有云上部署自己的大数据平台。

ChinaUnix:对于开发人员和数据库运维管理人员来说,如果他们从关系型数据库的工作中转变到NoSQL相关的技术领域,他们需要做哪些准备?
王涛:这个话题就比较见仁见智了。因为NoSQL领域非常广,数据库的类型也各不相同,比如一个擅长Redis的让他去做HBase可能就会非常不适应。所以想要进入NoSQL领域,最好是在工作中有相关的需要,然后从关系型数据库的架构出发去慢慢了解某一款NoSQL的特性和适用场景。
还是那句话,不管关系型数据库还是NoSQL,虽然架构不同,但其核心理念是完全相同的;虽然手段和命令不同,但其调优理念也是一模一样的。当我们去了解一个新事物的时候,可以从架构入手,首先对比和Oracle与DB2的不同之处,然后思考这些不同能够带来什么优势和劣势。最后再把目光放在细节的命令和功能上。

ChinaUnix:谢谢王涛老师的接受我们的专访,还有帮忙在CU上和大家一起交流数据库引擎开发的技术。
王涛:太客气,欢迎社区里的朋友和我交流NoSQL和大数据处理方面的技术和产品问题。