時(shí)序數(shù)據(jù)庫(kù)分析 - TimescaleDB時(shí)序數(shù)據(jù)庫(kù)介紹

PostgreSQL , TimescaleDB , 時(shí)間序列 , 物聯(lián)網(wǎng) , IoT

背景

隨著物聯(lián)網(wǎng)的發(fā)展,時(shí)序數(shù)據(jù)庫(kù)的需求越來(lái)越多议忽,比如水文監(jiān)控十减、工廠的設(shè)備監(jiān)控、國(guó)家安全相關(guān)的數(shù)據(jù)監(jiān)控嫉称、通訊監(jiān)控、金融行業(yè)指標(biāo)數(shù)據(jù)壳繁、傳感器數(shù)據(jù)等荔棉。

在互聯(lián)網(wǎng)行業(yè)中,也有著非常多的時(shí)序數(shù)據(jù)润樱,例如用戶訪問(wèn)網(wǎng)站的行為軌跡,應(yīng)用程序產(chǎn)生的日志數(shù)據(jù)等等嗅钻。

時(shí)序數(shù)據(jù)有幾個(gè)特點(diǎn)

1. 基本上都是插入,沒(méi)有更新的需求养篓。

2. 數(shù)據(jù)基本上都有時(shí)間屬性赂蕴,隨著時(shí)間的推移不斷產(chǎn)生新的數(shù)據(jù),舊的數(shù)據(jù)不需要保存太久概说。

業(yè)務(wù)方對(duì)時(shí)序數(shù)據(jù)通常有幾個(gè)查詢需求

1. 獲取最新?tīng)顟B(tài),查詢最近的數(shù)據(jù)(例如傳感器最新的狀態(tài))

2. 展示區(qū)間統(tǒng)計(jì)萍丐,指定時(shí)間范圍放典,查詢統(tǒng)計(jì)信息船万,例如平均值骨田,最大值态贤,最小值,計(jì)數(shù)等悠汽。芥驳。。

3. 獲取異常數(shù)據(jù)兆旬,根據(jù)指定條件,篩選異常數(shù)據(jù)

時(shí)序數(shù)據(jù)庫(kù)應(yīng)該具備的特點(diǎn)

1. 壓縮能力

通常用得上時(shí)序數(shù)據(jù)庫(kù)的業(yè)務(wù)宿饱,傳感器產(chǎn)生的數(shù)據(jù)量都是非常龐大的,數(shù)據(jù)壓縮可以降低存儲(chǔ)成本谬以。

2. 自動(dòng)rotate

時(shí)序數(shù)據(jù)通常對(duì)歷史數(shù)據(jù)的保留時(shí)間間隔是有規(guī)定的由桌,例如一個(gè)線上時(shí)序數(shù)據(jù)業(yè)務(wù),可能只需要保留最近1周的數(shù)據(jù)行您。

為了方便使用,時(shí)序數(shù)據(jù)庫(kù)必須有數(shù)據(jù)自動(dòng)rotate的能力片橡。

3. 支持分片淮野,水平擴(kuò)展

因?yàn)樯婕暗膫鞲衅骺赡芎芏啵瑔蝹€(gè)節(jié)點(diǎn)可能比較容易成為瓶頸骤星,所以時(shí)序數(shù)據(jù)庫(kù)應(yīng)該具備水平擴(kuò)展的能力,例如分表應(yīng)該支持水平分區(qū)舆吮。

4. 自動(dòng)擴(kuò)展分區(qū),

業(yè)務(wù)對(duì)時(shí)序數(shù)據(jù)的查詢色冀,往往都會(huì)帶上對(duì)時(shí)間區(qū)間進(jìn)行過(guò)濾,因此時(shí)序數(shù)據(jù)通常在分區(qū)時(shí)屯换,一定會(huì)有一個(gè)時(shí)間分區(qū)的概念。時(shí)序數(shù)據(jù)庫(kù)務(wù)必能夠支持自動(dòng)擴(kuò)展分區(qū)彤悔,減少用戶的管理量索守,不需要人為的干預(yù)自動(dòng)擴(kuò)展分區(qū)。例如1月份月末卵佛,自動(dòng)創(chuàng)建2月份的分區(qū)。

5. 插入性能

時(shí)序數(shù)據(jù)望拖,插入是一個(gè)強(qiáng)需求挫鸽。對(duì)于插入性能要求較高。

6. 分區(qū)可刪除

分區(qū)可以被刪除丢郊,例如保留1個(gè)月的數(shù)據(jù),1個(gè)月以前的分區(qū)都可以刪除掉架诞。

7. 易用性(SQL接口)

SQL是目前最通用的數(shù)據(jù)庫(kù)訪問(wèn)語(yǔ)言,如果時(shí)序數(shù)據(jù)庫(kù)能支持SQL是最好的谴忧。

8. 類型豐富

物聯(lián)網(wǎng)的終端各異角虫,會(huì)有越來(lái)越多的非標(biāo)準(zhǔn)類型的支持需求。例如采集圖像的傳感器戳鹅,數(shù)據(jù)庫(kù)中至少要能夠存取圖像的特征值。而對(duì)于其他垂直行業(yè)也是如此妇穴,為了最大程度的詮釋業(yè)務(wù)爬虱,必須要有精準(zhǔn)的數(shù)據(jù)類型來(lái)支撐跑筝。

9. 索引接口

支持索引,毫無(wú)疑問(wèn)是為了加速查詢而引入的继蜡。

10. 高效分析能力

時(shí)序數(shù)據(jù)逛腿,除了單條的查詢单默,更多的是報(bào)表分析或者其他的分析類需求。這對(duì)時(shí)序數(shù)據(jù)庫(kù)的統(tǒng)計(jì)能力也是一個(gè)挑戰(zhàn)搁廓。

11. 其他特色

11.1 支持豐富的數(shù)據(jù)類型耕皮,數(shù)組、范圍類型凌停、JSON類型、K-V類型台诗、GIS類型、圖類型等拉队。滿足更多的工業(yè)化需求阻逮,例如傳感器的位置信息、傳感器上傳的數(shù)據(jù)值的范圍叔扼,批量以數(shù)組或JSON的形式上傳,傳感器甚至可能上傳圖片特征值慷蠕,便于圖片的分析。(例如國(guó)家安全相關(guān))流炕,軌跡數(shù)據(jù)的上層則帶有GIS屬性。

這個(gè)世界需要的是支持類型豐富的時(shí)序數(shù)據(jù)庫(kù)每辟,而不是僅僅支持簡(jiǎn)單類型的時(shí)序數(shù)據(jù)庫(kù)。

11.2 支持豐富的索引接口渠欺,因?yàn)轭愋拓S富了,普通的B-TREE索引可能無(wú)法滿足快速的檢索需求胳岂,需要更多的索引來(lái)支持 數(shù)組、JSON乳丰、GIS内贮、圖特征值、K-V夜郁、范圍類型等奕筐。 (例如PostgreSQL的gin, gist, sp-gist, brin, rum, bloom, hash索引接口)

這兩點(diǎn)可以繼承PostgreSQL數(shù)據(jù)庫(kù)的已有功能,已完全滿足著角。

TimescaleDB介紹

TimescaleDB是基于PostgreSQL數(shù)據(jù)庫(kù)打造的一款時(shí)序數(shù)據(jù)庫(kù)剑勾,插件化的形式虽另,隨著PostgreSQL的版本升級(jí)而升級(jí),不會(huì)因?yàn)榱砹⒎种?lái)麻煩捂刺。

TimescaleDB架構(gòu)

數(shù)據(jù)自動(dòng)按時(shí)間和空間分片(chunk)募寨。

TimescaleDB具備以下特點(diǎn)

1. 基于時(shí)序優(yōu)化

2. 自動(dòng)分片(按時(shí)間、空間自動(dòng)分片(chunk))

3. 全SQL接口

4. 支持垂直于橫向擴(kuò)展

5. 支持時(shí)間維度拔鹰、空間維度自動(dòng)分區(qū)∏』空間維度指屬性字段(例如傳感器ID宾茂,用戶ID等)

6. 支持多個(gè)SERVER跨晴,多個(gè)CHUNK的并行查詢片林。分區(qū)在TimescaleDB中被稱為chunk。

7. 自動(dòng)調(diào)整CHUNK的大小

8. 內(nèi)部寫(xiě)優(yōu)化(批量提交费封、內(nèi)存索引、事務(wù)支持弓摘、數(shù)據(jù)倒灌)。

內(nèi)存索引,因?yàn)閏hunk size比較適中爷抓,所以索引基本上都不會(huì)被交換出去,寫(xiě)性能比較好蓝撇。

數(shù)據(jù)倒灌,因?yàn)橛行﹤鞲衅鞯臄?shù)據(jù)可能寫(xiě)入延遲虽抄,導(dǎo)致需要寫(xiě)以前的chunk,timescaleDB允許這樣的事情發(fā)生(可配置)迈窟。

9. 復(fù)雜查詢優(yōu)化(根據(jù)查詢條件自動(dòng)選擇chunk忌栅,最近值獲取優(yōu)化(最小化的掃描,類似遞歸收斂),limit子句pushdown到不同的server,chunks索绪,并行的聚合操作)

《時(shí)序數(shù)據(jù)合并場(chǎng)景加速分析和實(shí)現(xiàn) - 復(fù)合索引,窗口分組查詢加速瑞驱,變態(tài)遞歸加速》

10. 利用已有的PostgreSQL特性(支持GIS,JOIN等)凳寺,方便的管理(流復(fù)制、PITR)

11. 支持自動(dòng)的按時(shí)間保留策略(自動(dòng)刪除過(guò)舊數(shù)據(jù))

疑問(wèn)

1. chunk過(guò)多读第,會(huì)不會(huì)影響查詢性能?

這點(diǎn)不需要擔(dān)心怜瞒,PostgreSQL 10.0已經(jīng)優(yōu)化了

《PostgreSQL 10.0 preview 性能增強(qiáng) - 分區(qū)表子表元信息搜索性能增強(qiáng)》

例子

1. 創(chuàng)建時(shí)序表(hypertable)

# Create a schema for a new hypertable? CREATE TABLE sensor_data ("time"timestamp with time zone NOTNULL,? device_id TEXT NOTNULL,? location TEXTNULL,? temperature NUMERICNULL,? humidity NUMERICNULL,? pm25 NUMERIC? );# Create a hypertable from this data? SELECT create_hypertable? ('sensor_data','time','device_id',16);

2. 遷移數(shù)據(jù)到hyper table

# Migrate data from existing Postgres table into? # a TimescaleDB hypertable? INSERTINTO sensor_data (SELECT * FROM old_data);

3. 查詢hyper table

# Query hypertable like any SQL table? SELECT device_id, AVG(temperature) from sensor_data? WHERE temperature IS NOTNULLANDhumidity >0.5ANDtime > now() - interval'7 day'GROUP BY device_id;

4. 查詢最近異常的數(shù)據(jù)

# Metrics about resource-constrained devices? SELECTtime, cpu, freemem, battery FROM devops? WHERE device_id='foo'AND cpu >0.7AND freemem <0.2ORDER BYtimeDESC? LIMIT100;

5. 計(jì)算最近7天,每小時(shí)的異常次數(shù)

# Calculate total errors by latest firmware versions? # per hour over the last 7 days? SELECT date_trunc('hour', time)ashour, firmware,? COUNT(error_msg)aserrno FROM data? WHERE firmware >50ANDtime > now() - interval'7 day'GROUP BY hour, firmware? ORDER BY hour DESC, errno DESC;

6. 計(jì)算巴士的每小時(shí)平均速度

# Find average bus speed in last hour? # for each NYC borough? SELECT loc.region, AVG(bus.speed)FROM bus? INNER JOIN locON(bus.bus_id = loc.bus_id)? WHERE loc.city='nyc'AND bus.time > now() - interval'1 hour'GROUP BY loc.region;

7. 展示最近12小時(shí)惠窄,每小時(shí)的平均值

=#? SELECT date_trunc('hour', time) AS hour, AVG(weight)? FROM logs? ? ? WHERE device_type ='pressure-sensor'AND customer_id =440AND time > now() - interval'12 hours'GROUP BY hour;? ? hour| AVG(weight)?

--------------------+--------------?

2017-01-04 12:00? |170.02017-01-0413:00| 174.2?

2017-01-04 14:00? |174.02017-01-0415:00| 178.6?

2017-01-04 16:00? |173.02017-01-0417:00| 169.9?

2017-01-04 18:00? |168.12017-01-0419:00| 170.2?

2017-01-04 20:00? |167.42017-01-0421:00| 168.6?

8. 監(jiān)控每分鐘過(guò)載的設(shè)備數(shù)量

=#? SELECT date_trunc('minute', time) AS minute, COUNT(device_id)? FROM logs? ? ? WHERE cpu_level >0.9AND free_mem <1024AND time > now() - interval'24 hours'GROUP BY minute? ? ? ORDER BY COUNT(device_id) DESC LIMIT25;? ? minute| heavy_load_devices?

--------------------+---------------------?

2017-01-04 14:59? |16532017-01-0415:01| 1650?

2017-01-04 15:00? |16052017-01-0415:02| 1594?

2017-01-04 15:03? |15942017-01-0415:04| 1561?

2017-01-04 15:06? |14992017-01-0415:05| 1460?

2017-01-04 15:08? |1459

9. 最近7天杆融,按固件版本,輸出每個(gè)固件版本的報(bào)錯(cuò)次數(shù)

=#? SELECT firmware_version, SUM(error_count) FROM logs? WHERE time > now() - interval'7 days'GROUP BY firmware_version? ? ? ORDER BY SUM(error_count) DESC LIMIT10;? ? firmware_version| SUM(error_count)?

-------------------+-------------------?

1.0.10? ? ? ? ? ? |1911.1.0| 180?

1.1.1? ? ? ? ? ? |1791.0.8| 164?

1.1.3? ? ? ? ? ? |1611.1.2| 152?

1.2.1? ? ? ? ? ? |1441.2.0| 137?

1.0.7? ? ? ? ? ? |1301.0.5| 112?

1.2.2? ? ? ? ? ? |110

10. 某個(gè)范圍脾歇,每小時(shí)淘捡,溫度高于90度的設(shè)備數(shù)量。

=#? SELECT date_trunc('hour', time) AS hour, COUNT(logs.device_id)? FROM logs? ? ? JOIN devices ON logs.device_id = devices.id? ? ? WHERE logs.temperature >90AND devices.location ='SITE-1'GROUP BY hour;? ? hour| COUNT(logs.device_id)?

--------------------+------------------------?

2017-01-04 12:00? |9942017-01-0413:00| 905?

2017-01-04 14:00? |8752017-01-0415:00| 910?

2017-01-04 16:00? |9052017-01-0417:00| 840?

2017-01-04 18:00? |8012017-01-0419:00| 813?

2017-01-04 20:00? |798

小結(jié)

1. TimescaleDB是基于PostgreSQL的時(shí)序數(shù)據(jù)庫(kù)插件激况,完全繼承了PostgreSQL的功能,對(duì)于復(fù)雜查詢乌逐,各種類型(GIS,json,k-v,圖像特征值,range,數(shù)組,復(fù)合類型,自定義類型,.....)的支持非常豐富创葡,非常適合工業(yè)化的時(shí)序數(shù)據(jù)庫(kù)場(chǎng)景需求。

1.1 支持豐富的數(shù)據(jù)類型蹈丸,數(shù)組、范圍類型逻杖、JSON類型、K-V類型闻伶、GIS類型、圖類型等蓝翰。滿足更多的工業(yè)化需求光绕,例如傳感器的位置信息诞帐、傳感器上傳的數(shù)據(jù)值的范圍,批量以數(shù)組或JSON的形式上傳停蕉,傳感器甚至可能上傳圖片特征值钙态,便于圖片的分析。(例如國(guó)家安全相關(guān))册倒,軌跡數(shù)據(jù)的上層則帶有GIS屬性。

未來(lái)驻子,這個(gè)世界更多需要的是支持類型豐富的時(shí)序數(shù)據(jù)庫(kù),而不僅僅是支持簡(jiǎn)單類型的時(shí)序數(shù)據(jù)庫(kù)脾歧。

1.2 支持豐富的索引接口,因?yàn)轭愋拓S富了,普通的B-TREE索引可能無(wú)法滿足快速的檢索需求司顿,需要更多的索引來(lái)支持 數(shù)組、JSON大溜、GIS、圖特征值钦奋、K-V、范圍類型等朦拖。 (例如PostgreSQL的gin, gist, sp-gist, brin, rum, bloom, hash索引接口)

2. 數(shù)據(jù)的后期處理,分析璧帝,結(jié)合PostgreSQL退出的HTAP特性,可以更好的滿足大量時(shí)序數(shù)據(jù)的實(shí)時(shí)查詢睬隶,實(shí)時(shí)挖掘的需求。

結(jié)合技術(shù)包括: CPU多核并行計(jì)算苏潜、向量計(jì)算、LLVM恤左、列存儲(chǔ)、算子復(fù)用赃梧、內(nèi)置的sharding 等等。

《PostgreSQL 10.0 preview 性能增強(qiáng) - 推出JIT開(kāi)發(fā)框架(朝著HTAP邁進(jìn))》

《分析加速引擎黑科技 - LLVM授嘀、列存、多核并行览闰、算子復(fù)用 大聯(lián)姻 - 一起來(lái)開(kāi)啟PostgreSQL的百寶箱》

《PostgreSQL 向量化執(zhí)行插件(瓦片式實(shí)現(xiàn)) 10x提速OLAP》

《PostgreSQL 10.0 preview 功能增強(qiáng) - OLAP增強(qiáng) 向量聚集索引(列存儲(chǔ)擴(kuò)展)》

《PostGIS 地理信息數(shù)據(jù) 多核并行處理》

《PostgreSQL 9.6 sharding + 單元化 (based on postgres_fdw) 最佳實(shí)踐 - 通用水平分庫(kù)場(chǎng)景設(shè)計(jì)與實(shí)踐》

《PostgreSQL 9.6 引領(lǐng)開(kāi)源數(shù)據(jù)庫(kù)攻克多核并行計(jì)算難題》

參考

http://www.timescale.com/index.html

http://www.timescale.com/papers/timescaledb.pdf

https://github.com/timescale/timescaledb

TimescaleDB PPT

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末压鉴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子油吭,更是在濱河造成了極大的恐慌,老刑警劉巖婉宰,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件推穷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馒铃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)娃殖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人珊随,你說(shuō)我怎么就攤上這事∫抖矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵螟炫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我昼钻,道長(zhǎng),這世上最難降的妖魔是什么然评? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任狈究,我火速辦了婚禮,結(jié)果婚禮上抖锥,老公的妹妹穿的比我還像新娘。我一直安慰自己磅废,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布拯勉。 她就那樣靜靜地躺著,像睡著了一般宫峦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斗遏,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天诵次,我揣著相機(jī)與錄音,去河邊找鬼逾一。 笑死,一個(gè)胖子當(dāng)著我的面吹牛遵堵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锡足,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壳坪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起爽蝴,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎九孩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體躺彬,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年顾患,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片江解。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徙歼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魄梯,到底是詐尸還是另有隱情,我是刑警寧澤酿秸,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站辣苏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏稀蟋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一骏融、第九天 我趴在偏房一處隱蔽的房頂上張望链嘀。 院中可真熱鬧档玻,春花似錦、人聲如沸窃肠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至纤怒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泊窘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工烘豹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人携悯。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像龟劲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昌跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容