关于mongodb:MongoDB-时序新特性

52次阅读

共计 2349 个字符,预计需要花费 6 分钟才能阅读完成。

目录:

  1. 解析 MongoDB 新个性“时序”
  2. 如何在 MongoDB 中应用时序?
  3. MongoDB 时序汇合性能
  4. MongoDB 时序 IOT 场景设计

一、解析 MongoDB 新个性“时序”

  • MongoDB 时序汇合是 MongoDB 5.0 新推出的性能,他能疾速将段时间内的数据写入磁盘,并且提供疾速时序检索的汇合。
  • 与一般汇合相比,时序汇合在数据插入的过程中,主动将数据依照工夫维度组织成最优的存储格局,也为前面应用程序对时序数据进步了查问效率。
  1. MongoDB 传统时序模式:

假如咱们有一个传感器每分钟测量温度并将其保留到数据库中,咱们须要写入数据库中的数据流:

{_id: ObjectId(), deviceid: 1, date: ISODate ("2019-11-10"), samples : [{temperature: 10, time: 1573833152},]},{_id: ObjectId(), deviceid: 1, date: ISODate ("2019-11-10"), samples : [[temperature: 15, time: 1573833153},]},
{_id: ObjectId(), deviceid: 1, date: ISODate ("2019-11-10"), samples : [[temperature: 14, time: 1573833154},]},
{_id: ObjectId(), deviceid: 1, date: TSODate("2019-11-10"), samples : [[temperature: 20, time: 1573833155},]}
  1. 桶模式设计数据模型:
{_id: objectId(),
  deviceid: 1,
  date: ISODate ("2019-11-10") ,
  first: 1573833152,
  last: 1573833155,
  samples : [{ temperature: 10, time: 1573833152},
    {temperature: 15, time : 1573833153},
    {temperature: 14, time: 1573833154),
    {temperature: 20, time : 1573833155}
  ]
}

字段解释:

  • id —文档的 ID,这个 ID 具备唯一性
  • deviceld —查问的设施 ID
  • date—采样日期; 咱们能够将其存储在此处以简化聚合
  • first—存储桶中读取的最旧数据的工夫戳
  • last—存储桶中读取的最新数据的工夫戳
  • samples—数据容器
  1. 用例中桶模式的劣势:
  • 节俭数据和索引的大小
  • 简化数据结构
  • 能够将须要采集的数据依照工夫维度集中在一起,不便疾速范畴检索
  • 晋升数据写入速度

二、如何在 MongoDB 种应用时序

  1. 显示指定创立的汇合为时序汇合
db.createcollection (
"weather",{
  timeseries: {
    timeField: "timestamp",metaField: "metadata",granularity: "hours"
  }
}

字段含意介绍:

  • timeField 是工夫参数,必须为 BSON data。
  • metaField 影响维度基数,好的 metaField 应该抉择低基数的,有选择性的指标,高基数必然带来性能的降落
  • granularity 是聚合粒度(可选)参数,数据库会将一个时间段的数据聚合寄存,这个参数影响性能,不影响性能
  • expireAfterSeconds 影响数据的过期,是默认通过每 60s 一次的检测实现的。过期工夫可配置
  1. CRUD 操作
  • 增:单条插入或批量插入汇合的形式(跟传统的 collection 没有区别)
  • 删(略)
  • 改(略)
  • 查:

计算时序汇合时段平均值(聚合查问):

db.weather.aggregate([
  {
    project: {
      date: {$dateToParts: { date: "$timestamp"}
      },
      temp: 1
  },
  {
    $group: {
       _id: {
         date: {
             year : "$date. year",
             month: "$date.month",
             day : "$date.day"
          }
          avgTmp: {$avg: "stemp"}
      }
])
  1. 留神点:
  • 时序汇合底层存储仍然是 WiredTiger;
  • 没有为时序查问定制太多新的语法,各种聚合仍然须要通过 aggregate 进行;
  • 时序汇合曾经依照罕用的查问模式,对数据进行了存储模型上的优化。在索引上如果有本人的针对 metafield 的过滤需要,能够失常创立二级索引;
  • MongoDB 时序汇合在更新和删除中须要增加指定条件。
  • 在以后版本里,时序汇合不反对分片 (6.0 反对分片)。

三、MongoDB 时序汇合性能

  1. 写入性能 (4C 8G 128G ssd)
  1. 读写混合压测性能:
  1. 磁盘占用:

MongoDB 对数据的压缩反对 snappy、zstd 和 zlib 算法,在以往线上实在的数据空间大小与实在磁盘空间耗费进行比照,能够得出以下论断:

压缩算法 实在数据量 实在磁盘空间耗费
snappy 压缩算法 3.5T 1-1.5T
zstd 压缩算法 3.5T 0.6-0.9T
zlib 压缩算法 3.5T 0.5-0.7T

Hbase 默认采纳的是 snappy 算法,MongoDB 时序汇合默认采纳 zstd 压缩算法,所以雷同数据量,MongoDB 磁盘占用更低。

  1. MongoDB 时序汇合应用限度:
  • 客户端加密
  • ChangeStream
  • Relndex 重建索引
  • Tiggers
  • 更新和删除限度

四、MongoDB 时序 IOT 场景设计

场景需要:
数据品质,实时生产 kafka 数据,并通过流式计算后,须要对数据进行展现,如流程图所示:

  • 时序汇合
  • 读写拆散
  • ChangeStream 分流查问
  1. 过期数据清理:
  • 能够采纳时序汇合原生态的 TTL 索引进行主动过期。
  • 能够通过新旧汇合替换的形式,对旧汇合间接删除的形式。

参考资料:

  • MongoDB 工夫序列手册
  • MongoDB Node.js 驱动手册

正文完
 0