定义
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。它介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
特点
-
高性能、易部署、易使用,存储数据非常方便。
主要功能特性
-
面向集合存储,易存储对象类型的数据。
-
模式自由。
-
支持动态查询。
-
支持完全索引,包含内部对象。
-
支持查询。
-
支持复制和故障恢复。
-
使用高效的二进制数据存储,包括大型对象(如视频等)。
-
自动处理碎片,以支持云计算层次的扩展性。
-
支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
-
文件存储格式为BSON(一种JSON的扩展)。
-
可通过网络访问。
适用场景
-
作为文档型DB
MongoDB是文档型(Document store)的NoSQL数据库,数据以文档的形式在MongoDB中保存,文档实际上就是一个个JSON字符串,使用JSON的好处是非常直观,数据从MongoDB中读取出来后,可无需转换直接使用;通过一系列的Key-Value键值对来表示数据,且Key-Value键值对支持丰富的数据结构,Value可以是普通的整型、字符串,可以是数组,也可以是嵌套的子文档,使用嵌套的好处是在MongoDB中仅需一次简单的查询就能够获取到你所需的数据。举电商领域为例,网易严选上卖的上衣和裤子两种商品,除了有共同属性,如产地、价格、材质、颜色等外,还有各自有不同的属性集,如上衣的独有属性是肩宽、胸围、袖长等,裤子的独有属性是臀围、脚口和裤长等。
-
地理位置索引
MongoDB还具有强大的索引能力,支持创建唯一索引、二级索引、TTL索引和地理位置索引。而地理位置索引是MongoDB早已被用户所熟知的特性,其球面(Spherical)和平面(Flat)两种模式,提供了丰富的地址位置的表示方式,如2d、2dsphere和GeoJSON等,对于移动App,如地图软件、打车软件、外卖软件,MongoDB强大的地理位置索引功能使其为最佳选择;此外,对于物联网、智慧都市等领域,也需要大量的地理位置相关操作,这些都是MongoDB的竞技场。
-
高可用和读写负载均衡解决方案
MongoDB的复制集是数据库领域领先的高可用和读写负载均衡解决方案,提供了数据自动(异步/同步)复制能力,一个新节点加入到复制集中会自动进行数据初始同步随后使用oplog进行增量复制,无需人工干预;如果复制集的Primary节点发生宕机,MongoDB会自动进行主从切换,在复制集大多数节点在线的情况下,能够基于Raft协议自动地快速选出新的Primary并恢复读写服务,无需人工干预;MongoDB运维人员所需做的仅仅是将宕机节点重新启动,若宕机的是Primary,则重新启动后,会自动进行数据回滚并最终成为复制集的Secondary节点,所以,相比目前的大多数关系型数据库,MongoDB复制集实现了自动复制和故障切换,大大减低了运维复杂度,解放了DBA。如果你对数据的持久化和可用性有较高的要求,MongoDB复制集是上佳的选择。
-
大数据
MongoDB是为大数据而生的,提供sharding机制用于实现业务的水平扩展。每个shard都保存业务的一部分数据,shard可以配置为复制集,确保shard上数据的高可用性,shard内部由一系列连续的chunk组成,chunk是某一片键区间内的数据记录集合;mongos用于业务请求的路由,将业务负载分摊到不同的shard上,此外mongos还会对shard上超过一定大小的chunk进行分裂(split);根据不同shard中数据量的大小,在shard将进行chunk迁移(migrate),应该说sharding提供了完善的业务数据和负载水平扩展的机制,对于物联网、日志系统和监控系统这类包含TB级海量数据的应用场景,使用MongoDB sharding是个不错的选择。
怎样决定选择使用MongoDB
-
无需要跨文档或跨表的事务及复杂的join查询支持
-
敏捷迭代的业务,需求变动频繁,数据模型无法确定
-
存储的数据格式灵活,不固定,或属于半结构化数据
-
业务并发访问量大,需数千的QPS
-
TB级以上的海量数据存储,且数据量不断增加
-
要求存储的数据持久化、不丢失
-
需要99.999%的数据高可用性
-
需要大量的地理位置查询、文本查询
NoSql与关系型DB的比较
-
理解ACID与BASE的区别(ACID是关系型数据库强一致性的四个要求,而BASE是NoSQL数据库通常对可用性及一致性的弱要求原则。
-
理解持久化与非持久化的区别。这么说是因为有的NoSQL系统是纯内存存储的。
-
你必须意识到传统有关系型数据库与NoSQL系统在数据结构上的本质区别。传统关系型数据库通常是基于行的表格型存储,而NoSQL系统包括了列式存储(Cassandra)、key/value存储(Memcached)、文档型存储(CouchDB)以及图结构存储(Neo4j)
-
与传统关系数据库有统一的SQL语言操作接口不同,NoSQL系统通常有自己特有的API接口。
-
在架构上,你必须搞清楚,NoSQL系统是被设计用于成百上千台机器的集群中的,而非共享型数据库系统的架构。
-
在NoSQL系统中,可能你得习惯一下不知道你的数据具体存在何处的情况。
-
在NoSQL系统中,你最好习惯它的弱一致性。”eventually consistent”(最终一致性)正是BASE原则中的重要一项。比如在Twitter,你在Followers列表中经常会感受到数据的延迟。
-
在NoSQL系统中,你要理解,很多时候数据并不总是可用的。
-
你得理解,有的方案是拥有分区容忍性的,有的方案不一定有。
NoSql中的mongodb,redis,hbase对比
mongodb
定位是取代关系型数据库,想当一个主流数据库。因为他有非结构化、方便扩充字段、写性能优于mysql。万事万物有利有弊,mongodb的内存型缓存内容,让其速度飞快,带来内存率多,掉电数据问题等,加上自身代码还有很多bug带来不如老牌关系型数据库稳定,特别是在主从等分布式环境,其设计也带来诸多问题。
redis
是一个小而美的数据库,主要用在key-value 的内存缓存,读写性能极佳,list,set,hash等几种简单结构使得使用也很简单。缓存与简单是其定位,分布式redis架构的出现,让redis更加广泛的使用,稳坐缓存第一把交椅。
hbase
定位非结构化大数据,可伸缩性好,并不是完全高可用,底层依靠hadoop提供的HDFS,当你发现128GB内存双路CPU25TB存储只够一星期的时候,估计就没有选择综合症了,HBase成了最佳选择。