更令人担心的是应用越来越复杂,越来越聊天化(chattier,可能聊天程序对数据库写的次数很多)。几乎每次都会进行多次数据库写操作。现在,写,而不是读,成为了瓶颈。这时我们才最终认真对待数据库切分。Facebook最初是根据university字段来切分其用户数据,然后做成了"哈佛数据库(The Harvard Database)",并且维持了很长一段时间。Flickr是另一个好例子。他们使用PHP手动建立了一个切分系统,这个系统使用用户ID的哈希值来切分数据库,跟memcached根据key来切分很像。在技术交流会上,他们透露,不得不对数据表去规范化(denormalize),以及对一些对象(比如评论、消息、喜欢)进行两次写(doule-write)。 要解决无限伸缩(infinite scaling)总要付出点代价,对吧。
手动切分关系型数据库的问题是,你的关系型数据库已经没了。切分API实际上成为你的查询语言了。你对操作的头疼还没好,而修改一组模式(schema)更加痛苦。 这就需要大家深呼一口气,列出大家选用的SQL实现的所有不足和瑕疵,然后因此责怪SQL。一波潮人似的NoSQL,难民似的XML数据库出现了,并且都作出了根本办不到的承诺。它们提供了自动切分,灵活的模式,一些冗余,...,一开始也就这么多。但是总比自己写要好多了。 你知道,“不用自己写”成为主要卖点的东西总是令人绝望。
转移到NoSQL并不比使用手动切分差,因为我们已经放弃了使用常用的客户端工具控制和分析数据的希望。但这没好多少。之前由商业人员(business folks)编写的SQL查询变成了开发人员维护的报表代码。 还记得用于备份和分析的热备份数据库吧?现在它变身为Hadoop filestores以及上层的Hive查询而卷土重来了。既然奏效,商业人员再也不来烦我们了。但一个大问题是,这些系统的操作复杂性。就像航天飞机一样,它们是作为可靠且几乎不用维护的产品出售的,但是最后还是需要大量的手动操作。另一个大问题是,数据的存入和取出:花费一整天的时间已经相当不错了。第三个大问题是IO同时成为网络和磁盘的瓶颈。我们告诉自己,这就是从大数据(big data)毕业的代价。 不管怎样,Google就是这样做的,对吧。
随着一些NoSQL数据库的逐渐成熟,它们的API发生了诡异的变化:它们开始长得像SQL一样。这时因为SQL是关系型集合理论(relational set theory)的相当直接的实现,而数学不是那么好愚弄的。
我重述下Paul Graham对Lisp那难以忍受、并自鸣得意的评论:一旦你添加了group by, filter, join,你也不能声称发明了新的查询语言,因为这仅仅算是SQL的一个新方言。而且语法很差,还没有优化器。 由于我们绕过了SQL,大部分系统都缺少了一些很重要的东西,比如存储引擎、查询优化器,而这些都是基于关系型集合理论设计的。拖延到后期去实现导致了严重的性能问题。即使对解决了性能问题的那些(或者通过停驻在内存中来掩盖此问题),也缺少了其他东西,如合适的备份。 我知道一个非常成功的互联网初创公司(你肯定也听过)使用了4个(!!)不同的NoSQL系统来解决问题。
现在已经相当明显,我们不会回到单数据库以及10毫秒一次的随机定位(10-million-nanosecond random seek)的那个从前了。在寻找一劳永逸解决所有问题的炒作周期(hype cycle, 也叫技术成熟度曲线)的过程中,有个有趣的模式:聪明的方法在减轻一个痛点的同时会引入新的痛点。
|