傳統(tǒng)的數(shù)據(jù)倉庫或者數(shù)據(jù)集市并沒有包括當(dāng)前最新的數(shù)據(jù),其數(shù)據(jù)是按周甚至按天導(dǎo)入到數(shù)倉里面的。然而,有一些公司已經(jīng)開始著手建設(shè)實時或近實時 BI 數(shù)據(jù)庫了。
乍一看,實時 BI 似乎是繼傳統(tǒng)數(shù)倉之后合乎邏輯的下一個階段,畢竟只要數(shù)據(jù)越“新鮮”,我們就能從中得到越優(yōu)質(zhì)的信息,那為什么不把 BI 系統(tǒng)升級成實時的呢?
答案就是相對于其價值來說,這樣做其實更麻煩。試圖在 BI 數(shù)據(jù)庫上對數(shù)據(jù)進行實時更新簡直就像是打開一個裝滿蠕蟲的罐子。就算你真的能將這個系統(tǒng)做好,那也是非常困難的,代價也將會非常大,而且還會在原本就已經(jīng)很復(fù)雜的處理流程里引入一堆數(shù)據(jù)一致性問題。
你的數(shù)據(jù)倉庫真的需要實時數(shù)據(jù)么?大多數(shù)情況下答案是“不需要”。不像操作性數(shù)據(jù)庫必須保證足夠?qū)崟r,數(shù)據(jù)倉庫或者數(shù)據(jù)集市一般并不需要絕對實時的數(shù)據(jù)就足以完成數(shù)據(jù)分析的任務(wù)了。當(dāng)然高頻交易的金融交易市場是個例外。
一個主要問題在于現(xiàn)有的 BI 工具并不是為實時數(shù)據(jù)設(shè)計的,幾乎所有的 BI 工具都被設(shè)計成批處理方式。當(dāng)然有些比較新的工具可以處理實時或者近實時數(shù)據(jù),但也只是極少數(shù),大多數(shù)工具還是不行。
這個問題對于那些 ETL 工具來說更是如此。 一般在處理好數(shù)據(jù)并將數(shù)據(jù)加載進數(shù)據(jù)庫時都會讓數(shù)據(jù)庫暫時不可用,所以一般這種操作都會避開業(yè)務(wù)高峰時段,這樣避免對業(yè)務(wù)產(chǎn)生營銷。
實時 ETL 則會在數(shù)據(jù)庫還在響應(yīng)查詢的時候執(zhí)行,這會導(dǎo)致一系列數(shù)據(jù)完整性的問題,并且需要在設(shè)計 ETL 工具的時候就必須考慮到這個問題。數(shù)據(jù)持續(xù)的更新也使得我們很難維持?jǐn)?shù)據(jù)的實時同步。
一個解決方案就是提高數(shù)據(jù)加載頻率從而實現(xiàn)近實時的更新。周級別的數(shù)據(jù)加載可以提升到天級別,天級別可以提升到一天兩次,相比實時更新,這可能是更加容易同時成本更低的一種方案,至少這樣不需要更換一整套 ETL 工具。
如果實時的性能非常必要的話,那么整個系統(tǒng)架構(gòu)和工具集就一定需要做很大的改變。一個方案就是在數(shù)據(jù)被加載到主庫之前構(gòu)建一個暫存區(qū),或者也可以在主數(shù)據(jù)庫增加獨立的表或者通過在獨立服務(wù)器上運行獨立數(shù)據(jù)庫的方式構(gòu)建一個影子系統(tǒng)。無論采用那種方式,總之就是讓 ETL 操作在一個作為替代的從庫上執(zhí)行,并只將清洗干凈的數(shù)據(jù)加載進主表。
構(gòu)建一套影子系統(tǒng)的成本將會非常大,因為他本質(zhì)上相當(dāng)于復(fù)制了一套數(shù)倉,當(dāng)然這樣的話對性能的影響就比較小。
請注意,不管怎么樣都可能會在主庫執(zhí)行數(shù)據(jù)加載的時候影響查詢性能。
另一個需要考慮的問題是緩存。很多數(shù)據(jù)倉庫都使用了各種各樣的緩存來加速查詢,但是在一個實時系統(tǒng)里面,這些緩存就會持續(xù)不斷的被更新已保證數(shù)據(jù)完整性,而且更新緩存的過程一般來說都相對較慢,所以這樣也會使得數(shù)據(jù)倉庫性能受到影響。
基本上構(gòu)建實時數(shù)倉就是一個典型的 “l(fā)ast nine”[注] 問題的例子。結(jié)果是令人期待的,但同時在性能優(yōu)化上面的付出和收益也是不成比例的。這就讓實時數(shù)倉變成了一個成本-收益問題,所以盡量多研究研究你做實時數(shù)倉的收益是否大于你將付出的成本。
關(guān)于作者
Rick Cook 從打孔機和磁鼓存儲器時代就開始從事計算機科學(xué),他撰寫過上百篇計算機相關(guān)的文章,也寫過一系列充滿計算機笑話的科幻小說
本文翻譯自:Real Time Data Warehouse - Is It Worth It?
[注]:我暫時沒查到 “l(fā)ast nine” problem 是個什么梗