重思No-SQL

NoSQL这个名词在最近两年真是火热。在我看来一个过时的、老掉牙的东西,居然被这么多互联网公司热捧。

NoSQL可以有两个解释,Not-Only-SQL或者anti-SQL。如果按非SQL理解,通常指key-value数据库,而在这方面的技术,我想国内没有任何一家公司能超过完美时空。只是它太低调了,它懒得去XX大会上宣讲。而它对key-value数据库的开发使用经验、偏爱、忠心、排他心也是国内大型互联网公司中绝无仅有的。

首先我认为,没有必要反对SQL。SQL只是一个语言,它本身没有什么错。在现代的运行环境下,数据库查询所花的时间中解析SQL所花的时间完全可忽略不计。其次,很多人喜欢key-value是因为它高效,但是传统的关系型数据库只要索引设置恰当,增删查改的速度不会慢于key-value数据库。而key-value数据库通过另外建一个表来搞secondary index的方式显然没有关系数据库原生就支持多索引那么高效、一致性那么好。很多人喜欢hibernate,我更不知道hibernate有什么好,干吗不用postgresql这样的原生就支持Object的数据库呢?非要自己在外面搞一层。还有JDBC、ODBC,将数据库访问接口统一化,这个想法挺好,但是如果我是在做一个最终产品而不是在做中间件,那么用什么数据库在一开始就是确定好的,我基本上不可能做到一半的时候去换另一种数据库。因为就算访问接口统一了,不同数据库的SQL语法依然是有很大差异的。无论是SQL还是non-SQL,都可以支持ACID,并且ACID在遇到分布式的时候,都得做退让,要么降低一些效率,要么放弃一些保证。

在完美的时候,我一直想干掉那套古老的key-value数据库。主要的考虑是secondary index、编辑工具、备份工具、分布式事务。我当时的想法的是,假如bdb和mysql都能在效率上满足我的要求,而mysql的功能更多、工具更全面那么我肯定用它咯?(不过在完美,bdb和mysql都是非主流)。然后我在保留现有的API不变的情况下把底层的storage换成了postgresql,可惜还广泛的用,我就辞职了。我现在想,这么做最大的问题是,为我的项目凭空增添了很多不必要的复杂性。如果我自己写300行代码就能解决问题,那我肯定不用别人的3000行、30000行的实现了同样功能的开源库。在简洁至上的前提下,ACE、libevent这些都是垃圾。所以我估计还是会退回去。

所以我觉得bdb的发展路子挺对的,保留key-value的本质不变,为它增加SQL接口,丰富各种编程工具、维护工具。只可惜BDB现在也太庞大了,BUG太多。

其实说来说去,SQL和key-value之间真没有多深的鸿沟,mysql不也曾支持bdb做storage engine吗? 连bdb都支持SQL了,唉……

其实我特别想问各大互联网以及游戏公司,你们在用MySQL做什么?!尤其是mysql外面再套一层memcache、db gate这样的东西的项目。你并没有把它当一套完整的DBMS来用,你是把它当作了一个持久存储、一个可读可写的文件而已。到底是MySQL还是pgsql,到底是key-value还是SQL根本就不重要。能读能写掉电不消失就行了?感觉MySQL这样的东西就是我们造了一个复杂的我们根本用不到的东西,然后在细枝末节在一个个小螺丝小转轮比拼效率比拼优化。所以像redis这样的cache很适合应用需求并且整体代码简洁小巧的东西一面世就收到很大欢迎!

我觉得啊,如果我要做一款新游戏,我一定自己写一个数据库再开工。估摸着也就6周出个原型然后花20周的时间修补就基本稳定下来了。因为现在的开源数据库实在是没有任何一款在设计上是让我满意的。几个核心问题是:数据库和应用层的分界线是否足够清晰、瓶颈到底在哪里(毫无疑问是IO)、分布式环境下采用什么样的一致性模型和同步策略、如何做全备份、如何做增量备份等等。

哎,乱死了。一点条理都没有。我还是把我突然的想法找个word文档写下来,然后最近的精力还是放在分析现有的开源数据库上。我一定好好读mysql的源代码,至少成为一个mysql的专家,起码这样会有很多公司乐意来挖我了 ^_^ 。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥