傳統(tǒng)年代的數(shù)據(jù),產(chǎn)生于電腦桌前,互聯(lián)網(wǎng)開(kāi)始時(shí)候的數(shù)據(jù)量,雖然也有時(shí)間變量,但量少,用 RMDBS 可以滿足管理的需求.
但從現(xiàn)在開(kāi)始,物聯(lián)網(wǎng),移動(dòng)端,每一樣?xùn)|西都開(kāi)始產(chǎn)生數(shù)據(jù),并且有記錄下來(lái)的可能,我們用來(lái)分析,診斷,交流。數(shù)據(jù)可能來(lái)自于: 手機(jī),汽車(chē),納米機(jī)器人,電冰箱,床,牙刷,咖啡杯,路面?zhèn)鞲衅?,等等?;ヂ?lián)網(wǎng),產(chǎn)生數(shù)據(jù)的是人;物聯(lián)網(wǎng),產(chǎn)生數(shù)據(jù)的是機(jī)器。
那么時(shí)序數(shù)據(jù)是不是僅僅在傳統(tǒng)的數(shù)據(jù)庫(kù)字段里面加上了時(shí)間戳數(shù)據(jù)?
是,也不是。
以往的數(shù)據(jù)表里面,一般也是帶有時(shí)間戳的,但是,當(dāng)數(shù)據(jù)量變達(dá)到某個(gè)量級(jí)的時(shí)候,就已經(jīng)是質(zhì)變了,需要不同的技術(shù)手段來(lái)應(yīng)對(duì)。主要的是以下幾種:
基于 K/V 數(shù)據(jù)庫(kù)構(gòu)建:opentsdb(基于 hbase,LSM tree 存儲(chǔ)),blueflood,kairosDB(基于 cassandra),influxdb,prometheus(基于 leveldb)[6];
基于搜索引擎來(lái)存儲(chǔ)時(shí)序數(shù)據(jù):ElasticSearch;
基于 B+ 樹(shù)類(lèi)型的存儲(chǔ):influxDB,采用變種的 LSM tree,他叫做 TSM,通過(guò) timestamp 的對(duì)齊和 tag 組合 hash 來(lái)分?jǐn)傌?fù)載;
基于關(guān)系型數(shù)據(jù)庫(kù)構(gòu)建:mysql,postgresql ,其實(shí)本質(zhì)上和上面的一樣,就是基于 B+ 類(lèi)的數(shù)據(jù)存儲(chǔ)都。但如果量大,那么就需要改裝。Facebook 就是用傳統(tǒng)的 postegre 數(shù)據(jù)庫(kù)改裝成了滿足時(shí)序數(shù)據(jù)讀寫(xiě)要求的數(shù)據(jù)庫(kù);[6]
時(shí)序數(shù)據(jù)的具體特征如下:
每秒數(shù)十萬(wàn)的數(shù)據(jù)涌入是常態(tài),大集群環(huán)境下每秒鐘上千萬(wàn)數(shù)據(jù)點(diǎn)的寫(xiě)入;
要求近實(shí)時(shí)的查詢近期的熱點(diǎn)數(shù)據(jù);
數(shù)據(jù)從不同地點(diǎn)的采集點(diǎn)傳輸過(guò)來(lái),早發(fā)生的數(shù)據(jù)不一定早到達(dá),簡(jiǎn)言之就是亂序入庫(kù) ;
以時(shí)間截面為主,其他維度數(shù)據(jù)為輔 ;
要求對(duì)數(shù)據(jù)具備聚合能力,可以采用入庫(kù)階段的物化視圖來(lái)加速這種聚合,也可以采用實(shí)時(shí)聚合,在查詢時(shí)完成;
已發(fā)生的數(shù)據(jù)不會(huì)更改,更不會(huì)刪除,保留所有數(shù)據(jù)軌跡;
以交通管控為例,下班高峰期,在豐臺(tái)的 6 點(diǎn)整數(shù)據(jù)為 2 萬(wàn)條,一秒后,朝陽(yáng)區(qū)發(fā)生的數(shù)據(jù)為 10 萬(wàn)條,這 10 萬(wàn)條雖然晚了一秒,但由于朝陽(yáng)區(qū)距離數(shù)據(jù)中心更近,量更大,這十萬(wàn)條的入庫(kù)順序就在豐臺(tái)區(qū)的 2 萬(wàn)條之前,時(shí)間戳上表現(xiàn)就是局部逆序存儲(chǔ),但是整體是有序的。
他的主要業(yè)務(wù)用途是以下幾個(gè)方面:
場(chǎng)景回放:這在事故調(diào)查,情景分析等決策階段的需求很廣泛;
分析統(tǒng)計(jì):常用于總結(jié)階段性的工作成果,統(tǒng)一匯總后能從數(shù)據(jù)層面發(fā)現(xiàn)問(wèn)題;
周期預(yù)測(cè):從已有的周期規(guī)律中,結(jié)合當(dāng)下環(huán)境,估計(jì)下一個(gè)同樣事件的發(fā)生概率,這在交通擁堵治理,金融政策制定,市政管理,氣象等等領(lǐng)域非常常用;
定點(diǎn)跟蹤:跟蹤某個(gè)主題的時(shí)序數(shù)據(jù),例如“朝陽(yáng)”區(qū)的空氣按分鐘的檢測(cè)數(shù)據(jù),它和全國(guó)其他所有 10000 個(gè)區(qū)縣存在一起,當(dāng)我們需要某幾個(gè)區(qū)縣比對(duì)數(shù)據(jù)的時(shí)候,需要在毫秒級(jí)別能查詢出來(lái);
時(shí)序數(shù)據(jù)來(lái)源于廣泛的公共服務(wù)領(lǐng)域,例如以下場(chǎng)景:
公共安全:刑偵、情報(bào)分析,個(gè)體跟蹤,區(qū)間篩選;
公共衛(wèi)生:大面積傳染病監(jiān)控預(yù)警,藥品使用監(jiān)控,病理指標(biāo)跟蹤,病例特征預(yù)警;
物聯(lián)網(wǎng):城市管網(wǎng)數(shù)據(jù),例如水文環(huán)境監(jiān)測(cè),空氣質(zhì)量 pm2.5 檢測(cè),地質(zhì)環(huán)境監(jiān)測(cè);
金融行業(yè):交易記錄,存取記錄,交易跟蹤,欺詐模式檢測(cè),違規(guī)交易跟蹤;
能源行業(yè):城市用電量數(shù)據(jù),高峰預(yù)警,階梯計(jì)價(jià),故障檢測(cè),城市油氣消耗(加油站);
交通行業(yè):交通實(shí)時(shí)路況,路口流量監(jiān)測(cè),車(chē)牌檢測(cè);
互聯(lián)網(wǎng)行業(yè):用戶訪問(wèn)日志、廣告點(diǎn)擊日志;
物流行業(yè):配送記錄數(shù)據(jù);
制造業(yè):生產(chǎn)過(guò)程管控,流程效率分析數(shù)據(jù)采集,供應(yīng)鏈實(shí)時(shí)數(shù)據(jù)采集;
LunarBase 是專門(mén)為海量數(shù)據(jù)的存儲(chǔ)和大吞吐量的查詢?cè)O(shè)計(jì)的. 用 C 語(yǔ)言和 java 開(kāi)發(fā)而成,采用了數(shù)據(jù)庫(kù)引擎和搜索引擎的融合設(shè)計(jì),這無(wú)疑能夠大大的簡(jiǎn)化生產(chǎn)環(huán)境,因?yàn)椴恍枰獮榱瞬煌臄?shù)據(jù)類(lèi)型專門(mén)維護(hù)一套集群了。它為應(yīng)用提供以下的基礎(chǔ)功能:
數(shù)據(jù)庫(kù)引擎,數(shù)據(jù)存儲(chǔ),列存儲(chǔ),標(biāo)準(zhǔn) CRUD 操作;
Sql 標(biāo)準(zhǔn)查詢;
搜索引擎 [3]:LunarBase 為全文本字段做索引,和 Lucene,Sphinx 類(lèi)似;
實(shí)時(shí)計(jì)算 [2]:充分的利用機(jī)器資源,自主的回收物理資源,包括磁盤(pán)和內(nèi)存;
Logger 日志:關(guān)閉實(shí)時(shí)計(jì)算,關(guān)閉全文搜索,LunarBase 就能作為一個(gè)日志系統(tǒng),順序的插入記錄。這在機(jī)械磁盤(pán)上的性能是非常高效的;
嵌入分布式框架:嵌入 Presto 或者 Spark,能夠使用標(biāo)準(zhǔn)的 SQL 語(yǔ)言來(lái)查詢 LunarBase。
分布式集群:Lunar-node 是利用 Lunarbase 作為內(nèi)核的服務(wù)器版本,通過(guò)虛擬節(jié)點(diǎn)達(dá)到 Scale out,用戶可以使用兩端提交的方式實(shí)現(xiàn)事務(wù),也可以用消息系統(tǒng)來(lái)實(shí)現(xiàn),這取決于業(yè)務(wù)的形式;
在公共安全領(lǐng)域中,經(jīng)常需要追蹤某個(gè)電話,某個(gè)車(chē)牌的最近軌跡,這就屬于個(gè)體跟蹤,例如在案發(fā)的時(shí)候,某個(gè)電話在前后 10 分鐘內(nèi)收到和打出的電話記錄。在環(huán)境監(jiān)測(cè)應(yīng)用中,調(diào)取某個(gè)區(qū)縣的空氣質(zhì)量數(shù)據(jù),把某幾個(gè)區(qū)縣的時(shí)間線做比對(duì),發(fā)現(xiàn)問(wèn)題所在,等等。
具體的技術(shù)就是 Lunarbase 提供的分布式的搜索引擎和聚合分析的整合使用。
傳統(tǒng)的數(shù)據(jù)庫(kù)技術(shù),在幾十億條數(shù)據(jù)里面做這種點(diǎn)查詢,一般就歇菜了,具備搜索引擎技術(shù)的產(chǎn)品不多,Lucene,ElasticSearch(內(nèi)核使用 lucene),sphinx 等等都是優(yōu)秀的產(chǎn)品,但后面我們會(huì)提到他們?cè)跀?shù)值范圍查詢上面的無(wú)能為力。
搜索引擎是采用 inverted table 的形式來(lái)索引某個(gè)具體點(diǎn)的信息,這在文本檢索里面很常用,例如要查詢某個(gè)關(guān)鍵詞出現(xiàn)的所有網(wǎng)頁(yè)。這種索引具備訪問(wèn)磁盤(pán)次數(shù)少,吞吐量大的優(yōu)點(diǎn)。LunarBase 和 ElasticSearch 一樣,都實(shí)現(xiàn)了這種按列索引的模塊,雖然原理相同,但是實(shí)現(xiàn)方式還是有很大的不同。這很好理解,比如:洛克希德馬丁的 F22 使用的航空發(fā)動(dòng)機(jī)和蘇 35 的發(fā)動(dòng)機(jī)肯定是不一樣的工藝。
時(shí)序數(shù)據(jù)主要用到以下的概念,和傳統(tǒng)數(shù)據(jù)庫(kù)都能對(duì)應(yīng)上:
Metric:也就是一般數(shù)據(jù)庫(kù)里面的表;
data point:一條記錄,之所以這么叫,因?yàn)橥ǔN锫?lián)網(wǎng)中一條數(shù)據(jù)是從傳感終端發(fā)送過(guò)來(lái)的一條多維的點(diǎn);
timestamp;時(shí)間戳;
tag:對(duì)于同一時(shí)間線上面的不同標(biāo)的的標(biāo)簽,用于快速的檢索,例如在環(huán)境檢測(cè)中,可以用地區(qū)名稱,“朝陽(yáng)”“海淀”等等作為標(biāo)簽的值;
吞吐量的基本要求:
30 個(gè) pc 服務(wù)器的集群,每秒插入數(shù)據(jù)點(diǎn)要求在千萬(wàn)級(jí),數(shù)據(jù)點(diǎn)通常比較短,通常幾十個(gè)字節(jié),這是和其他數(shù)據(jù)應(yīng)用不大一樣的地方。
復(fù)雜查詢響應(yīng)要求在秒級(jí)。
對(duì)于時(shí)序數(shù)據(jù),時(shí)間戳是整體有序,局部亂序的(例如第一節(jié)的交通管控的例子)。如果用 RMDBS 的 B+ 樹(shù),或者其變種 LSTM 等等,速度上不會(huì)慢多少,也可以對(duì)付一般的應(yīng)用。但如果是要時(shí)間線中抽取某幾個(gè) tag 的時(shí)間線,用 B 樹(shù)類(lèi)的就不合適了,tag 的標(biāo)簽絕對(duì)是亂序的,而且同一標(biāo)簽會(huì)有海量的時(shí)間點(diǎn)數(shù)據(jù)。如果加上不同 tag 的比對(duì),這對(duì)底層的查詢存儲(chǔ)設(shè)計(jì)的考驗(yàn)就很大。搜素引擎的技術(shù)是很適合這個(gè)應(yīng)用的。
LunarBase 里面對(duì)于數(shù)值型的數(shù)據(jù)采用了 LunarMax 實(shí)時(shí)計(jì)算模塊 [2],LunarBase 根據(jù)數(shù)據(jù)類(lèi)型,會(huì)建立不同的索引,對(duì)于范圍查詢,主要由里面的 LunarMax 實(shí)時(shí)計(jì)算模塊支持,只需要在配置文件中,把實(shí)時(shí)模式打開(kāi)就行:
rt_mode = on
然后指定 LunarBase 為每個(gè)列索引最多使用多少內(nèi)存:
rt_virtual_mem_enabled = onrt_vm_swap = /home/DBTest/Swaprt_max_memory = 28
從上到下,首先打開(kāi)虛擬內(nèi)存,然后指定虛存使用的 swap 空間,用戶的服務(wù)器環(huán)境可能會(huì)運(yùn)行多種服務(wù),每個(gè)都在爭(zhēng)搶資源,那么 LunarBase 的這個(gè)設(shè)計(jì)就很貼心,用戶可以通過(guò)最后的這個(gè) rt_max_memory,告訴 LunarBase,對(duì)每個(gè)需要實(shí)時(shí)查詢的列,最多使用多少物理內(nèi)存,比如 256M 的物理內(nèi)存,這就限制住了 LunarBase 自身的內(nèi)存消耗。需要更多,就使用交換空間的,通過(guò)指定一塊(固態(tài))硬盤(pán)空間來(lái)作為大的虛擬內(nèi)存使用,比如 100GB,一般都是夠用了。
這一點(diǎn)和操作系統(tǒng)的內(nèi)存管理一樣,LunarBase 使用自己的虛擬內(nèi)存管理系統(tǒng),這塊空間是獨(dú)占的,不和操作系統(tǒng)爭(zhēng)搶。
同時(shí)搜索引擎一樣會(huì)產(chǎn)生的磁盤(pán)垃圾。因?yàn)槟壳暗目萍级裕鎯?chǔ)主要使用的是塊設(shè)備,碎片是無(wú)法避免的。有些解決方案通過(guò)定期的整理磁盤(pán)塊來(lái)減少碎片,提高檢索效率,有的把它叫做 compaction,或者其他的,目的是類(lèi)似的,把垃圾去掉,把有關(guān)的放到一起,利于查詢。但是在整理期間,搜索性能是很受影響的。LunarMax 是通過(guò)一種主動(dòng)搜集整理的技術(shù),均攤了清除碎片的開(kāi)銷(xiāo),這一點(diǎn)對(duì)于生產(chǎn)環(huán)境是非常貼心的功能。
環(huán)境:
運(yùn)行總共 10 個(gè)虛擬機(jī)節(jié)點(diǎn),每個(gè)運(yùn)行 Ubuntu,分布運(yùn)行在 3 臺(tái) pc 服務(wù)器上。每個(gè)節(jié)點(diǎn)分配 4GB 內(nèi)存和 100GB 存儲(chǔ)空間,節(jié)點(diǎn)間通過(guò)虛擬網(wǎng)卡通訊,客戶端在同一局域網(wǎng)內(nèi)發(fā)送數(shù)據(jù)。這是一個(gè)很低的配置:
CPU:
[rocku@iz25dXXXsuZ ~]$ cat /proc/cpuinfo vendor_id : GenuineIntel cpu family : 6 model : 62 model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz stepping : 4 cpu MHz : 2593.427 cache size : 20480 KB
Memory:
[rocku@iz25dXXXsuZ ~]$ grep MemTotal /proc/meminfo MemTotal: : 3921020KB
OS:
[rocku@iz25dXXXsuZ ~]$ uname -a Linux iz25dXXXsuZ 2.6.32-573.18.1.e16.x86_64
GCC:
[rocku@iz25dXXXsuZ ~]$ gcc -v gcc version 4.8.4 (GCC)
JAVA:
[rocku@iz25dXXXsuZ ~]$ java -version java version 1.8.0_60 Java(TM) SE Runtime Enviroment (build 1.8.0_60-b27) Java HotSpot(TM) 64-bit Server VM (build 25.60-b23, mixed mode)
數(shù)據(jù):
模擬全國(guó)環(huán)境監(jiān)測(cè)數(shù)據(jù),每十毫秒的數(shù)據(jù)點(diǎn)(大約 10 個(gè))拼成一條,總長(zhǎng)度平均約 1000 字節(jié)。tag 10000 個(gè)區(qū)縣的名稱,總共 20 億個(gè)數(shù)據(jù)點(diǎn),附加列標(biāo)注了該數(shù)據(jù)是否超過(guò)閾值,這是在客戶端取好發(fā)送過(guò)來(lái)的。數(shù)據(jù)是這樣的:
我們用另一時(shí)序數(shù)據(jù)庫(kù)做了同樣的一組數(shù)據(jù)。 分別做 10 次平均值。
LunarBase 在單節(jié)點(diǎn)的測(cè)試數(shù)據(jù)是 118 萬(wàn)個(gè)數(shù)據(jù)點(diǎn) / 每秒,10 節(jié)點(diǎn)集群:815 萬(wàn)個(gè)數(shù)據(jù)點(diǎn) / 每秒。
在查詢提取 tag 數(shù)據(jù),數(shù)據(jù)發(fā)送到所有 10 個(gè)節(jié)點(diǎn)做查詢,提取朝陽(yáng),海淀,東城等等 tag 的數(shù)據(jù),查詢 10000 次做平均:
查詢:
單 tag 提取,按時(shí)間戳排序:最大:67.35ms最?。?.05ms平均:3ms
可以看到在 20 億數(shù)據(jù)的查詢中,時(shí)間花在了網(wǎng)絡(luò)和聚合的處理上。在實(shí)際的案例中,推薦使用 infiniBand 來(lái)加速局域網(wǎng)的通訊。
關(guān)于 LunarBase 如何對(duì)數(shù)據(jù)做分片,做分布式的謂詞下推,聚合下推來(lái)優(yōu)化查詢,我們會(huì)在后續(xù)的文章中陸續(xù)介紹。
參考文獻(xiàn)
[1] LunarBase 白皮書(shū):https://github.com/LunarBaseEngin/LunarBase/blob/master/LunarBase%20--%20A%20database%20engin%20for%20managing%20very%20large%20amounts%20of%20data%20--%20EN%20--V0.8.pdf
[2] LunarMax 實(shí)時(shí)計(jì)算系統(tǒng):https://github.com/LunarBaseEngin/LunarBase/wiki/Real-Time-Analysis:-LunarMax
[3] LunarBase 搜索引擎:https://github.com/LunarBaseEngin/LunarBase/wiki/insert-to-search-engine
[4] LunarBase official benchmark:https://github.com/LunarBaseEngin/LunarBase/wiki/BenchMark
[5] LunarBase 五分鐘入門(mén):https://github.com/LunarBaseEngin/LunarBase/blob/master/README.md
[6] 時(shí)間序列數(shù)據(jù)庫(kù)的秘密(1):http://www.infoq.com/cn/articles/database-timestamp-01
百度無(wú)人車(chē)和天工物聯(lián)網(wǎng)都使用了時(shí)序數(shù)據(jù)庫(kù),但是你有多了解時(shí)序數(shù)據(jù)庫(kù)?
StuQ 特邀 R 語(yǔ)言資深研究者、微軟 MVP 謝佳標(biāo)老師,于 6 月 29 日(周四)晚 8:00-9:00 為大家?guī)?lái)一場(chǎng)免費(fèi)的公開(kāi)課,一個(gè)小時(shí)領(lǐng)你進(jìn)入 R 語(yǔ)言的大門(mén)~趕快掃描下方海報(bào)二維碼,獲取聽(tīng)課地址吧!
聯(lián)系客服