前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >技术干货| MongoDB时间序列集合

技术干货| MongoDB时间序列集合

作者头像
MongoDB中文社区
发布于 2022-05-12 13:10:05
发布于 2022-05-12 13:10:05
1.9K00
代码可运行
举报
文章被收录于专栏:MongoDB中文社区MongoDB中文社区
运行总次数:0
代码可运行

点击下方公众号关注并分享,获取MongoDB最新资讯!

名词解释

Glossary

bucket:带有相同的元数据且在一段有限制的间  隔区间内的测量值组。

bucket collection :用于存储时序型集合的底层的分组桶的系统集合。复制、分片和索引都是在桶级别上完成的。

measurement:带有特定时间序列的K-V集合。

meta-data:时序序列里很少随时间变化的K-V对,同时可以用于识别整个时序序列。

time-series:一段间隔内的一系列测量值。

time-series collection:一种表示可写的非物化的视图的集合类型,它允许存储和查询多个时间序列,每个序列可以有不同的元数据。

MongoDB 在5.0中支持了新的timeseries collection类型的选项,该类型用于存储时序型数据。timeseries collection提供了一组用于插入和查询测量值的简单接口,同时底层实际的数据是存储在以bucket形式的集合中。

在创建timeseries collection时,timeField字段是最小必备的配置项。metaField是另一个可选的、可被指定的元数据字段,它是用于在bucket中对测量值分组的依据。MongoDB通过提供expireAfterSeconds字段选项,也支持了对测量值的过期机制。

mydb数据库中有个以mytscoll 命名的timeseries collection,该集合在MongoDB内部的catelog(用于存储集合或视图的信息)里是由一个视图和一个系统集合组成的。

  • mydb.mytscoll 是个视图,它在MongoDB底层是用bucket collection作为包含特定属性的原始集合实现的:
    • 该视图就是通过aggregation里的$_internalUnpackBucket来实现展开bucket里数据的。
    • 该视图是可写的(仅支持插入)。同时每个被插入的文档必须包含时间字段。
    • 在查询视图时,它会隐式地展开底层在bucket collection中存储的数据,然后返回原始的非bucket形式的文档数据。
  • 该系统集合的命名空间是mydb.system.buckets.mytscoll,它是用来存储实际数据的。
    • 每一个在bucket collection里的文档,都表示了一组区间间隔的时序型数据。
    • 如果在创建timeseries collection时,定义了metaField元数据字段,那么所有在bucket里的测量值都会有这个通用的元数据字段。
    • 除了时间范围,bucket还限制了每个文档数据的总条数以及测量值的大小。

Bucket Collection Schema

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{    _id: <Object ID with time component equal to control.min.<time field>>,    control: {        // <Some statistics on the measurements such min/max values of data fields>        version: 1,  // Version of bucket schema. Currently fixed at 1 since this is the                     // first iteration of time-series collections.        min: {            <time field>: <time of first measurement in this bucket, rounded down based on granularity>,            <field0>: <minimum value of 'field0' across all measurements>,            <field1>: <maximum value of 'field1' across all measurements>,            ...        },        max: {            <time field>: <time of last measurement in this bucket>,            <field0>: <maximum value of 'field0' across all measurements>,            <field1>: <maximum value of 'field1' across all measurements>,            ...        },        closed: <bool> // Optional, signals the database that this document will not receive any                       // additional measurements.    },    meta: <meta-data field (if specified at creation) value common to all measurements in this bucket>,    data: {        <time field>: {            '0', <time of first measurement>,            '1', <time of second measurement>,            ...            '<n-1>': <time of n-th measurement>,        },        <field0>: {            '0', <value of 'field0' in first measurement>,            '1', <value of 'field0' in first measurement>,            ...        },        <field1>: {            '0', <value of 'field1' in first measurement>,            '1', <value of 'field1' in first measurement>,            ...        },        ...    }}

索引

indexes

为了保证timeseries collection的查询可以受益于索引扫描而不是全表扫描,timeseries collection允许索引可以被创建在时间上,元数据上以及元数据的子属性上。从MongoDB5.2开始,在timeseries collection也允许索引被创建在测量值上。用户使用createIndex命令提供的索引规范被转换为底层buckets collection的模式。

  • timeseries collection与底层的buckets collection之间的索引映射转换关系细节,你可以参考timeseries_index_schema_conversion_functions.h.
  • 在v5.2及以上版本的最新支持的索引类型,timeseries collection会存储用户原始的索引定义到变换后的索引定义上。当从底层的bucket collection的索引映射到timeseries collections的索引时,会返回用户原始的索引定义。

当索引被创建后,可以通过listIndexes命令或$indexStats聚合计划来检查。listIndexes 和$indexStats是作用于timeseries collections的,执行时,它们会在内部将底层的bucket collection的索引转化成timeseries格式的索引,并返回。比如,当我们在元数据字段中定义有mmtimeseries collection上执行listIndexes命令时,底层的bucket collection{meta:1}索引,将会以{mm:1}格式返回。

dropIndex 和collMod (hidden: <bool>, expireAfterSeconds: <num>) 也同样支持在timeseries collection上。

时间字段上支持的索引类型:

元数据字段和元数据子字段支持的索引类型:

  • 支持所有时间字段上支持的索引类型
  • v5.2及以上版本支持2d 索引
  • v5.2及以上版本支持2dsphere 索引
  • v5.2及以上版本支持 Partial索引

仅在v5.2及以上版本,测量值字段支持的索引类型:

`timeseries collections 上不支持的索引类型,包括 唯一索引以及文本索引

桶目录

Catalog

为了保证高效地桶(分组)操作,我们在BucketCatalog里维护了一组开启的桶,你可以在bucket_catalog.h找到。在更高的级别,我们尝试着把并发写程序的写操作分组合并为可以一起提交地批处理,以减少对底层文档的写次数。写程序会插入它的输入批处理里的每一个文档到BucketCatalog,然后BucketCatalog会返回一个BucketCatalog::WriteBatch的处理器。一旦完成上面那些插入操作后,写程序就会检查每个写批处理。如果没有其他的写程序已经对批处理声明提交的权利,那么它会声明权利,并会提交它的批处理。否则,写程序将会稍后再提交处理。当它检查完所有的批处理,写程序将会等待其他的写程序提交每个剩下的批处理。

在内部,BucketCatalog维护一组对每个bucket 文档的更新操作。当批处理被提交时,它会将这些插入转换到成buckets的列格式,并确保任何control字段的更新(例如control.min 和 control.max)。

bucket文档在没有通过BucketCatalog的情况下被更新时,写程序就需要为有问题的文档或命名空间去调用BucketCatalog::clear ,这样它就可以更新它的内部状态,避免写入任何可能破坏bucket 格式的数据。这通常由OP观察者处理,但可能需要通过其他地方去调用。

bucket既可以通过手动设置选项control.closed 标识来关闭,也可以在许多场景下通过 BucketCatalog 自动关闭。如果BucketCatalog使用了超出给定的阈值(可通过服务器参数timeseriesIdleBucketExpiryMemoryUsageThreshold控制)的更多内存,此时它将会开始去关闭空闲的bucket。如果bucket是开启的且它没有任何未处于等待中未提交的测量值时,那么它就会被视为空闲的bucket。在下面这些场下 BucketCatalog 也会关闭bucket: 如果它拥有超过最大阈值(timeseriesBucketMaxCount)的测量值数据的数量;如果它拥有过大的数据量大小(timeseriesBucketMaxSize);又或者一个新的测量值数据是否是会导致bucket在其最旧的时间戳和最新的时间戳之间跨度比允许的间隔更长的时间(当前硬编码为一小时)。如果传入的测量值在原理上与已经到达给定bucket的度量不兼容,该bucket将被关闭,同时可以使用numBucketsClosedDueToSchemaChange度量进行跟踪。

在第一次提交给定bucket的写批处理时,就会生成新的完整的文档。后续的批处理提交中,我们只执行更新操作,不再生成新的完整的文档(因此称为‘经典’更新),是直接创建DocDiff(“delta”或者v2的更新)。

粒度

Granularity

timeseries collectiongranularity 选项在集合创建的时候,可以被设置成secondsminutes或者hours。后期可通过colMod操作来修改这个选项从secondsminutes或者从minuteshours,除此之外的转化修改目前都是不支持的。该参数想要表示在已给定的时序型测量数据之间的粗略的时间间隔,同时也用于调节其他内部参数对分组的影响。

单个bucket被允许的最大时间跨度,是由granularity选项控制,对于seconds,最大的时间跨度被设置成1小时,对于minutes就是24小时,对于hours就是30天。

当通过BucketCatalog开启新的bucket时,_id里的时间戳就是等同于control.min.<time field>的值,该值是从第一个插入bucket的测量数据中根据granularity选项来向下近似舍入而得到的。对于seconds,它将向下舍入到最接近的分钟,对于minutes,将向下舍入到最接近的小时,对于hours,它将向下舍入到最接近的日期。在闰秒和日历中的其他不规则情况下,这种舍入可能并不完美,并且通常通过对自纪元以来的秒数进行基本模运算来完成,假设每分钟 60 秒,每小时 60 分钟,以及每天 24 小时。

更新和删除

timeseries collection 支持符合以下限制的删除语句:

  • 仅支持metaField的属性的查询语句
  • 支持批量操作

同时更新满足上面同样的条件,另外遵循:

  • 仅支持metaField对应的属性值
  • 更新操作指定一个带有更新运算符表达式的更新文档(而不是替换文档或者更新的pipeline操作)
  • 不支持upsert:true 操作

这些更新与删除的执行都会被转换成相对应的底层的bucket collection的更新或删除操作。特别是,对于查询和更新文档,我们会使用真正的字段meta 替换集合的metaField。(参见 Bucket 集合规范

例如,对于一个使用 metaField: "tag"创建的timeseries集合db.ts,考虑一个对这个集合的更新操作,其查询语句是{"tag.tag.a": "a"} ,同时更新文档语句是 {$set: {"tag.tag.a": "A"}, $rename: {"tag.tag.b": "tag.tag.c"}}。这个更新操作在 db.system.buckets.ts上会被转换成,查询语句是{"meta.tag.a": "a"},更新语句是 {$set: {"meta.tag.a": "A"}, $rename: {"meta.tag.b": "meta.tag.c"}}。然后这个转换后的更新语句就可以像普通的更新操作一样执行。上面这些转换流程也适用于删除操作。

参考文献

References

MongoDB Blog: Time Series Data and MongoDB: Part 2 - Schema Design Best Practices

关于作者:黄璜

目前就职于上海DerbySoft,主要从事基础架构中业务流程设计及研发的工作,平时工作中MongoDB使用的较多。 在提升自己外文的能力的同时,也希望为社区做出微小的贡献。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
社区招募为了让社区组委会成员和志愿者朋友们灵活参与,同时我们为想要深度参与社区建设的伙伴们开设了“招募通道”,如果您想要在社区里面结交志同道合的技术伙伴,想要通过在社区沉淀有价值的干货内容,想要一个展示自己的舞台,提升自身的技术影响力,即刻加入社区贡献队伍~ 点击链接提交申请:http://mongoingmongoing.mikecrm.com/CPDCj1B



获取更多精彩内容点击社区网站www.mongoing.com
添加小芒果微信(ID:mongoingcom)进入中文用户组技术交流群
长按二维码加入我们
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mongoing中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MongoDB5.0版本新特性速览
MongoDB到现在已经走过了12个年头了。就在今天刚刚发布了5.0版本。来看一下新版本发布了哪些新功能和特性~官方选择从4.4直接跳到5.0可能也是为了表达出该版本变化比较大(调整了发布节奏)的含义。
phoenix、
2021/07/14
3.7K0
MongoDB5.0版本新特性速览
influxdb 时间序列数据库
1、InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等) 可度量性:你可以实时对大量数据进行计算 基于事件:它支持任意的事件数据 1)无结构(无模式):可以是任意数量的列 2)可拓展的 3)支持min, max, sum, count, mean, median 等一系列函数,方便统计 4)原生的HTTP支持,内置HTTP API 5)强大的类SQL语法 6)自带管理界面,方便使用 2、安装: rpm -ivh https://dl.influxdata.com/influxdb/releases/influxdb-0.13.0.x86_64.rpm 3、启动: sudo service influxdb start 4、客户端: 在usr/bin里使用influx即可登入Influx服务器。也可以将路径加入环境变量中,这样既可在任意地方使用influx。 InfluxDB自带web管理界面,在浏览器中输入 http://服务器IP:8083 即可进入web管理页面。 5、基本概念: database 数据库 measurement 表 point 表中的一行数据 point由time(自动生成的时间戳),field数据,tags由索引的数据 series所有在数据库中的数据,都需要通过图表来展示,而这个series表示这个表里面的数据,可以在图表上画成几条线:通过tags排列组合算出来。 6、基本操作: 客户端命令行、HTTP API、各语言API库 show databases; create database test drop database test use test
用户5760343
2022/05/14
1.2K0
influxdb 时间序列数据库
InfluxDB核心概念系列之数据元素
工欲善其事必先利其器,想要用好InfluxDB,当然要先厘清其基本概念,本文为InfluxDB核心概念系列文章之数据元素。
从大数据到人工智能
2022/01/19
1.1K0
InfluxDB核心概念系列之数据元素
MongoDB 从4.4到7.0各个版本特性概览
在数据库技术日新月异的今天,MongoDB作为领先的NoSQL数据库之一,持续地推出新版本以满足不断变化的企业需求和技术挑战。从MongoDB 4.4至7.0,每一版都融入了创新特性,旨在提升性能、扩展性、安全性和易用性,同时也反映了行业趋势和用户反馈。本文旨在全面剖析这些版本中的关键新特性,不仅是为了记录技术演进的历史,更是为了赋能数据库管理员、开发者和架构师,使他们能够充分理解并利用这些新功能,从而优化数据管理和应用性能。
DBA实战
2024/09/06
2950
MongoDB 从4.4到7.0各个版本特性概览
MongoDB Capped Collection
MongoDB Collection可以理解为关系型数据库的表,当第一次在Collection存储数据或者创建索引时,如果该Collection不存在,则会首先创建该Collection,如下:
shysh95
2024/06/03
1430
MongoDB Capped Collection
influxdb 文档_时序数据库 应用场景
InfluxDB是一个由InfluxData开发的开源时序型数据。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
全栈程序员站长
2022/11/09
1.4K0
influxdb 文档_时序数据库 应用场景
文档型数据库MongoDB的安装与入门操作
MongoDB作为NoSql数据库中的典型代表,在分布式项目中广泛应用于存储格式灵活的JSON类型数据。在笔者的上一篇文章重点推荐一个基于SpringCloud的电商微服务项目mall-swarm的微服务项目中也用到了MongoDB, 因此为了深入学习这个微服务项目,咱们有必要对MongoDB有个入门的学习。至少得在自己的电脑或者服务器上安装好MongoDB服务,并学会一些基本的CRUD操作。本文笔者就来领大家学会Windows和Linux环境下安装最新稳定版本的MongDB 6.0.2版本服务,并使用学会一些基本的CRUD shell命令操作。
用户3587585
2022/11/29
4.1K0
文档型数据库MongoDB的安装与入门操作
Mongodb日常操作命令
db.js_wx_setting_menu.storageSize();
DBA实战
2024/11/18
1070
Mongodb日常操作命令
【翻译】MongoDB指南/CRUD操作(二)
【原文地址】https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关注),写确认(写关注) 1 更新文档 1.1 更新 MongoDB提供下列方法用于更新一个集合 db.collection.updateOne() 更新使用指定过滤器匹配到的文档,即使过滤器匹配到多个文档,也只会更新一个文档。 3.2版本新增特性。 db.collection.upda
甜橙很酸
2018/03/08
2.5K0
influxDb_ef mongodb
InfluxDB(时序数据库)(influx,[ˈɪnflʌks],流入,涌入),常用的一种使用场景:监控数据统计。每毫秒记录一下电脑内存的使用情况,然后就可以根据统计的数据,利用图形化界面(InfluxDB V1一般配合Grafana)制作内存使用情况的折线图;可以理解为按时间记录一些数据(常用的监控数据、埋点统计数据等),然后制作图表做统计;
全栈程序员站长
2022/11/01
1K0
influxDb_ef mongodb
MongoDB 在Python中的常用方法
MongoEngine 是一个用于 Python 的 ODM(对象文档映射)库,可以让你方便地与 MongoDB 数据库进行交互。它提供了面向对象的方式来定义模型,并对 MongoDB 的数据进行 CRUD(创建、读取、更新、删除)操作。
沈宥
2024/07/11
3210
MongoDB 在Python中的常用方法
技术干货| 一文读懂如何查询 MongoDB 文档
点击下方公众号关注并分享获取 MongoDB 最新资讯 一.查询文档 本段提供了使用 mongo shell中 db.collection.find() 方法查询的案例。案例中使用的 inventory 集合数据可以通过下面的语句产生。db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },   { item: "notebook", qty: 50, s
MongoDB中文社区
2022/07/07
4K0
【翻译】MongoDB指南/引言
【原文地址】https://docs.mongodb.com/manual/ 引言 MongoDB是一种开源文档型数据库,它具有高性能,高可用性,自动扩展性 1.文档数据库 MongoDB用一个文档来
甜橙很酸
2018/03/08
4.4K0
【翻译】MongoDB指南/引言
MongoDB系列6:MongoDB索引的介绍
1、前言 和关系型数据库一样,MongoDB的索引可以提高查询执行效率。索引就好比书中的目录,可以快速定位书中某一页。适当的索引查询,优化器可以快速地返回结果集。 2、MongoDB支持的索引类型 在MongoDB主要支持以下几种索引类型: ·单列索引 ·复合索引 ·多键索引 ·全文索引 ·地理空间索引 ·哈希索引 2.1 单列索引 在MongoDB中,每个集合都会默认创建一个唯一索引列”_id”,”_id”列是最基本的单列索引。 创建单列索引可以使用以下语法: db.collection.cre
大数据和云计算技术
2018/03/30
3K0
MongoDB系列6:MongoDB索引的介绍
MongoDB系列---集合与文档操作03
  上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障。
Arebirth
2020/06/19
1.3K0
干货 | 每分钟写入6亿条数据,携程监控系统Dashboard存储升级实践
作者简介 大伟,携程软件技术专家,关注企业级监控、日志、可观测性领域。 一、 背景概述 框架Dashboard是一款携程内部历史悠久的自研监控产品,其定位是企业级Metrics监控场景,主要提供用户自定义Metrics接入,并基于此提供实时数据分析和视图展现的面板服务,提供可定制的基于时间序列的各类系统级性能数据和业务指标数据的看板。还可以提供灵活的数据收集接口、分布式的大容量存储和灵活的展现方式。 由于时间较早,那时候业界还没有像样的TSDB产品,类似Prometheus,InfluxDB都是后起之秀,
携程技术
2022/08/25
8650
干货 | 每分钟写入6亿条数据,携程监控系统Dashboard存储升级实践
MongoDB基本概念
Mongo 是 humongous 的中间部分,在英文里是“巨大无比”的意思。所以 MongoDB 可以翻译成“巨大无比的数据库”,更优雅的叫法是“海量数据库”。Mongodb是一款非关系型数据库,说到非关系型数据库,区别于关系型数据库最显著的特征就是没有SQL语句,数据没有固定的数据类型,关系数据库的所使用的SQL语句自从 IBM 发明出来以后,已经有 40 多年的历史了,但是时至今日,开发程序员一般不太喜欢这个东西,因为它的基本理念和程序员编程的想法不一致。后来所谓的 NoSQL 风,指的就是那些不用 SQL 作为查询语言的数据存储系统,而文档数据库 MongoDB 正是 NoSQL 的代表。看一下当下数据库的排名就会发现,目前排在Mongodb数据库前面的无一例外是老牌的关系型数据库,而在NoSQL序列中,Mongodb排名第一,且有上升的趋势。
Java廖志伟
2022/03/07
6.6K0
MongoDB基本概念
MongoDB Document
MongoDB使用BSON进行数据的存储,BSON是JSON的二进制表现形式,支持比JSON更多的数据类型。
shysh95
2024/06/03
1720
MongoDB Document
【MongoDB】mongodb4.4版本新特性
MongoDB 4.4 作为每年一度的大版本更新,已经在 7.30 号正式宣布 GA,不像之前的大版本,总是有一些重磅 Feature 的发布,比如 3.6 的 Change Stream & Causal Consistency,4.0 的多文档事务,4.2 的分布式事务,这次的 4.4 版本更像是一个维护性的版本,而且是一个用户期待已久的维护性版本,MongoDB 官方也把这次发布称之为「User-Driven Engineering」,说明新版本主要是针对用户呼声最高的一些痛点,重点进行了改进。
用户5522200
2020/09/24
3.2K0
【MongoDB】mongodb4.4版本新特性
MongoDB大量集合启动加载优化原理
启动数据加载时间对于很多数据库来说是一个不容忽视的因素,启动加载慢直接导致数据库恢复正常服务的RTO时间变长,影响服务可用性。比如Redis,启动时要加载RDB和AOF文件,把所有数据加载到内存中,根据节点内存数据量的不同,加载时间可能达到几十分钟甚至更长。
MongoDB中文社区
2020/05/11
1.6K0
MongoDB大量集合启动加载优化原理
相关推荐
MongoDB5.0版本新特性速览
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档