MongoDB

1. 简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 MongoDB支持各种编程语言,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。支持多种操作系统,OS X,Linux,Windows,Solaris,都有32位和64位,但是一般32位为测试版,在使用时会有警告。

2. 架构

MongoDB_第1张图片
MongoDB 架构.jpg

从图1中可以看到一个完整的 MongoDB Cluster 架构图,图中包含四个组件:mongos、config server、shard、replica set。

  • (1)mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口
    ,防止其中一个挂掉所有的Mongodb请求都没有办法操作。
  • (2)config Server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个不能丢失。所以将它们设置成副本集,就算挂掉其中一台,只要副本集内还有能用的节点, Mongodb集群就不会挂掉。
  • (3)replica set,就是一个副本集,一个副本集可以包含多个节点,Mongodb的读写操作默认都在主节点,有时访问量多大可能造成主节点的负载过高,为了降低主节点的压力可以将读操作分配给从节点(读写分离)。
  • (4)shard,这就是分片。分片将一个节点或者集群中的数据分成几块存储,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

3. 术语

3.1 副本集

为了避免机器、磁盘或者网络故障导致数据损坏和数据不可访问,一般都会创建副本集,通过复制功能可以将数据副本保存到多台服务器上。
副本集是一组服务器,其中有一个是主服务器(primary),用于处理客户端请求;还有多个备份服务器(secondary),用于保存主服务器的数据副本。如果主服务器奔溃了,备份服务器会自动将其中一个成员升级为新的主服务器。

3.2 分片

副本集中每个从节点都是对数据库的全量拷贝,节点可能会压力太大,为了结果海量数据的存储问题,Mongodb引入了分片技术。

3.3 存储引擎

MongoDB支持三种存储引擎:

  • (1)WiredTiger存储引擎是从MongoDB 3.2开始的默认存储引擎;
  • (2)MMAPv1存储引擎是MongoDB基于内存映射文件的原始存储引擎,它具有高容量插入,读取和就地更新的工作负载。
  • (3)In-Memory存储引擎内存存储引擎是64位版本中的一般可用性(GA)的一部分。除了一些元数据和诊断数据外,内存中的存储引擎不会保留任何磁盘上的数据,包括配置数据,索引,用户凭证等。通过避免磁盘I / O,内存存储引擎允许更可预测的数据库操作延迟。
    因为官方进行测试WiredTiger的性能是MMAPv1的7到10倍,所以对MMAPv1引擎不做考虑。

图中服务器分为三个分片,其中ShardA和ShardB配置采用的是内存存储,其中存储的是查询比较频繁的数据,数据存在内存中避免Disk的IO操作,减少数据查询的延迟。ShardC中存放访问较少的数据,所以负载压力也不会很大。
每个分片中设置三个副本集,ShardC中的副本集全为WiredTiger引擎,ShardA和ShardB中的Secondary2是WiredTiger引擎,并将优先级设置成0,使他无法被选举成Primary节点,作用是做数据的持久化存储,Secondary1和Primary节点都为内存存储。ConfigServer副本集为WiredTiger引擎。
对于经常会查询的结果,可以将结果保存下来做缓存,当下次有相同或类似的查询请求时可以直接从数据量较小的缓存服务器中进行读取或处理。下面给出解决方案。
设置几个分片专门用来存储查询结果,分片采用内存存储引擎,不设置持久化存储,因为缓存服务器挂了也不会有数据上的损失。取消”_id”的自动生成,因为“_id”索引会占用空间,而且“_id”字段对于缓存数据不重要。在客户端中对查询语句中的关键词做哈希计算保证唯一性,将哈希值和查询结果以的形式存入缓存服务器。如果一直往缓存服务器中添加缓存将来有一天服务器的硬盘就会被塞满,为了解决这个问题,下面给出两个解决方案。(1)MongoDB支持TTL索引,可以将数据存储一段时间,当时间到时会自动将数据删除。把查询结果建立TTL索引可以避免缓存服务器中存储压力过大。(2)或者可以设置固定大小的集合,当固定集合超过其容量时会将最早进来的文档删除。
缓存服务器用来存放热门的查询所需数据。比如城市的火车站、公交站等位置的GeoJson。如果查询时在缓存中找不到数据,先在数据库中执行查询,然后将涉及的数据插入缓存。由于内存引擎当下一条插入数据超过剩余内存时会报错,所以为了能够继续插入数据,解决方案如下:缓存服务器采用LRU算法或者FIFO算法进行管理,当出现报错时根据管理算法删除数据,再进行插入。

2.1.3 MongoDB 集群方案

由于空间适量数据过于庞大,所以使用内存存储引擎对设备的内存要求太大了,所以取消原来数据中心混合存储引擎的方案改用添加MongoDB缓存服务器的策略。
数据中心采用默认的WiredTiger引擎,缓存服务器独立于数据中心,采用内存存储引擎。集群的运作模式如图2所示。

缓存服务器中存放热门的查询所需数据。比如城市的火车站、公交站等位置的GeoJson。如果查询时在缓存中找不到数据,先在数据库中执行查询,然后将涉及的数据进行缓存。由于内存引擎当下一条插入数据超过剩余内存时会报错,所以为了能够继续插入数据,解决方案如下:缓存服务器采用LRU算法或者FIFO算法进行管理,当出现报错时根据管理算法删除数据,再进行插入。

2.1.4 MongoDB在gis系统中的应用

在MongoDB中可以存储空间数据,可以将地理空间数据存储为GeoJSON对象或传统坐标对。MongoDB使用WGS84参考系统对GeoJSON对象进行地理空间查询。同时,MongoDB也可以存储时间数据,MongoDB的BSON格式对时间的存储有非常好的支持,可以将时间属性存储为Date类型。比如可以将水文科学数据建立数据模型,导入到MongoDB进行存储。
MongoDB原生支持的Gis运算:

方法 定义
$near 查询离某一点最近(最远)范围内的点,自动按照距离排序。
$geoWithin 查询某一几何对象(点,线,面…)是否完全包含在另一几何对象内。
$geoIntersects 查询和某一几何对象相交(包含共享一条边)的几何对象。
$near:Sphere 和$near类似,支持球面坐标的运算。
$geoNear near多返回一个dis属性显示两点之间的距离。

下面展示几个可以使用MongoDB进行的地理空间查询实例:(1)根据坐标返回所在区域的几何边界;(2)根据坐标返回所在的某一区域内所有饭店的坐标;(3)根据坐标返回距离500米内的所有饭店并且按照距离升序排列;(4)查询所有含有“解放路”的城市的名称。
另外,GeoJSON还有一些运算工具如geosjon-python-utils,此工具还有js版本。该工具可以支持多边形面积的计算,多边形中点的计算,计算线的交点和终点等功能,可以扩展MongoDB在Gis运算上的功能。
MongoDB支持两种地理空间索引:(1)2dsphere,2dsphere索引支持在类似地球的球体上几何计算的查询 ;(2) 2d,2d索引支持在二维平面上几何计算的查询。推荐使用GeoJSON数据和2dsphere索引。比如可以将所有公交车站的坐标建立“2dsphere”索引,快速查询离最近的几个公交站。

2.2 应用现状

2.2.1 国外现状

领先的在线新闻门户网站之一纽约时报,著名的粒子物理研究所CERN,欧洲核子研究中心大型强子对撞机的数据使用MongoDB存储,MongoDB的用户还有例如GitHub,eBay,SourceForge等知名网站。

2.2.2 国内现状

淘宝,京东,360,大众点评,天天动听等也在使用MongoDB技术,阿里云还提供了三套MongoDB的使用场景。
图2描述的一个比较常见的应用场景,用户通过SLB负载均衡读写数据库中的数据。图3描述的是一个游戏的分服应用场景,不同服务器使用不同的集群,再统一存放在备份存储中。可以使用备份对数据进行恢复,合服时可以进行数据的增量。图4描述的是大数据分析应用场景,数据库收集存储数据,再将数据传给MapReduce进行处理,将结果再返回给用户。适用在线收集实时数据进行离线的数据分析。

3. 结论

随着人类社会产生的数据量的激增,传统数据库在处理海量数据的一些问题上有点力不从心,NoSQL技术在十多年的发展后渐渐越来越被人们所重视。而MongoDB作为一款安装、配置、操作十分方便的数据库,也被越来越多的人们所接受。海量数据的处理重视的高并发,低延迟,高吞吐量,所以在搭建大数据集群时,一定要对各种方式搭建的性能优势和劣势,结合项目本身需求进行权衡在进行使用,这样才能搭建出稳定高效的平台。

参考资料

  • MongoDB 存储引擎:WiredTiger和In-Memory
  • Mongodb副本集实现及读写分离(关注)
  • MongoDB副本集学习(三):性能和优化相关
  • 搭建高可用mongodb-分片
  • MongoDB主要功能特点
  • 菜鸟教程
  • MongoDB官方手册
  • Mongodb Replica Set 读写分离
  • spring mongodb 复制集配置(实现读写分离)
  • GeoJSON格式规范说明
  • Geojson笔记二:geojson-python-util
  • 《MongoDB权威指南》
  • MongoDB的存储结构及对空间使用率的影响
  • MongoDB Connector for Hadoop
  • MongoDB与Hadoop技术栈的整合应用
  • 从MongoDB导入数据到HDFS方法3
  • Mongo 的备份和恢复(mongodump 和 mongorestore)
  • MongoDB运行状态、性能监控,分析
  • MongoDB 入门篇

实战代码

test-mongo

你可能感兴趣的:(MongoDB)