《德歌:PostgreSQL獨(dú)孤九式搞定物聯(lián)網(wǎng)》要點(diǎn):
本文介紹了德歌:PostgreSQL獨(dú)孤九式搞定物聯(lián)網(wǎng),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
相關(guān)主題:PostgreSQL教程
【直播預(yù)告】5月27日,阿里云高級(jí)技術(shù)專家德歌將在云棲社區(qū)直播《云數(shù)據(jù)庫RDS for PostgreSQL最佳實(shí)踐》 : https://yq.aliyun.com/webinar/join/15 ,為你分享阿里云云數(shù)據(jù)庫PostgreSQL的最佳技術(shù)實(shí)戰(zhàn),包含PostgreSQL使用技巧、上云實(shí)戰(zhàn)、數(shù)據(jù)遷移與同步、插件使用等內(nèi)容,純干貨.
物聯(lián)網(wǎng)行業(yè)不再僅僅只是設(shè)備的接入,設(shè)備接入后數(shù)據(jù)的采集和融合,以及融合后的分析,會(huì)為整個(gè)社會(huì)帶來重要的價(jià)值.數(shù)據(jù),讓我們更真實(shí)的了解社會(huì)與自然,讓人與自然、與社會(huì)更加的融合.但物聯(lián)網(wǎng)也遠(yuǎn)沒你想的那么難,經(jīng)典的物聯(lián)網(wǎng)架構(gòu)分為感知層、網(wǎng)絡(luò)層和應(yīng)用層.感知層主要包含傳感器網(wǎng)關(guān)、節(jié)點(diǎn)等數(shù)據(jù)采集工具;采集到的數(shù)據(jù)再經(jīng)過互聯(lián)網(wǎng)、移動(dòng)通信網(wǎng)等傳輸網(wǎng)傳遞到物聯(lián)網(wǎng)的“大腦”-應(yīng)用層加以分析應(yīng)用.隨著物聯(lián)網(wǎng)的越來越廣泛使用,特定應(yīng)用場(chǎng)景的需求也越發(fā)明顯,如智能物流中需要對(duì)地理位置信息處理需求強(qiáng)烈;公安刑偵中的模糊化搜索等等.這不僅對(duì)物聯(lián)網(wǎng)中的硬件是個(gè)挑戰(zhàn),同時(shí)對(duì)物聯(lián)網(wǎng)中數(shù)據(jù)庫管理系統(tǒng)也提出了更高的要求.
本文即為年夜家分享關(guān)于PostgreSQL如何搞定物聯(lián)網(wǎng)的“獨(dú)孤九式”——
總訣式-知己知彼、百戰(zhàn)不殆
圖一 總訣式-知己知彼、百戰(zhàn)不殆
正如兵家講究知己知彼,百戰(zhàn)不殆一樣,要真正實(shí)現(xiàn)萬物互聯(lián)、互通的物聯(lián)網(wǎng),就要熟知特定場(chǎng)景的具體要求,有針對(duì)性地給出辦理方案.通過對(duì)智能家居、環(huán)境監(jiān)測(cè)、城市交通、個(gè)人保健等具體場(chǎng)景的分析,可以對(duì)物聯(lián)網(wǎng)應(yīng)用場(chǎng)景特性做一個(gè)小結(jié):
數(shù)據(jù)量大 (壓縮、數(shù)據(jù)處理才能);
數(shù)據(jù)有時(shí)序、時(shí)空、文本屬性 (時(shí)序、地理位置、文本數(shù)據(jù)處理才能);
某些數(shù)據(jù)難以布局化,如圖像處理 (自定義能力、擴(kuò)展能力、非布局化數(shù)據(jù)處理能力);
數(shù)據(jù)處理實(shí)時(shí)性高 (流式處理才能);
數(shù)據(jù)維度多,相關(guān)性復(fù)雜 (復(fù)雜查詢、統(tǒng)計(jì)分析才能);
有模糊、相似度查詢需求 (數(shù)據(jù)歸類、索引功力);
某些場(chǎng)景行鎖競(jìng)爭(zhēng)強(qiáng)烈 (秒殺特性功能).
有了總訣式作為心法總綱,就可以針對(duì)特定的“招式”一一破解.
破劍式 - 搞定非布局化、定制數(shù)據(jù)對(duì)象
圖二 破劍式 - 搞定非布局化、定制數(shù)據(jù)對(duì)象
要知道很多數(shù)據(jù)是弗成以預(yù)先結(jié)構(gòu)化的,或者是經(jīng)過產(chǎn)品迭代過程后,預(yù)先結(jié)構(gòu)化不再起作用,如圖像處理等.因此非結(jié)構(gòu)化的處理在物聯(lián)網(wǎng)中顯得尤為重要.
PostgreSQL是這樣來應(yīng)對(duì)非結(jié)構(gòu)化數(shù)據(jù)場(chǎng)景的:首先PostgreSQL支持JSONB數(shù)據(jù)類型,該數(shù)據(jù)類型非常適合非結(jié)構(gòu)化數(shù)據(jù)場(chǎng)景,例如傳感器采集的數(shù)據(jù)以JSON格式上傳;其次在定制數(shù)據(jù)對(duì)象方面,PostgreSQL開放了類型擴(kuò)展和索引擴(kuò)展兩類接口,使用者無需關(guān)注數(shù)據(jù)庫內(nèi)核的實(shí)現(xiàn)方式,只需要關(guān)注業(yè)務(wù)自己.比如電路板的質(zhì)量檢測(cè)場(chǎng)景,使用者只需要關(guān)注焊點(diǎn)是否虛焊,然后再通過開放的接口將其對(duì)象化到數(shù)據(jù)庫中;同時(shí)PostgreSQL中的自定義函數(shù)支持C、Python、Java等多種語言定義,擴(kuò)展性極高.
破刀式 - 搞定文本、空間、時(shí)序流式數(shù)據(jù)
圖三 破刀式 - 搞定文本、空間、時(shí)序流式數(shù)據(jù)
在模糊查詢、分詞等文本處理方面,PostgreSQL天然支持分詞的特性,包含中文分詞和英文分詞,性能上能夠做到每秒處理千萬詞匯的級(jí)別,足夠滿足使用者的需求.
空間地理位置數(shù)據(jù)管理方面,PostgreSQL支持PostGIS和Pgrouting兩種位置處置的插件,PostGIS是全球使用范圍最廣的地理位置信息處置插件,在美國宇航局、歐洲宇航局等企業(yè)中得到了廣泛使用;Pgrouting是基于位置信息完成最短路徑運(yùn)算的插件.
流式處理方面,PostgreSQL 9.5以后的版本支持BRIN索引,非常適合帶有時(shí)序?qū)傩缘牧魇綌?shù)據(jù).如果依照時(shí)間來訪問流式日志數(shù)據(jù),以往需要?jiǎng)?chuàng)建B-tree索引進(jìn)行范圍查詢或者精確匹配,但是B-tree索引會(huì)因?yàn)樾枰鎯?chǔ)的較大信息量導(dǎo)致索引也很龐大;而BRIN記錄的是每(連續(xù))塊元數(shù)據(jù),索引變得很小.下圖是兩種索引之間差別詳細(xì)對(duì)比:
圖四 BRIN索引與B-TREE 索引性能對(duì)比
破槍式 - 搞定實(shí)時(shí)流處置
圖五 破槍式 - 搞定實(shí)時(shí)流處置
實(shí)時(shí)流處理的實(shí)時(shí)性要求很高,同時(shí)傳統(tǒng)的流式計(jì)算開發(fā)門檻高.但采用PostgreSQL,僅一條SQL就可以搞定流失實(shí)時(shí)處理.在數(shù)據(jù)源源不斷地往數(shù)據(jù)庫持續(xù)插入過程中,只必要定義好必要實(shí)時(shí)統(tǒng)計(jì)的窗口或者是流視圖,數(shù)據(jù)庫后臺(tái)就可以實(shí)時(shí)地進(jìn)行數(shù)據(jù)統(tǒng)計(jì).查詢流失處理結(jié)果的響應(yīng)時(shí)間是在毫秒級(jí)別的.PostgreSQL在流式處理方面大大簡(jiǎn)化了開發(fā)這一環(huán)節(jié).其處理能力相當(dāng)強(qiáng)大,一臺(tái)8G CPU的服務(wù)器每天能夠處理百億級(jí)別的流式數(shù)據(jù).
破鞭式 - 搞定復(fù)雜查詢
圖六 破鞭式 - 搞定復(fù)雜查詢
在物聯(lián)網(wǎng)中,因?yàn)閿?shù)據(jù)維度多、相關(guān)性復(fù)雜,所以復(fù)雜查詢也是一個(gè)不容忽視的問題.PostgreSQL中通過支持遺傳算法、HASH JOIN、HASH 聚合,辦理了多表查詢的效率問題,在分析場(chǎng)景中比傳統(tǒng)的嵌套循環(huán)性能提升100倍以上.
除此之外,在監(jiān)測(cè)場(chǎng)景中,傳統(tǒng)基于閥值或狀態(tài)的監(jiān)測(cè)方式是無法發(fā)現(xiàn)監(jiān)測(cè)過程中存在抖動(dòng)、趨勢(shì)異常的情況.PostgreSQL中采納基于方差的監(jiān)測(cè)方式用于抖動(dòng)檢測(cè);同時(shí)基于時(shí)間或?qū)傩韵嚓P(guān)性,進(jìn)行趨勢(shì)檢測(cè),防患于未然.
破索式 - 搞定數(shù)據(jù)闡發(fā)
PostgreSQL具有強(qiáng)大的數(shù)據(jù)挖掘才能,可以通過一條SQL搞定數(shù)據(jù)挖掘,例如:
SELECT kmeans(ARRAY[x, y, z], K) OVER , * FROM samples;
這條語句就可以實(shí)現(xiàn)聚類分析;同時(shí)PostgreSQL支持GPU,CPU并行計(jì)算,處理才能達(dá)到25GB/s,已經(jīng)達(dá)到目前內(nèi)存極限;此外PostgreSQL還兼容MADLib庫(支持幾百個(gè)機(jī)器學(xué)習(xí)庫函數(shù)、對(duì)應(yīng)各種數(shù)學(xué)模型)、PL/R,、PL/Python.
圖七 破索式 - 搞定數(shù)據(jù)闡發(fā)
破掌式 - 搞定秒殺(高并發(fā)行鎖競(jìng)爭(zhēng))
圖八 破掌式 - 搞定秒殺(高并發(fā)行鎖競(jìng)爭(zhēng))
在物聯(lián)網(wǎng)領(lǐng)域,例如秒殺等場(chǎng)景行鎖競(jìng)爭(zhēng)強(qiáng)烈.傳統(tǒng)的行鎖具有無效等待多、無效等待用戶長(zhǎng)時(shí)間占用會(huì)話資源、發(fā)現(xiàn)鎖沖突的代碼路徑長(zhǎng),需進(jìn)行大量CPU運(yùn)算等弊端.PostgreSQL提供了超輕鎖((advisory LOCK))來辦理高并發(fā)鎖競(jìng)爭(zhēng)問題,通過CPU運(yùn)算發(fā)現(xiàn)行鎖之前就知道是不是存在沖突,大大縮短CPU計(jì)算、等待資源,比如在秒殺搶手機(jī)的活動(dòng)中,給定每個(gè)手機(jī)一個(gè)編號(hào),拿到編號(hào)的用戶才可以進(jìn)行搶手機(jī),這樣就辦理了并行度的問題,整體性能得到了近百倍的提升.
破箭式 - 搞定模糊、正則查詢
圖九 破箭式 - 搞定模糊、正則查詢
物聯(lián)網(wǎng)中,對(duì)高效的模糊、相近度查詢需求,較大傳統(tǒng)查詢方式是采用全表掃描的方式,百億數(shù)據(jù)的查詢響應(yīng)至少是小時(shí)級(jí)其余.在PostgreSQL中,通過使用GIN R-TREE索引可以將查詢時(shí)間縮短到秒級(jí).
這里舉一個(gè)模糊查詢的例子,如上圖所示的車牌,盡管對(duì)其中一部門做了遮擋,在PostgreSQL中,通過下幾行語句,就可以輕松查出車主的個(gè)人信息:
select 'postregsql' % 'postgresql';
postgres=# select similarity('postregsql','postgresql');
similarity
------------
0.375
(1 row)
select * from tbl where info ~ '^???6888$';
select * from tbl where info ~ '^???688?$';
PostgreSQL 這一特性,也是其廣泛地用于公安刑偵、車牌、地址、郵箱等查詢中.
破氣式 - 搞定大數(shù)據(jù)處理才能
圖十 破氣式 - 搞定大數(shù)據(jù)處理才能
隨著數(shù)據(jù)量的增大,會(huì)衍生出非常多的問題.在PostgreSQL采取了以下幾種方式處置大數(shù)據(jù):
對(duì)于單機(jī)節(jié)點(diǎn),采納基于CPU和GPU的計(jì)算;
PostgreSQL 添加了FDW插件用于數(shù)據(jù)的冷熱分離,可以將數(shù)據(jù)放置在Hadoop或者Spark,通過 PostgreSQL 提供的統(tǒng)一拜訪接口,實(shí)現(xiàn)HTAP(在線與離線處理一份數(shù)據(jù));
支持OLTP分庫分表;
支持讀寫分離、一主多備、多副本強(qiáng)同步;
通過級(jí)聯(lián)復(fù)制,辦理主庫壓力問題和跨機(jī)房的多份數(shù)據(jù)傳輸問題;
服務(wù)端編程能力,辦理move data帶來的網(wǎng)絡(luò)延遲問題;
支持多主復(fù)制,辦理物聯(lián)網(wǎng)地區(qū)節(jié)點(diǎn)和中心節(jié)點(diǎn)的數(shù)據(jù)相互同步問題.
接下來,針對(duì)幾個(gè)特殊的特性具體闡發(fā)下它們的實(shí)現(xiàn)過程:
FDW - 搞定HTAP
圖十一 FDW - 搞定HTAP
FDW目前僅在開源數(shù)據(jù)庫中支持;對(duì)于商用數(shù)據(jù)庫,目前僅SAP商業(yè)產(chǎn)品支持類似的功能.FDW可以實(shí)現(xiàn)數(shù)據(jù)的冷熱分離和跨界拜訪.比如,可以將熱數(shù)據(jù)存儲(chǔ)在PostgreSQL本地,冷數(shù)據(jù)存在Hadoop或者Spark、MySQL中,通過PostgreSQL提供的統(tǒng)一的接口完成數(shù)據(jù)的跨界拜訪.目前mongodb就在使用PostgreSQL 的FDW來解決BI數(shù)據(jù)分析的問題.
數(shù)據(jù)庫端編程 - 搞定網(wǎng)絡(luò)瓶頸
圖十二 數(shù)據(jù)庫端編程 - 搞定網(wǎng)絡(luò)瓶頸
在目前的硬件條件下,普通的服務(wù)器都能達(dá)到上百核,內(nèi)存達(dá)到PB級(jí)別.在這種硬件設(shè)備下,一臺(tái)主機(jī)就能達(dá)到千萬級(jí)別的QPS.這樣就帶來了一個(gè)問題,在數(shù)據(jù)庫中us級(jí)別可處理的數(shù)據(jù)量,在網(wǎng)絡(luò)中才傳輸可能會(huì)花費(fèi)ms的時(shí)間.傳統(tǒng)的辦理方式將業(yè)務(wù)邏輯放到應(yīng)用程序端實(shí)現(xiàn),然后將數(shù)據(jù)庫做的盡量簡(jiǎn)單.現(xiàn)在通過PostgreSQL,可以將代碼放到數(shù)據(jù)庫端,PostgreSQL提供了C、Python、R、Perl等語言的開發(fā)接口,通過數(shù)據(jù)庫端編程辦理數(shù)據(jù)移動(dòng)帶來的網(wǎng)絡(luò)RT瓶頸.
rank 化和相關(guān)性計(jì)算 - 搞定最強(qiáng)壓縮比
圖十三 rank化和相關(guān)性計(jì)算 - 搞定最強(qiáng)壓縮比
隨著數(shù)據(jù)量的增大,數(shù)據(jù)的存放本錢也隨之增大.PostgreSQL 中提供了列存儲(chǔ)、壓縮插件,可自動(dòng)整理數(shù)據(jù)壓縮.
本文所提到的所有案例的詳細(xì)介紹文章鏈接如下:
JSONB 非結(jié)構(gòu)化類型使用辦法
時(shí)間序列 與 流式實(shí)時(shí)處置 , 實(shí)時(shí)流式數(shù)據(jù)處置案例 ( 萬億每天 )
https://yq.aliyun.com/articles/166
地理位置信息處理才能
https://yq.aliyun.com/articles/2999
中文分詞
https://github.com/jaiminpan/pg_jieba
https://github.com/jaiminpan/pg_scws
模糊查詢,正則查詢 (1000 億級(jí) , 5 秒內(nèi)返回 )
https://yq.aliyun.com/articles/7549
BRIN 索引,非常適合帶有時(shí)序?qū)傩缘牧魇綌?shù)據(jù)
標(biāo)簽系統(tǒng),例如人物畫像
秒殺 (TPS 從 2855 優(yōu)化到 231376 的手段 )
https://yq.aliyun.com/articles/3010
高并發(fā) ( 8000 個(gè)并發(fā)會(huì)話,隨機(jī)更新 500 萬記錄表中的 1 條記錄 )
https://yq.aliyun.com/articles/102
列存儲(chǔ)、提升壓縮比.節(jié)約 98% 空間的例子
https://yq.aliyun.com/articles/18042
結(jié)尾
針對(duì)PostgreSQL,阿里云也做了很多工作,為了便于大家使用PostgreSQL,阿里云中特推出了ApsaraDB for RDS (PG),提供7*24小時(shí)的頂級(jí)專家服務(wù),同時(shí)也基于PostgreSQL的社區(qū)版本做了必定的優(yōu)化工作.
本文根據(jù) 阿里云 飛天八部數(shù)據(jù)庫技術(shù)組技術(shù)專家德歌 在5月17日舉辦的2016云棲年夜會(huì)·武漢峰會(huì)上《 PostgreSQL數(shù)據(jù)庫之物聯(lián)網(wǎng)的應(yīng)用 》演講整理而成.
歡迎參與《德歌:PostgreSQL獨(dú)孤九式搞定物聯(lián)網(wǎng)》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/9631.html