mongodb学习系列1:背景及概述

Posted by Chris on October 6, 2019

mongodb出现的背景

mongodb出现之前,大家都习惯于使用关系型数据库。但是,在使用关系型数据库的过程中,却存在很多问题。

  • 基于单机架构的关系型数据库扩展性差,无法支撑海量数据
    比如mysql,oracle,都是基于单机架构的,支撑的数据量很小。如果要支撑海量数据,则必须扩展到集群架构。而关系型数据库扩展到集群架构,是一个很痛苦的过程,最常见的手段就是分库分表,除了数据库端的改动,还需要的业务代码配合进行修改。总之,关系型数据库的扩展性差,需要用户来手动维护。
    由于无法忍受基于单机架构的关系型数据库的缺点,10gen创始人Eliot和Dwight决定开发一套数据存储服务,该系统允许开发者将数据存储到一个类似于数据库的地方,同时,友好的API方便开发者使用。

mongodb要做的事情

  • 友好的API
    对于用户友好的API,是数据库应用成功的第一步。
  • 支持海量数据的、高扩展性的架构
    这是mongodb存在的理由。
  • 高性能的读写
    这是一个数据库应用最基本的保证。

mongodb是怎么做的

  • 友好的API
    为了最大程度的方便用户使用,mongodb决定采用JSON格式来存储数据。JSON格式作为一个通用的数据交换格式,简单明确,所有的开发者对其都不会陌生。而且,直接将数据对象作为一个JSON对象保存到数据库中,显得更加方便。

  • 支撑海量数据下的可扩展性
    在传统的关系型数据库中,当数据量太大时,单机无法支撑海量数据的高性能的读写。这种情况下,关系型数据库一般会采用分库分表的方式来进行优化。但是,这种方案对于业务代码和数据库的侵入性都很高,用户需要修改业务代码,在数据库层面需要手动迁移数据。
    在mongodb中,用户可以首先使用一主多从的架构。当需要保证海量数据的处理性能时,可以无缝切换到分片架构,用户几乎没有感知。mongodb会自动在多个节点间进行数据的分布和均衡,代码中也不需要进行修改。

  • 读写的高性能
    mongodb3.0版本使用了WiredTiger存储引擎,从而解决了MMAP存储引擎写性能较差的问题,使得mongodb可以拥有读写的高性能。

  • JOIN操作
    mongodb从3.2版本开始,通过$lookup操作符,从而做到了支持多表(集合)关联。类似于关系型数据库的JOIN操作。

  • 支持ACID多行多表强事务
    对于使用关系型数据库的用户来说,很多时候都是看重关系型数据库的ACID事物特性,mongodb也已经支持。2018年6月,MongoDB推出4.0版本,支持ACID多行多表强事务,支持事务回滚。

前面两条,是区别于关系型数据库的地方。后面三条,是不输于关系型数据库的地方。

mongodb最终解决了哪些问题

  • 方便用户使用的API,高扩展性的架构,使得mongodb作为传统关系型数据库的一个替代。在处理海量数据时,用户可以考虑抛弃关系型数据库,使用mongodb。

参考

没有一个技术天生完美,MongoDB 十年发展全纪录
MongoDB的ACID事务是否已为高性能应用做好了准备?