MongoDB5.0 新特性“時序”解析:集合性能 VS IOT 場景設(shè)計(jì)
一、解析 MongoDB 新特性“時序”
MongoDB 時序集合是 MongoDB 5.0 新推出的功能,他能快速將段時間內(nèi)的數(shù)據(jù)寫入磁盤,并且提供快速時序檢索的集合。
與普通集合相比,時序集合在數(shù)據(jù)插入的過程中,自動將數(shù)據(jù)按照時間維度組織成最優(yōu)的存儲格式,也為后面應(yīng)用程序?qū)r序數(shù)據(jù)提高了查詢效率。
MongoDB 傳統(tǒng)時序模式:
假設(shè)我們有一個傳感器每分鐘測量溫度并將其保存到數(shù)據(jù)庫中,我們需要寫入數(shù)據(jù)庫中的數(shù)據(jù)流:
{_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},]}
桶模式設(shè)計(jì)數(shù)據(jù)模型:
{
_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 —查詢的設(shè)備ID
date—采樣日期;我們可以將其存儲在此處以簡化聚合
first—存儲桶中讀取的最舊數(shù)據(jù)的時間戳
last—存儲桶中讀取的最新數(shù)據(jù)的時間戳
samples—數(shù)據(jù)容器
用例中桶模式的優(yōu)勢:
節(jié)省數(shù)據(jù)和索引的大小
簡化數(shù)據(jù)結(jié)構(gòu)
可以將需要采集的數(shù)據(jù)按照時間維度集中在一起,方便快速范圍檢索
提升數(shù)據(jù)寫入速度
二、如何在 MongoDB 種使用時序
顯示指定創(chuàng)建的集合為時序集合
db.createcollection ("weather",
{ timeseries: {timeField: "timestamp",metaField: "metadata",granularity: "hours"
}
}
字段含義介紹:
timeField 是時間參數(shù),必須為 BSON data。
metaField 影響維度基數(shù),好的 metaField 應(yīng)該選擇低基數(shù)的,有選擇性的指標(biāo),高基數(shù)必然帶來性能的下降
granularity 是聚合粒度(可選)參數(shù),數(shù)據(jù)庫會將一個時間段的數(shù)據(jù)聚合存放,這個參數(shù)影響性能,不影響功能
expireAfterSeconds 影響數(shù)據(jù)的過期,是默認(rèn)通過每60s一次的檢測實(shí)現(xiàn)的。過期時間可配置
CRUD 操作
增:單條插入或批量插入集合的方式(跟傳統(tǒng)的 collection 沒有區(qū)別)
刪(略)
改(略)
查:
計(jì)算時序集合時段平均值(聚合查詢):
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"}
}
])
注意點(diǎn):
時序集合底層存儲依然是 WiredTiger;
沒有為時序查詢定制太多新的語法,各種聚合依然需要通過 aggregate 進(jìn)行;
時序集合已經(jīng)按照常用的查詢模式,對數(shù)據(jù)進(jìn)行了存儲模型上的優(yōu)化。在索引上如果有自己的針對 metafield 的過濾需求,可以正常創(chuàng)建二級索引;
MongoDB時序集合在更新和刪除中需要添加指定條件。
在當(dāng)前版本里,時序集合不支持分片(6.0支持分片)。
三、MongoDB 時序集合性能
寫入性能(4C 8G 128G ssd)
讀寫混合壓測性能:
磁盤占用:
MongoDB 對數(shù)據(jù)的壓縮支持 snappy、zstd 和 zlib 算法,在以往線上真實(shí)的數(shù)據(jù)空間大小與真實(shí)磁盤空間消耗進(jìn)行對比,可以得出以下結(jié)論:
Hbase 默認(rèn)采用的是 snappy 算法,MongoDB 時序集合默認(rèn)采用 zstd 壓縮算法,所以相同數(shù)據(jù)量,MongoDB 磁盤占用更低。
MongoDB時序集合使用限制:
客戶端加密
ChangeStream
Relndex 重建索引
Tiggers
更新和刪除限制
四、MongoDB時序 IOT 場景設(shè)計(jì)
場景需求:
數(shù)據(jù)質(zhì)量,實(shí)時消費(fèi) kafka 數(shù)據(jù),并經(jīng)過流式計(jì)算后,需要對數(shù)據(jù)進(jìn)行展示,如流程圖所示:
時序集合
讀寫分離
ChangeStream 分流查詢
過期數(shù)據(jù)清理:
可以采用時序集合原生態(tài)的TTL索引進(jìn)行自動過期。
可以通過新舊集合替換的方式,對舊集合直接刪除的方式。
作者:王頂
版權(quán)聲明:
本站所有文章和圖片均來自用戶分享和網(wǎng)絡(luò)收集,文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系網(wǎng)站客服處理。