Category Archives: 业界

数据时代的新宠儿

互联网上曾有一张很流行的图片叫《互联网上的一天》,其中第一幅图的内容是“在一天内互联网上的流量信息可以刻满1亿6800万张DVD光盘”,这从一个侧面反映出了我们正处在一个数据信息高速膨胀的时代,相应地,也处在一个数据促进技术改革的时代。面对指数级别增长的数据和业务对数据库技术越来越苛刻的要求,Michael Stonebraker博士于2011年发表了一篇名为《New SQL: An Alternative to NoSQL and Old SQL for New OLTP Apps》的博客1,大笔一挥,将数据库的阵营三分天下:传统数据库OldSQL、非关系型数据库NoSQL和新型数据库NewSQL。我们就从科普的角度来介绍一下近来出现的这几个当下炙手可热的明星概念和它们的代言产品。

NoSQL

NoSQL并不是一个新鲜的词,这个词在1998年的时候就已经出现了,是Carlo Strozzi当时开发的一个轻量、开源且不提供SQL功能的数据库,有趣的是,他这个数据还是关系型数据库。2009年,Johan Oskarsson组织召开了一个讨论关于分布式数据库的会议,会上Eric Evans重新提到了这个术语2。这次会议中NoSQL还没有成为一种具体系统的代名词,它主要用来指非关系型、分布式且不提供ACID的数据库设计模式,从这一点来看,它确实已经与“关系”没有太大的关系了。

2009年在亚特兰大举行的“no:sql(east)”讨论会是一个里程碑,其口号是”select fun, profit from real-world where relational=false;”。因此,对NoSQL最普遍的解释是“非关系型”,强调Key-Value存储和文档数据库的优点,而不是单纯的反对RDBMS,即No Only SQL,也就是我们现在普遍认可的NoSQL。

提到Key-Value,就不得不提一个大名鼎鼎的数据库系统——Berkeley DB,它的历史跟Linux系统一样久远,它的名气跟它的名字一样威武。Berkeley DB最初开发的目的是以新的hash访问算法来代替旧的hsearch函数和大量的dbm实现。在1992年,BSD UNIX第4.4发行版中包含了Berkeley DB的第一个正式版。在1996年中期,Sleepycat软件公司成立,开始提供对Berkeley DB的商业支持3。在这以后,Berkeley DB得到了广泛的应用 。Berkeley DB的设计思想简单精巧,数据库里包含若干记录,每一个记录由Key-Value组成,Value可以是简单的数据类型,也可以是复杂的数据类型,Berkeley DB对Value也不做任何解释,完全由客户端自行处理,所以Berkeley DB数据库非常精小,不超过500K,却能管理大至256T的数据,彰显了Key-Value“四两拨千斤”的至胜大招。

2000年左右,MySQL AB公司成立并与Sleepycat公司建立了合作关系,MySQL引入了Berkeley DB(简称BDB)后,发布了3.23版本4,有不少MySQL DBA也是从这儿开始认识Berkeley DB的5。在MySQL 5.5.12版本中,MySQL不再支持BDB,传言与2006年Oracle收购Sleepycat有关,但是我们也不必为此操心,因为MySQL 5.6已经开始支持Memcached了6

2003年5月22日,大家所熟知的Memcached发布了,最初这是Danga Interactive为网站LiveJournal而开发的,后来被各大网站用于加速缓存。虽然Memcached在存储方式上使用了Key-Value模式,但因Memcached的存储全部在内存中,所以它不并是真正意义上的数据库系统。当然,数据落地从来就不是什么问题,2008年,MemcacheDB问世,你猜得没错,因为协议相同,所以你完全可以像使用Memcached一样使用它的API,最大的区别在于,MemcacheDB在底层使用了Berkeley DB了作为自己的Key-Value存储系统7

2003到2006年之间,Google公司连续发表了三篇关于分布式的文章,即关于江湖上津津乐道的“Google技术有三宝”:GFS8、MapReduce9和大表(BigTable)10。之后各种优秀的分布式系统纷纷隆重出场,如MongoDB、DynamoDB、CouchDB、Cassandra等11,真有点“乱花渐欲迷人眼”了。国内也出现了很多令人称赞的系统:如百度的网页库Bailing,KV存储系统Mola、腾讯的KV存储系统TDB以及淘宝的Tair系统12。以上我所提到的系统,都在为各自公司重要核心的业务支持着T级甚至是P级的数据服务。

随着存储硬件的价格降低,存储大数据已经不再需要付出是昂贵的代价了,GFS的设计理念就是利用廉价的硬件成本和容错功能提供总体性能较高的服务。大数据的“平民化”时代已经到来,各种中小型公司利用开源的分布式系统和Hadoop来部署自己的数据平台已经并不是难事,在开源社区的推动下,从事运维大数据集群和开发Map/Reduce程序的工程师也越来越多,大漠淘金的时代已经离我们越来越近了。

NewSQL

跟NoSQL比起来,NewSQL就显得年轻多了。2011年,The 451 Group公司的分析师Matthew Aslett发表了一篇分析报告,专门用来讨论与日俱增的新的数据系统对现在数据库商家的挑战,这篇报告的标题为《How will the database incumbents respond to NoSQL and NewSQL?》13,14,15,这是NewSQL一词第一次出现在人们的视野之中。

所有事物的优点,也就是它的缺点。与传统数据库OldSQL相比较,NoSQL的确有不可替代的优势,如NoSQL灵活的数据模型使得让DBA们谈虎色变的数据结构变更管理变得易如反掌,相形之下OldSQL的更显得 “死气沉沉”,但NoSQL不支持SQL查询和ACID也让自身一直处于风口浪尖上。这个时候,大家发现NoSQL并不是解救数据库的唯一出路,而且有时觉得NoSQL在某种程度是错误的(比如不支持SQL查询),所以迅速寻找并开发折衷的产品与服务,此情此景下,NewSQL便应运而生了。所以NewSQL可以看成是传统数据OldSQL和NoSQL的一个折衷或优化——既保留关系模型优势(SQL查询与ACID),又有NoSQL的扩展性和灵活性,或将关系性数据库的性提高到一个根本不用考虑再做扩展的水平。

要整合OldSQL和NoSQL的优势,NewSQL首先要傍一个信得过的OldSQL才能有可观的投资回报率,作为开源关系型数据库的老大,MySQL毫无疑问地成为了NewSQL的首选。当然,MySQL本身就有NewSQL的杀手锏——MySQL Cluster NDB16,目前版本是MySQL Cluster NDB 7.3。HandlerSocket17是较早的NewSQL试水者,它是以Daemon Plugin18的方式为MySQL扩展了NoSQL功能。Tokutek TokuDB19则是Tokutek公司为MySQL开发的一款存储引擎,今年刚刚在Github上开源。MemSQL20则是一款实现了与MySQL一样的API的内存数据库,在它的主页上写着“世界上最快的内存数据库”,是不是世界第一,我们等实践来检验吧。当然,还有很多优秀的厂商都在开发高效的NewSQL产品,如Clustrix21和VoltDB22等,文章最前面提到的Michael Stonebraker博士便是VoltDB的创始人。

我们不能武断地说某一种数据库过时了,不同的数据库模型都有它的历史意义,在这个我们都高呼大数据的时代,每一种SQL都有它无可比拟的优势,也会存在让它施展浑身解数的用武之地,我们希望都更多易用好用的新产品出现。如果说NoSQL是一场针对OldSQL数据库技术的革命,那NewSQL何尝不是另一场针对NoSQL的技术革命呢。所有的技术革命,都是在否定中成长,NewSQL的星星之火刚刚点燃了几堆火,但我们可以想象到,针对NewSQL的革命,也只是在不远的将来。

参考资料


  1. http://cacm.acm.org/blogs/blog-cacm/109710-new-sql-an-alternative-to-nosql-and-old-sql-for-new-oltp-apps/fulltext 

  2. http://blog.sym-link.com/2009/05/12/nosql_2009.html 

  3. https://www.ibm.com/developerworks/cn/linux/l-embdb/ 

  4. ‘Understanding MySQL Internals’ 

  5. http://dev.mysql.com/doc/refman/4.1/en/bdb-storage-engine.html 

  6. http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached.html 

  7. http://memcachedb.org 

  8. http://labs.google.com/papers/gfs-sosp2003.pdf 

  9. http://labs.google.com/papers/mapreduce-osdi04.pdf 

  10. http://labs.google.com/papers/bigtable-osdi06.pdf 

  11. http://nosql-database.org 

  12. http://code.taobao.org/p/tair/src/ 

  13. http://www.the451group.com 

  14. http://en.wikipedia.org/wiki/Newsql 

  15. http://wenku.it168.com/d_000053815.shtml 

  16. http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster.html 

  17. https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL 

  18. http://dev.mysql.com/doc/refman/5.6/en/daemon-plugins.html 

  19. http://www.tokutek.com/products/tokudb-for-mysql/ 

  20. http://www.memsql.com/ 

  21. http://www.clustrix.com/ 

  22. http://www.voltdb.com/