MongoDB的特点和适用场景 实用性
  MongoDB是一个面向文档的数据库,它并不是关系型数据库,直接存取BSON,这意味着MongoDB更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的key和value不是固定的数据类型和大小,所以开发者在使用MongoDB时无须预定义关系型数据库中的”表”等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。下面这个表格是MongoDB和MySQL的逻辑结构对比图。
  MongoDB
  MySQL
  文档(document)
  行(row)
  集合(collection)
  表(table)
  数据库(db)
  数据(schema)
  实例(instance)
  实例(instance)
  可用性和负载均衡
  MongoDB在高可用和读负载均衡上的实现非常简洁和友好,MongoDB自带了副本集的概念,通过设计适合自己业务的副本集和驱动程序,可以非常有效和方便地实现高可用,读负载均衡。而在其他数据库产品中想实现以上功能,往往需要额外安装复杂的中间件,大大提升了系统复杂度,故障排查难度和运维成本。下图是常用的MongoDB架构图之一,即一个Primary节点,两个Secondary节点组成高可用。整个副本集通过客户端驱动连接,当主节点宕机,后台可从其中一个Secondary中自动选举出新的Primary节点,而客户端驱动上也可以配置多种副本集的读写策略。

  扩展性
  在扩展性方面,假设应用数据增长非常迅猛的话,通过不断地添加磁盘容量和内存容量往往是不现实的,而手工的分库分表又会带来非常繁重的工作量和技术复杂度。在扩展性上,MongoDB有非常有效的,现成的解决方案。通过自带的Mongos集群,只需要在适当的时候继续添加Mongo分片,可以实现程序段自动水平扩展和路由,一方面缓解单个节点的读写压力,另外一方面可有效地均衡磁盘容量的使用情况。整个mongos集群对应用层完全透明,并可完美地做到各个Mongos集群组件的高可用性。
  下图是一个典型的mongos架构图,应用层通过任意一个mongos连接到整个mongos集群,Config Servers中保存整个集群的路由信息,mongos通过Config Servers可以将查询请求发到合适的Shard Server上。

  数据压缩
  自从MongoDB 3.0推出以后,MongoDB引入了一个高性能的存储引擎WiredTiger,并且它在数据压缩性能上得到了极大的提升,跟之前的MMAP引擎相比,压缩比至少可增加5倍以上,可以极大地改善磁盘空间使用率。
  典型的使用场景
  MongoDB作为一款通用的数据库,适合大部分的业务类型,其中较为典型的应用场景有以下几个
  1游戏类业务
  MongoDB较为出色的性能和某些特性,比如TTL索引(time-to-live index)可以为游戏道具设置过期时间,自带的Aggregation Pipeline和Map-Reduce可以为玩家做游戏运营数据分析,使得其非常适合用于游戏开发
  2 日志类业务
  相比其他关系型数据库,MongoDB引入了”固定集合”的概念。所谓固定集合,是指整个集合的大小是预先定义并固定的,内部是一个循环队列,假如集合满了,MongoDB后台会自动去清理旧数据,并且由于每次都是写入固定空间,可大大地提升写入速度。这个特性非常适用于日志型应用,不用再去纠结日志疯狂增长的清理措施和写入效率问题。
  3 LBS类业务
  在某些LBS的应用中,使用MongoDB也有非常巨大的优势。MongoDB支持多种类型的地理空间索引,支持多种不同类型的地理空间查询,比如intersection,within和nearness等。为典型的诸如网络约车类应用,滴滴和易到等都使用了MongoDB存取司机踩点数据,绘制行驶线路图等。
  3 海量数据存储和读取
  利用前文提到的sharding的特点可以在保证性能的同时,将海量数据以便捷的分布到不同的磁盘上,利用WiredTiger高性能的压缩效率进一步减少磁盘空间使用率,这两个特性使得MongoDB非常适合海量数据存储。
  4 高可用和读写分离需求的业务
  MongoDB自带的副本集特性,使得它跟其他数据库产品相比,可在简单的运维成本内实现业务的高可用和读写分离。
  5 快速产品开发和迭代
  MongoDB由于本身no-schema的特点,在设计MongoDB时无须讲究关系型数据库的设计理念,非常方便的表结构表更等特性,使其非常适合强调开发速度和效率的初创型业务。
  在某些场景下,MongoDB作为一个非关系型数据库有其局限性。
  1 MongoDB不支持事务操作,所以需要用到事务的应用建议不用MongoDB
  2 MongoDB目前不支持join操作,所以业务非常复杂,查询复杂查询的应用也不建议使用MongoDB,应该由关系型数据库来代替
  3 MongoDB相对较耗内存资源,不用SSD的情况下经常会发生磁盘瓶颈,副本集和mongos需要大量的节点支撑,增加了硬件成本,所以需要客户在高性能,高可用,高扩展性和资金开销方面做一个权衡
  MongoDB云数据库的优势
  通常使用MongodB一般有个方案,一是在主机上自己搭建,另外一个是使用云计算厂商提供的MongoDB云数据库产品。相对自建MongoDB而言,以公有云UCloud的云MongoDB举例,使用MongoDB云数据库主要有以下优势
  部署流程
  UCloud是早提供云MongoDB产品的云计算厂商,相对其他云计算厂商而言,配置也是为灵活的。UCloud云MongoDB提供了2.4,2.6,3.0和3.2四个为常用的版本,除了可自定义磁盘容量和内存上限外,客户可根据自身业务需求创建单实例MongoDB,任意节点数量的副本集,任意节点数量的configsvr和mongos,已经选择创建普通磁盘和SSD磁盘的MongoDB。
  弹性扩容和统一管理
  弹性扩容是云计算的一个非常巨大的优势,在MongoDB云数据库中,可以非常方便地实现内存在线升降级和磁盘升降级,已经资源的申请和释放,从而高效地实现了容量规划。另外在自建DB中如果实例达到一定的规模,集中化的管理往往会成为一个较大的运维成本,MongoDB在云数据库中可以根据项目和业务种类进行分组,比如相同的业务使用统一的配置文件,从而有效地减少了运维成本。