自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

聊聊 MongoDB 時(shí)間序列集合

數(shù)據(jù)庫(kù) MariaDB
為了保證timeseries collection的查詢可以受益于索引掃描而不是全表掃描,timeseries collection允許索引可以被創(chuàng)建在時(shí)間上,元數(shù)據(jù)上以及元數(shù)據(jù)的子屬性上。

名詞解釋

bucket:帶有相同的元數(shù)據(jù)且在一段有限制的間 隔區(qū)間內(nèi)的測(cè)量值組。

bucket collection :用于存儲(chǔ)時(shí)序型集合的底層的分組桶的系統(tǒng)集合。復(fù)制、分片和索引都是在桶級(jí)別上完成的。

measurement:帶有特定時(shí)間序列的K-V集合。

meta-data:時(shí)序序列里很少隨時(shí)間變化的K-V對(duì),同時(shí)可以用于識(shí)別整個(gè)時(shí)序序列。

time-series:一段間隔內(nèi)的一系列測(cè)量值。

time-series collection:一種表示可寫的非物化的視圖的集合類型,它允許存儲(chǔ)和查詢多個(gè)時(shí)間序列,每個(gè)序列可以有不同的元數(shù)據(jù)。

MongoDB 在5.0中支持了新的timeseries collection類型的選項(xiàng),該類型用于存儲(chǔ)時(shí)序型數(shù)據(jù)。timeseries collection提供了一組用于插入和查詢測(cè)量值的簡(jiǎn)單接口,同時(shí)底層實(shí)際的數(shù)據(jù)是存儲(chǔ)在以bucket形式的集合中。

在創(chuàng)建timeseries collection時(shí),timeField字段是最小必備的配置項(xiàng)。metaField是另一個(gè)可選的、可被指定的元數(shù)據(jù)字段,它是用于在bucket中對(duì)測(cè)量值分組的依據(jù)。MongoDB通過(guò)提供expireAfterSeconds字段選項(xiàng),也支持了對(duì)測(cè)量值的過(guò)期機(jī)制。

在mydb數(shù)據(jù)庫(kù)中有個(gè)以mytscoll 命名的timeseries collection,該集合在MongoDB內(nèi)部的catelog(用于存儲(chǔ)集合或視圖的信息)里是由一個(gè)視圖和一個(gè)系統(tǒng)集合組成的。

  • mydb.mytscoll 是個(gè)視圖,它在MongoDB底層是用bucket collection作為包含特定屬性的原始集合實(shí)現(xiàn)的:

該視圖就是通過(guò)aggregation里的$_internalUnpackBucket來(lái)實(shí)現(xiàn)展開(kāi)bucket里數(shù)據(jù)的。

該視圖是可寫的(僅支持插入)。同時(shí)每個(gè)被插入的文檔必須包含時(shí)間字段。

在查詢視圖時(shí),它會(huì)隱式地展開(kāi)底層在bucket collection中存儲(chǔ)的數(shù)據(jù),然后返回原始的非bucket形式的文檔數(shù)據(jù)。

  • 該系統(tǒng)集合的命名空間是mydb.system.buckets.mytscoll,它是用來(lái)存儲(chǔ)實(shí)際數(shù)據(jù)的。

每一個(gè)在bucket collection里的文檔,都表示了一組區(qū)間間隔的時(shí)序型數(shù)據(jù)。

如果在創(chuàng)建timeseries collection時(shí),定義了metaField元數(shù)據(jù)字段,那么所有在bucket里的測(cè)量值都會(huì)有這個(gè)通用的元數(shù)據(jù)字段。

除了時(shí)間范圍,bucket還限制了每個(gè)文檔數(shù)據(jù)的總條數(shù)以及測(cè)量值的大小。

Bucket Collection Schema

{
_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>,
...
},
...
}
}

索引

為了保證timeseries collection的查詢可以受益于索引掃描而不是全表掃描,timeseries collection允許索引可以被創(chuàng)建在時(shí)間上,元數(shù)據(jù)上以及元數(shù)據(jù)的子屬性上。從MongoDB5.2開(kāi)始,在timeseries collection也允許索引被創(chuàng)建在測(cè)量值上。用戶使用createIndex命令提供的索引規(guī)范被轉(zhuǎn)換為底層buckets collection的模式。

  • timeseries collection與底層的buckets collection之間的索引映射轉(zhuǎn)換關(guān)系細(xì)節(jié),你可以參考timeseries_index_schema_conversion_functions.h.
  • 在v5.2及以上版本的最新支持的索引類型,timeseries collection會(huì)存儲(chǔ)用戶原始的索引定義到變換后的索引定義上。當(dāng)從底層的bucket collection的索引映射到timeseries collections的索引時(shí),會(huì)返回用戶原始的索引定義。

當(dāng)索引被創(chuàng)建后,可以通過(guò)listIndexes命令或$indexStats聚合計(jì)劃來(lái)檢查。listIndexes 和$indexStats是作用于timeseries collections的,執(zhí)行時(shí),它們會(huì)在內(nèi)部將底層的bucket collection的索引轉(zhuǎn)化成timeseries格式的索引,并返回。比如,當(dāng)我們?cè)谠獢?shù)據(jù)字段中定義有mm的timeseries collection上執(zhí)行l(wèi)istIndexes命令時(shí),底層的bucket collection的{meta:1}索引,將會(huì)以{mm:1}格式返回。

dropIndex 和collMod (hidden: , expireAfterSeconds: ) 也同樣支持在timeseries collection上。

時(shí)間字段上支持的索引類型:

  • 單字段索引
  • 組合索引
  • 哈希索引
  • 通配符索引
  • 稀疏索引
  • 多鍵索引
  • 帶排序的索引

元數(shù)據(jù)字段和元數(shù)據(jù)子字段支持的索引類型:

  • 支持所有時(shí)間字段上支持的索引類型
  • v5.2及以上版本支持2d 索引
  • v5.2及以上版本支持2dsphere 索引
  • v5.2及以上版本支持 Partial索引

僅在v5.2及以上版本,測(cè)量值字段支持的索引類型:

  • 單字段索引
  • 組合索引
  • 2dsphere
  • 部分條件索引

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

桶目錄

為了保證高效地桶(分組)操作,我們?cè)贐ucketCatalog里維護(hù)了一組開(kāi)啟的桶,你可以在bucket_catalog.h找到。在更高的級(jí)別,我們嘗試著把并發(fā)寫程序的寫操作分組合并為可以一起提交地批處理,以減少對(duì)底層文檔的寫次數(shù)。寫程序會(huì)插入它的輸入批處理里的每一個(gè)文檔到BucketCatalog,然后BucketCatalog會(huì)返回一個(gè)BucketCatalog::WriteBatch的處理器。一旦完成上面那些插入操作后,寫程序就會(huì)檢查每個(gè)寫批處理。如果沒(méi)有其他的寫程序已經(jīng)對(duì)批處理聲明提交的權(quán)利,那么它會(huì)聲明權(quán)利,并會(huì)提交它的批處理。否則,寫程序?qū)?huì)稍后再提交處理。當(dāng)它檢查完所有的批處理,寫程序?qū)?huì)等待其他的寫程序提交每個(gè)剩下的批處理。

在內(nèi)部,BucketCatalog維護(hù)一組對(duì)每個(gè)bucket 文檔的更新操作。當(dāng)批處理被提交時(shí),它會(huì)將這些插入轉(zhuǎn)換到成buckets的列格式,并確保任何control字段的更新(例如control.min 和 control.max)。

當(dāng)bucket文檔在沒(méi)有通過(guò)BucketCatalog的情況下被更新時(shí),寫程序就需要為有問(wèn)題的文檔或命名空間去調(diào)用BucketCatalog::clear ,這樣它就可以更新它的內(nèi)部狀態(tài),避免寫入任何可能破壞bucket 格式的數(shù)據(jù)。這通常由OP觀察者處理,但可能需要通過(guò)其他地方去調(diào)用。

bucket既可以通過(guò)手動(dòng)設(shè)置選項(xiàng)control.closed 標(biāo)識(shí)來(lái)關(guān)閉,也可以在許多場(chǎng)景下通過(guò) BucketCatalog 自動(dòng)關(guān)閉。如果BucketCatalog使用了超出給定的閾值(可通過(guò)服務(wù)器參數(shù)timeseriesIdleBucketExpiryMemoryUsageThreshold控制)的更多內(nèi)存,此時(shí)它將會(huì)開(kāi)始去關(guān)閉空閑的bucket。如果bucket是開(kāi)啟的且它沒(méi)有任何未處于等待中未提交的測(cè)量值時(shí),那么它就會(huì)被視為空閑的bucket。在下面這些場(chǎng)下 BucketCatalog 也會(huì)關(guān)閉bucket: 如果它擁有超過(guò)最大閾值(timeseriesBucketMaxCount)的測(cè)量值數(shù)據(jù)的數(shù)量;如果它擁有過(guò)大的數(shù)據(jù)量大小(timeseriesBucketMaxSize);又或者一個(gè)新的測(cè)量值數(shù)據(jù)是否是會(huì)導(dǎo)致bucket在其最舊的時(shí)間戳和最新的時(shí)間戳之間跨度比允許的間隔更長(zhǎng)的時(shí)間(當(dāng)前硬編碼為一小時(shí))。如果傳入的測(cè)量值在原理上與已經(jīng)到達(dá)給定bucket的度量不兼容,該bucket將被關(guān)閉,同時(shí)可以使用numBucketsClosedDueToSchemaChange度量進(jìn)行跟蹤。

在第一次提交給定bucket的寫批處理時(shí),就會(huì)生成新的完整的文檔。后續(xù)的批處理提交中,我們只執(zhí)行更新操作,不再生成新的完整的文檔(因此稱為‘經(jīng)典’更新),是直接創(chuàng)建DocDiff(“delta”或者v2的更新)。

粒度

timeseries collection的granularity 選項(xiàng)在集合創(chuàng)建的時(shí)候,可以被設(shè)置成seconds,minutes或者h(yuǎn)ours。后期可通過(guò)colMod操作來(lái)修改這個(gè)選項(xiàng)從seconds到minutes或者從minutes到hours,除此之外的轉(zhuǎn)化修改目前都是不支持的。該參數(shù)想要表示在已給定的時(shí)序型測(cè)量數(shù)據(jù)之間的粗略的時(shí)間間隔,同時(shí)也用于調(diào)節(jié)其他內(nèi)部參數(shù)對(duì)分組的影響。

單個(gè)bucket被允許的最大時(shí)間跨度,是由granularity選項(xiàng)控制,對(duì)于seconds,最大的時(shí)間跨度被設(shè)置成1小時(shí),對(duì)于minutes就是24小時(shí),對(duì)于hours就是30天。

當(dāng)通過(guò)BucketCatalog開(kāi)啟新的bucket時(shí),_id里的時(shí)間戳就是等同于control.min.的值,該值是從第一個(gè)插入bucket的測(cè)量數(shù)據(jù)中根據(jù)granularity選項(xiàng)來(lái)向下近似舍入而得到的。對(duì)于seconds,它將向下舍入到最接近的分鐘,對(duì)于minutes,將向下舍入到最接近的小時(shí),對(duì)于hours,它將向下舍入到最接近的日期。在閏秒和日歷中的其他不規(guī)則情況下,這種舍入可能并不完美,并且通常通過(guò)對(duì)自紀(jì)元以來(lái)的秒數(shù)進(jìn)行基本模運(yùn)算來(lái)完成,假設(shè)每分鐘 60 秒,每小時(shí) 60 分鐘,以及每天 24 小時(shí)。

更新和刪除

timeseries collection 支持符合以下限制的刪除語(yǔ)句:

  • 僅支持metaField的屬性的查詢語(yǔ)句
  • 支持批量操作

同時(shí)更新滿足上面同樣的條件,另外遵循:

  • 僅支持metaField對(duì)應(yīng)的屬性值
  • 更新操作指定一個(gè)帶有更新運(yùn)算符表達(dá)式的更新文檔(而不是替換文檔或者更新的pipeline操作)
  • 不支持upsert:true 操作

這些更新與刪除的執(zhí)行都會(huì)被轉(zhuǎn)換成相對(duì)應(yīng)的底層的bucket collection的更新或刪除操作。特別是,對(duì)于查詢和更新文檔,我們會(huì)使用真正的字段meta 替換集合的metaField。(參見(jiàn) Bucket 集合規(guī)范)

例如,對(duì)于一個(gè)使用 metaField: "tag"創(chuàng)建的timeseries集合db.ts,考慮一個(gè)對(duì)這個(gè)集合的更新操作,其查詢語(yǔ)句是{"tag.tag.a": "a"} ,同時(shí)更新文檔語(yǔ)句是 {$set: {"tag.tag.a": "A"}, $rename: {"tag.tag.b": "tag.tag.c"}}。這個(gè)更新操作在 db.system.buckets.ts上會(huì)被轉(zhuǎn)換成,查詢語(yǔ)句是{"meta.tag.a": "a"},更新語(yǔ)句是 {$set: {"meta.tag.a": "A"}, $rename: {"meta.tag.b": "meta.tag.c"}}。然后這個(gè)轉(zhuǎn)換后的更新語(yǔ)句就可以像普通的更新操作一樣執(zhí)行。上面這些轉(zhuǎn)換流程也適用于刪除操作。

參考文獻(xiàn)

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

關(guān)于作者:黃璜

目前就職于上海DerbySoft,主要從事基礎(chǔ)架構(gòu)中業(yè)務(wù)流程設(shè)計(jì)及研發(fā)的工作,平時(shí)工作中MongoDB使用的較多。

在提升自己外文的能力的同時(shí),也希望為社區(qū)做出微小的貢獻(xiàn)。

責(zé)任編輯:武曉燕 來(lái)源: Mongoing中文社區(qū)
相關(guān)推薦

2013-08-26 09:36:27

大數(shù)據(jù)NoSQLMongoDB

2021-12-02 09:13:56

序列壓入

2021-03-02 21:52:48

Hive數(shù)據(jù)類型

2022-11-03 15:18:20

Python組件算法

2020-09-29 08:35:08

MongoDBPython數(shù)據(jù)

2024-09-09 14:57:31

2024-10-11 09:50:41

2021-03-31 11:20:57

PythonADTK異常檢測(cè)

2024-06-27 16:38:57

2009-08-18 09:59:01

Ruby技巧

2024-01-30 13:32:51

JSON反序列化序列化

2020-05-06 22:07:53

UbuntuLinux操作系統(tǒng)

2023-05-05 00:19:22

2021-07-01 21:46:30

PythonHot-Winters數(shù)據(jù)

2022-11-14 14:36:59

數(shù)據(jù)集Python自相關(guān)

2023-10-13 15:34:55

時(shí)間序列TimesNet

2021-04-07 10:02:00

XGBoostPython代碼

2024-11-15 15:20:00

模型數(shù)據(jù)

2021-07-02 10:05:45

PythonHot-winters指數(shù)平滑

2022-12-15 16:53:55

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)