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.

15 KiB

062 | 文档数据库的缔造者MongoDB

大数据和云计算的风被谷歌吹起来的时候被谷歌收购的网络广告公司DoubleClick的原CEO和CTO们觉得自己应该蹭上时代的列车再次创业然后10gen公司就这样在纽约诞生了。它的创始人分别是DoubleClick的创始人兼CTO德怀特 · 梅里曼Dwight Merriman、CEO凯文 · 瑞安Kevin Ryan以及工程师埃利特 · 霍洛威兹Eliot Horowitz

公司成立之初创始人的想法和MongoDB这个产品毫无关系他们想做一个云计算的服务并用开源的东西来搭建。然而很遗憾这几位二次创业的人在开源社区找了一圈也没有看到一个让人满意的东西。于是怀着构建伟大云计算服务的梦想他们决定先把这个事情停一停先搭一个自己满意的数据库出来。这个数据库就是后来赫赫有名的MongoDB。

MongoDB的名字需要解释一下。国内很多人觉得是“芒果数据库”其实不是的。在英文里“芒果”是Mango而Mongo是humongous的中间部分在英文里是“巨大无比”的意思。所以MongoDB可以翻译成“巨大无比的数据库”更优雅的叫法是“海量数据库”。

这几位创始人的梦想就是创建一个和过去关系数据库完全不一样的数据库,使之具有这样一些特点:海量数据库、数据库的模型极其灵活、适合程序员使用。

**大概怀着伟大理想的人都会做出伟大的产品。**MongoDB注定是独特的在历史上会留下浓重一笔的产品。

当MongoDB开发出来的时候创始人们给它的定义是这是一个面向集合的、模式自由的文档型数据库。听到这里你可能觉得有点晕了那就先普及一下数据库的基本常识吧。

在过去的30多年里整个工业界的数据库被所谓的关系数据库所主导。一个不太严谨的说法是关系数据库的基本存储单元是表。而一张表则是有行有列的数据集合而列的定义有严格的类型。所以关系数据库是一个严格定义的数据模型每张表里的每条记录都是一个样的。

查询关系数据库的标准语言叫作SQL。SQL这个东西自从IBM发明出来以后已经有30多年的历史了人们爱它的有恨它的也有。但是通常来说程序员不太喜欢这个东西因为它的基本理念和程序员编程的想法不一致。后来所谓的NoSQL风指的就是那些不用SQL作为查询语言的数据存储系统而文档数据库MongoDB正是NoSQL的代表。

**和关系数据库相反MongoDB的数据模型很不一样。**简单来说MongoDB面向的是集合而不是表所有的数据存储都以集合为单位而每个集合里面包含的东西则称为文档一个集合可以包含无数个文档。每个文档我们可以大致认为是个JSON数据模型。文档自带元数据。也就是说MongoDB里面每个集合的每个文档并不要求数据严格一致而是可能千差万别。

**MongoDB还有一个特色它的查询使用的不是SQL而是程序语言和API。**这样一来MongoDB对程序员就是一个非常友善的选择。当然对于原本非常熟悉SQL的DBA和数据分析人员这就显得不太友好了。

MongoDB这个数据模型其实是非常脑洞大开的。在数据库领域的几十年发展里很多人都试过各种各样挑战关系数据库的模型但是鲜有成功的。即使成功了也往往让人感觉雷声大雨点小并不会对关系数据库的根本造成实质性的影响。然而MongoDB这个东西一出现对有经验的数据库从业人员和使用者来说第一个感觉就是这个东西是来搞事情的。

在开发MongoDB的过程中随着开发的深入10gen的人越来越觉得原来那个云计算平台是个虚无缥缈的东西。而这个他们一手缔造的文档数据库可能是一个惊天动地的大杀器虽然这些人其实不是数据库领域科班出身的但他们对于数据库领域某些弊端的深刻理解的确是一般人望尘莫及的。

于是他们决定彻底忘记那个云计算平台,集中精力开发这个被命名为“巨大无比的数据库”的产品。在漫长的开发过后,2009年2月10gen正式开源了MongoDB的第一个版本。这对于10gen来说是一个非常重要的里程碑。

然而我们必须要说这个产品尽管看起来很新颖很有意思但并不是一个很成熟的产品。它有无数多的东西没实现有无数多的坑等着人们去踩。但是这些都已经不重要了踩着NoSQL的东风MongoDB开始飞起来了。

**10gen是一家特别注重宣传的公司它在早期就对如何花钱做宣传非常有一套。**他们的做法是在全球各地资助成立很多的用户组并组织每年一次的MongoDB大会。MongoDB还开起了Mongo大学。他们知道自己产品的用户都是开发人员因此只要开发人员说好尤其是各个地区那些在圈内有名的技术大牛说好那么不管这个产品实际上好不好完善不完善炒起来的感觉起码很好。

**先把大家都绑上Mongo的船再慢慢地修理这艘船也是一种做法。**俗话说“吃人的嘴短拿人的手软”那些在10gen支持下成长起来的用户组那些10gen给报销机票和旅馆来做宣讲的大牛们互利互惠地就借着NoSQL的东风把MongoDB给“吹”起来了。

10gen的CTO在某次采访中就说他觉得与其花费那么多钱去做各种各样的广告不如把钱花在资助用户组资助MongoDB的会议上。让大家感觉到MongoDB产品好公司对社区的支持力度大是10gen花广告费的最佳途径。

踏上MongoDB“贼船”的公司很多比如说卖车的Edmunds、美国版的“五八同城”Craigslist以及老牌网络企业——思科。但是这些都比不上当年非常优秀的社交初创公司独角兽FourSquare使用MongoDB的影响来的大。当然这家公司现在是过气了但在社交网络最为火爆的时候FourSquare可是非常著名的。

在MongoDB刚出来的时候FourSquare整个地“搬家”去用MongoDB这曾是一件非常大的事情。这件事情当然被10gen公司大书特书地进行宣传。而MongoDB在独角兽里面被广泛使用这一事实让MongDB是新时代的数据库、MongoDB适合开发APP以及MongoDB适合创业公司使用等等的观点都瞬间被“吹”了起来。

到2012年的时候作为10gen公司创始人之一的梅里曼其与人联合运营的科技博客Business Insider把MongoDB作为仅次于HTML的新时代最重要的技能宣传给大家。一时间仿佛只要MongoDB掌握好了就能够有一碗饭吃。而很多在线教育网站也专门开起课来给那些急于从其他职业转战IT的人普及MongoDB的用法。

我们必须说这种宣传非常成功。大概是因为MongoDB的创业者在这之前已经成功创业一次要知道DoubleClick在网络广告领域非常成功而且被成功卖给了谷歌所以这些人搞创业公司的套路一点都不像那些毫无经验的初创公司创始人。他们非常懂得如何做才能够最大限度地吸引眼球最大程度地把自己的产品铺出去。至于盈利与否在初创阶段并不是他们最需要关心的问题。无论从何种角度去看这个做法都很成功。

**除了在商业宣传上很成功10gen发布MongoDB以后在产品的开发和维护上也采取了和其他公司很不一样的策略。**这个策略对于MongoDB的流行同样功不可没。

简单一点来说10gen公司决定集中精力做最重要的几件事情

  1. 吸引客户上MongoDB的船
  2. 让MongoDB更好用
  3. 对常用的编程语言,提供各种各样的库和接口的支持;
  4. 整个技术支持团队非常地友善,而且尽职尽责。

10gen公司重点去做的这些事情有很多值得我们深思的地方。如果要简单概括的话就是10gen公司希望所有使用MongoDB的用户都觉得这个产品非常非常地好用。如果万一真的出了问题也有很好的技术支持来及时地解决问题。

**这种用户体验,绝对是开源社区中其他产品所不能达到的高度。**举个简单的例子要想自己去部署Hadoop的一个计算集群那绝对是一件老难老难的事情了。如果这个东西容易部署也就不会诞生一批以卖“更好用的Hadoop”为生的公司了。再举个例子Hive的部署也同样不好用。

如果我们从企业级应用上来看Oracle就是一个非常典型的难用的产品。一个企业如果想要把Oracle用好了请有经验的DBA是基本条件很多时候都需要咨询公司来帮助设计解决方案。这种项目的落地绝非简简单单就能行的。而SQL Server作为一个后起之秀在数据库市场获得成功的一个重要原因并非性能有多好而是“很好用”。当然SQL Server只是和Oracle比起来好用得多。

但是MongoDB就不一样了10gen公司的目标就是让MongoDB非常非常地好用。而且从这一点上说他们做得非常成功。整个社区里无数的用户组在提供支持10gen自己的客服绝对是用户至上有问必答而且非常礼貌及时。整个10gen的开发重点也是让用户更好上手。

所有的因素加起来MongoDB对于创业公司来说就变得很有意思了这个产品很好上手支持也很多而且还免费。创业公司拿着这个轮子可以迅速实现自己的业务逻辑而不需要再去学习怎么搭东西。我想正是这个原因突然之间就着NoSQL的春风MongoDB就开始流行起来了。

然而接下来事情的发展多少有些脱离美好的一面。MongoDB从产品的角度来说其实就是个半成品。MongoDB实在有太多的东西没有做了尤其是那些基本的东西包括数据是不是会丢、结果是不是错的、并发做得好不好、支不支持事务处理以及当规模上来的时候能不能够通过加机器来解决问题。

这些看起来本应是一个数据库产品非常重要的、基本的东西MongoDB做得却很差。一般来说当一个人开始用MongoDB的时候并不会遇到这样的问题当然主要还是规模不够大不至于触发瓶颈和问题。当APP或者网站的规模上去之后同时工作的人多了问题就会越来越常见越来越令人无法忍受。

**而10gen的CEO在宣传时又往往以极其夸大的方式告诉大家MongoDB就是未来MongoDB就是一切。**这样的结果就是很多人用MongoDB去取代关系数据库。然而渐渐地这些人发现这种取代并没有带来真正的好处除了一开始开发省了点力气外后面要维护的成本越来越高。

**而10gen这种侧重于提高用户初始体验外加一切都是MongoDB的宣传方式终于导致了负面作用。**有经验的程序员开始跳出来在各种论坛里公开宣称千万别上MongoDB的“贼船”因为虽然开船的时候容易接下来要付出的代价也很大一旦规模上来各种丢数据的问题就都出来了。

10gen的CTO经常亲自上阵去和这些程序员们PK。他接受采访的时候说MongoDB是个新产品嘛新产品总是会有这样那样的问题请给我们一些时间。他在论坛上和这些程序员交流通常来说跳不出这样一些套路就是

  1. 这个问题我们在下一版里会修好的;
  2. 这个问题我从来没有遇到过,估计是假的吧;
  3. 这个问题你给我们开BUG啊
  4. 这个问题我不相信是真的,肯定是你们程序写错了。

不管你信不信这种回复加上10gen的公关能力确实在很多时候给MongoDB赢得了修复问题的时间。但是这样的一种方式也让用户的接受度在降低。2009到2012的三年里MongoDB被接受的比例一直处于飞升状态而2012年开始这个曲线就越来越平。大家到底要不要用MongoDB已经不再是“无脑”上的问题而是要反复斟酌之后再做决定的事情。

尽管10gen的CEO一直高调宣布MongoDB无所不能大家赶紧上实际上后面的几年里很多人反而是渐渐地离开了MongoDB。大家意识到MongoDB作为一个一开始上手很快的东西可能只适合一个V1产品。产品上一点规模之后背后的数据存储系统还是要换的。

当然任何公司都有盈利的压力。MongoDB作为一个开源、免费的产品10gen公司不可能免费赚吆喝它烧在社区建设上的钱也不是小数目。10gen推出盈利产品的第一步是推出了对MongoDB的商业付费技术支持。

商业付费支持是很多公司常用的方式。比如说Hadoop平台公司的Hortonworks其收入就基本上依赖于其提供的商业付费技术支持。MongoDB从这里开始赚第一笔钱并且其技术支持以“态度好”而著称。

**仅仅靠商业技术支持并不能为公司带来足够的收入10gen的另外一个创收途径是推出商业版的MongoDB。**和开源的MongoDB比起来商业版的自然要带更多的功能。这些功能最主要的是一个加密的存储引擎——数据以企业级密码强度加密后再存储以及额外的安全相关的功能比如说LDAP和Kerberos的支持等等。这方面倒是体现了企业级应用市场和开源小创业公司之间的差异企业级应用市场对加密和安全相关的内容要重视得多没有这些功能大企业是不会使用这些产品的。

在很长时间里MongoDB的企业版都是10gen公司最主要的收入来源。此外10gen也提供云上的托管服务给那些不愿意自己管理数据库的人提供服务。MongoDB的业务模式和赚钱模式都还是很清晰的但是一个巨大的问题在突显MongoDB作为一个数据库始终都不是一个成熟的产品并因此给很多采用MongoDB的企业带来了一些出乎意料的东西。

2013年的时候10gen公司觉得自己的名字已经不太符合现在的品牌效应了于是正式更名为MongoDB公司将产品名和公司名匹配起来。

尽管MongoDB的发展经历了很多曲折它的产品在功能上、性能上有很多问题乃至受到了某些程序员的公开抵制尽管MongoDB的接受度自2012年以来开始大幅度降低它在企业市场上却依然保持着一个非常可观的占有率。

今天我详细讲了10gen在MongoDB的开发、推广、发展和营收上的策略。MongoDB侧重于易用性和对社区的支持对其他方面则有些忽视了。那么倘若你在运营一家做工具类产品的初创公司在技术发展上又会采取什么样的策略呢