天天看点

全新版本MongoDB数据存储席卷物联网

本文首先对物联网进行了模型抽象,着重和大家剖析了mongodb解决方案,包括文档模型、高可用复制集、分片集群和aggregation&mapreduce,最后分享了全新的mongodb特性。

以下为内容整理:

mongodb是文档型数据库,其核心的三大优势是灵活文档模型 、高可靠复制集、 高可扩展分片集群。在最新的

db engine rank 的排名中,mongodb 排在第4,是非关系型数据库领域的领头羊。

<b>物联网模型抽象</b>

物联网离我们越来越近,这主要得益于云计算和移动互联网技术的发展。物联网技术已经应用于智能家居、车联网等领域,我们进行模型抽象出物联网应用的共性,很多设备(assets)通过智能的传感器采集很多数据并发到云端,这些设备不断的产生日志、数据、事件并发到云端,数据在云端进行存储计算后,会产生很多结果以接口的形式提供出去,方便我们开发更多的手机app和web应用。

全新版本MongoDB数据存储席卷物联网

<b>物联网存储需求</b>

<b></b>

全新版本MongoDB数据存储席卷物联网

mongodb 解决方案

全新版本MongoDB数据存储席卷物联网

文档模型

<b>json </b><b>格式</b>

全新版本MongoDB数据存储席卷物联网

json格式的好处:

最接近真实对象模型,对开发人员友好。

schema free,增加和删除字段非常灵活,直面灵活多变的需求,快速迭代。

数组、内嵌文档支持,数据聚集,读写性能提升。

应用场景比如设备增加新特性;事件日志,数组+内嵌文档。

<b>schema free</b>

全新版本MongoDB数据存储席卷物联网

随时动态增加字段如图。

增加字段无需变更表结构。

在mongodb3.2版本推出了文档校验,使其兼备灵活和严禁的特性。

<b>内嵌</b>

全新版本MongoDB数据存储席卷物联网

使用mongodb可以把所有的记录作为这个设备的元素,以数组的形式存储起来,还可以划分,把每分钟汇报按小时为单位聚合存储,这样可以达到更少的文档、更快的查询。

<b>gridfs</b>

全新版本MongoDB数据存储席卷物联网

mongodb 单个文档不能超过16mb,更大的文档可以使用 gridfs 来存储,例如物联网里 ota 升级文件、图片视频等的存储。

gridfs原理:

文件内容分成多个文档存储在fs.chunks集合。

文件元信息存储在fs.files集合。

功能支持

<b>数据压缩</b>

全新版本MongoDB数据存储席卷物联网

mongodb3.0之后推出了新的存储引擎wiredtiger,wiredtiger存储引擎对数据的压缩支持非常好,用户原来自建的mongodb使用 mmapv1,迁到云上后换成wiredtiger,磁盘的容量通常能下降到原来的10%-30%。

mongodb对索引的支持非常丰富,下面重点介绍物联网场景里经常被使用到的位置索引和ttl索引,位置索引可用于构建各种基于地理位置的应用,而 ttl 索引可以实现设备历史数据自动过期的功能。

<b>位置索引</b>

全新版本MongoDB数据存储席卷物联网

mongodb的位置索引可以针对一个字段,mongodb支持两种类型的位置索引字段,点和更灵活的位置,只要字段是这种数据结构,就可以建立位置索引。建立位置索引后,就可以使用mongodb的near和geowithin查询操作服务。

<b>ttl </b><b>索引</b>

因为后端的存储数据有限,只能存储最近的数据,我们可以让mongodb支持让指定数据在某段时间后过期。

ttl索引有两种应用模式:指定某段时间后过期和指定时间戳过期。mongodb对ttl索引的支持是有限制的,针对date类型字段建索引。mongodb在执行ttl索引时,后台过期逻辑每分钟执行一次。

全新版本MongoDB数据存储席卷物联网

高可用复制集

全新版本MongoDB数据存储席卷物联网

高可用复制集特性如下:

自动故障检测,自动failover

数据多副本存储,保证数据安全

多节点可同时提供读服务

以三节点复制集为例,会有一个primary和两个secondary,复制集里的所有成员通过选举协议选出primary,默认情况下,所有数据都是写到primary且只能通过primary写,读也是通过primary来读。三节点数据存储三份,可以容忍两个副本失效,保证了数据的高可靠。当primary挂掉后,另外两个secondary会发起新选举,保证服务正常进行。

<b>连接访问</b>

mongodb里面有connection string uri,所有driver都支持connection string uri方式连接,这个通用的连接串包含访问mongodb的用户密码信息,可以指定多个节点的地址,可以指定鉴权数据库的信息。通过这种方式,只要在这个连接串里指定后端多个节点或指定 replicaset 参数,正确连接复制集后,用户客户端连接到这个复制集后,会跟复制集的每一个成员建立一个心跳关系,会不断的监测后端复制集成员的变化情况,当后端出现主备切换时,driver 能自动感知。

<b>writeconcern</b>

全新版本MongoDB数据存储席卷物联网

mongodb通过writeconcern保证数据高可靠,默认情况下,mongodb 使用{w: 1}的 writeconcern 级别,当数据写到 primary 就像客户端返回。对于非常重要的数据,可在写入时设置writeconcern: { w: “majority”},就会写到后端复制集成员的大多数,再向客户端返回,保证数据在有节点宕机时也能不丢失。

<b>readpreference</b>

全新版本MongoDB数据存储席卷物联网

mongodb通过readpreference实现读写分离,可以指定读写对象。

可扩展分片集群

全新版本MongoDB数据存储席卷物联网

可扩展分片集群可以实现海量数据存储、高并发写入,例如物联网里大量设备汇报的日志数据。

mongodb为了实现分片集群,引入了两个新的组件mongos和config servers,config servers存储分片集群的元数据。首先配置好某个集合,按照某个key进行分片,接下来一条写请求就会到mongos上,mongos去config servers上查询路由表,把请求路由到后端的分片上,就实现了分片集群的功能。

<b>shardkey</b>

全新版本MongoDB数据存储席卷物联网

mongodb支持范围分片,每一个范围在mongodb的分片集群里成为一个chunk,每一个chunk就会分到后面的shard上,优点是能很好的支持范围查询需求。

mongodb支持hash分片,针对key先计算一次hash值,再根据hash值进行范围分片,优点是能均匀的将写请求分散到不同的分片。

选择集合的 shardkey 时并没有一个很完美的方案,需要用户根据数据分布特性、请求特性来选择最优的 shardkey,使用时应该尽量避免以下三个问题:

key 基数太小造成 jumbo chunk

写入分布不均,造成热点

scatter/gather 查询影响效率 

<b>负载均衡</b>

全新版本MongoDB数据存储席卷物联网

mongodb在mongos中有balancer的任务,会周期性的扫描每个shard当前负责的chunk的数量,balancer根据shard持有的chunk数量自动负载均衡,balancer

运行时,要尽量主要如下2个问题。

合理设置 balancer 窗口,避开业务访问高峰期

备份时关闭 balancer,避免出现数据不一致的状态

数据分析

<b>内建支持</b>

全新版本MongoDB数据存储席卷物联网

aggregation

pipeline支持很多的运算符,传统关系型数据库单表能做的aggregation pipeline都可以做;mongodb支持mapreduce,可以在mongodb的集合上写mapreduce的任务,数据分析后,又写回mongodb。

<b>外部框架</b>

全新版本MongoDB数据存储席卷物联网

通过mongodb spark connector,可直接在mongodb数据集上运行 spark ,与阿里云 e-mapreduce 完美结合。

mongodb 云数据库

全新版本MongoDB数据存储席卷物联网

<b>云数据库全链路监控</b>

全新版本MongoDB数据存储席卷物联网

图为内部全链路监控视图,可以精确的看到云数据库的每一个客户端的每一个连接,可以看到上行下行的带宽,请求速率,丢包率等,这对于查找线上问题是非常方便的。

<b>mongodb </b><b>内核优化</b>

全新版本MongoDB数据存储席卷物联网