You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

9.0 KiB

065 | 直面MongoDB谈微软的NoSQL战略

DocumentDB是微软于2014年推出的基于Windows Azure的一个PaaS云产品。正如它的名字所示这个产品是个文档数据库。它主要是冲着MongoDB的市场去的它的数据模型和MongoDB很像。

2017年初微软推出了和MongoDB兼容的DocumentDB的API。在2017年5月微软面向程序员的Build大会上微软宣布DocumentDB升级为Cosmos DB。Cosmos DB包含多个数据模型文档模型成为其子集。

今天我就带你回顾下这个MongoDB竞品的发展历程。

让我们把时间线拉回2013年。那时候我还在微软一个同事神神秘秘地宣布他要离开我们组去投奔一个秘密项目了。和以往的各种离别不同这个同事对于接下来转去做什么一句话也不肯多说。事关公司机密只是道听途说这个秘密项目已经开发若干年微软投入了若干人力物力。

因为我所在的组做的是经典的大数据基础架构的东西,而我同事十余年如一日地在数据库引擎上做开发,换来换去的组都是数据库引擎开发这方面的。所以我只能大概猜测,他要去的这个组做的应该也是和数据库相关的事情。我实在猜不出来,到底是一款什么样的神秘的数据库产品。

那时的数据库市场正如火如荼大数据和NoSQL的风潮一浪高过一浪。MongoDB更是以简单易用、功能强大、服务周到而成为很多创业者和初创企业的首选。像MongoDB这样的基于文档而非传统关系模型的数据库是如此受欢迎。

那个时候的我一直有个困惑:为什么这么美好而巨大的市场,就没有人觊觎呢如果我是某家大公司的人我一定会组个团队开发一个和MongoDB一样容易卖钱的产品。

上面这两件事情一直盘旋在我脑海之中,但很长一段时间里都只是彼此孤立地存在。

然而,它们终究还是以很巧合的方式重合了。2014年微软正式公开了一个新的数据库——DocumentDB。

2014年公布的当然只是预览版正式版于2015年才正式发布。那个时候我已经离开微软而我朋友的LinkedIn档案终于更新改成了自己是做DocumentDB的。有一天我偶然看到这个朋友的LinkedIn才恍然大悟原来微软早就已经开始觊觎MongoDB的市场并秘密研发大杀器了。

我们知道MongoDB作为一个产品来说其易用性达到了相当的高度。唯一不足的是产品的稳定性。MongoDB充其量就是一个“杂牌军”在系统是不是丢数据、能不能够有比较好的分布式处理能力、够不够安全方面都有很多的问题。

而DocumentDB开始杀入市场的时候面对强大的MongoDB这场大战并不好打。面对当时的境况DocumentDB最终选择了几个切入点。

  1. 和MongoDB不一样DocumentDB最初的查询语言是一种SQL它的类型系统和表达式则是JavaScript。使用这样一个组合微软认为能够更好地实现对用户的支持。
  2. DocumentDB请来了图灵奖获得者莱斯利 · 兰伯特Leslie Lamport坐镇系统对于事务处理的支持远远强于MongoDB并且提供了可供选择的事务处理级别。相对而言MongoDB对事务处理的支持是很脆弱的有各种各样的丢数据的例子微软觉得DocumentDB在这方面做得好很多。
  3. 和MongoDB不同DocumentDB会自动索引数据库里面的文档。这样一来访问DocumentDB的时候速度要好很多。自动索引让用户也方便很多。
  4. DocumentDB被做成了在Windows Azure上的一个PaaS服务。这样一来用户自己就不需要部署什么东西了。

这个产品推出以后,在一定程度上证明了微软决策的正确性。微软这次的产品确实在易用性上有了本质的飞跃,也因此受到了很多人的欢迎。

然而使用SQL到底是利大于弊还是弊大于利是一件说不清楚的事情。毕竟有人喜欢SQL也有人讨厌SQL。而MongoDB的API方式和对语言的支持与SQL走的是完全不一样的道路。这种不同导致程序员们非常喜欢使用MongoDB。当然这也使得MongoDB失去了大量只会写SQL或者对SQL有明显偏好的人。

那个对事务处理的支持和事务处理级别的选择的设计确实让用户在精准服务和省钱之间必须做出选择。这种选择在MongoDB里没有而且MongoDB在事务处理上也没有提供特别明确的语义支持。

对于很多用户来说事务处理是一个很重要的需求。没有事务处理的话数据的写和读就会麻烦很多应用程序的开发就不一定会顺利。所以对事务处理的支持和事务处理级别的选择是DocumentDB非常重要的一个功能。我觉得这也是它比MongoDB更出彩的特征。

为什么微软决定把DocumentDB做成Windows Azure的一个服务而不是作为一个单独的产品来卖呢我想一方面固然是Windows Azure自动帮每个用户管理了很多东西另外一个很重要的方面是微软觉得这个产品会很成功所以能够借助产品让Windows Azure的订阅和使用数都上一个台阶。而且微软为了推广这个产品在Windows Azure上的收费很低。可以说为了让这个产品去推动Windows Azure的订阅微软也是不遗余力。

实际上这个产品一开始算不上多么成功。的确是有不少人在用但是这个比例和微软期望的或者和MongoDB的使用率比起来实在是低很多。而从已有的MongoDB迁移到DocumentDB上又意味着程序的重新开发。很多人一点都不想重新开发一个新程序所以即便DocumentDB有厉害的地方也只有新的应用在用而老的基于MongoDB的应用转化过来的比例并不高。

为了彻底解决这个问题让那些使用MongoDB作为数据库的应用可以顺利地迁移到DocumentDB上2017年的时候微软准备了一个大杀器: 为DocumentDB提供了一套和MongoDB完全一样的API。

这次微软终于决定不再玩SQL了也不再矜持了。既然Mongo是标准那么我们就在自己的系统里面把标准给兼容了。那样你们要是在MongoDB上跑的就可以不用改程序直接跑到我的数据库上来。

这种做法颇有点流氓做派。但是我们也知道API不可能申请专利加上MongoDB本身还是开源的所以微软的这种做法也是情理之中的事。这样一来但凡背后用了MongoDB的程序都可以顺利地转化过来了。

MongoDB自己本身也并非没有问题而这反过来给微软帮了很大的忙。在2017年1月的时候黑客们大规模袭击了默认安装的MongoDB。这些MongoDB没有密码可以被随意登录。黑客袭击MongoDB后将数据删除或者转移到其他地方并留言需要支付若干比特币才给恢复数据。造成这个问题的主要原因还是MongoDB本身的默认安全设置不好。

这的确是给微软提供了很多活动的空间。在“更安全”的宣传下又提供了MongoDB的APIDocumentDB终于开始迅猛发展被越来越多的人使用。这又反过来促使微软对DocumentDB有了进一步的期望。

2017年5月微软全球Build大会上作为大会主讲内容的一部分微软宣布DocumentDB升级成为Cosmos DB。Cosmos DB直译过来就是“宇宙数据库”。Cosmos DB是DocumentDB的一个超集不仅包括DocumentDB的所有功能而且增加了对图数据库在内的多种其他数据库的支持。

Cosmos DB最初宣布的时候很多人对这个命名表示了疑惑因为这和微软内部大数据处理平台Cosmos的名字很像。也因此很多时候不知情的人会以为微软是把内部数据平台Cosmos开放给外面的人使用了。然而实际上Cosmos DB和Cosmos并无半毛钱关系。

但是Cosmos DB的宣传如火如荼、声势浩大。再加上图灵奖获得者的现身说法Cosmos DB的知名度被迅速打开并且获得了很多人的信任。

于是从DocumentDB升级到Cosmos DB微软不仅完成了在文档数据库上面的布局看起来其能力更是远远超过了MongoDB。这个数据库自2017年5月以来Windows Azure的用户都在使用。虽然效率如何还需要时间去检验但是其易用性已经经过了考验。

无论如何作为MongoDB在市场上唯一的竞争对手Cosmos DB的目标很宏大。如果微软能够顺利地让这个产品成长起来那么在将来它很可能是Windows Azure云服务里面非常有特色的一个服务。当然如果微软没能做好产品用户又不愿意绑定到Windows Azure的战车上未来就会堪忧了。

在我个人来看未来Cosmos DB的成败概率大致在一半一半而这在很大程度上取决于MongoDB怎么解决自己的问题以及其他的云计算厂商打算怎么玩转文档数据库这个游戏。