第15期:開放的計算能力為數據庫瘦身
我們在上一期談到,數據庫的臃腫,也就是過多的中間表以及相關存儲過程,是由于其計算封閉性造成的。如果能夠實現獨立的計算引擎,使計算不再依賴于數據庫提供,那么就可以為數據庫瘦身了。
一、
內部來源的中間數據不必再以數據表的形式落地在數據庫中,而可以放到文件系統中,由外部計算引擎提供進一步的計算能力。對于只讀的中間數據,使用文件存儲時不需要考慮再改寫,可以更為緊致并采用一定的壓縮手段,而且在訪問時也不必考慮事務一致性,機制大為簡化,這樣能獲得比數據庫更好多的吞吐性能。文件系統還可以采用樹形組織方案,將各個應用(模塊)的中間數據分類管理好,使更方便,并且可使中間數據將從屬于應用模塊,不會被其它模塊訪問到。當有模塊修改或下線時,相應的中間數據可以跟隨修改,而不必擔心被共享而產生的耦合問題。用于生成中間數據的存儲過程也可以移到數據庫外部,作為應用程序的一部分,同樣不會產生耦合問題。
外部來源的中間表也可以減少甚至取消。ETL過程的E、T步驟可以直接在數據庫外部由計算引擎實施,在完成清洗轉換之后再加載進數據庫。E、T步驟中不占用數據庫的計算資源,當然也不需要建立中間表來保存這些數據,數據庫只要保存最終需要的結果即可。
多樣性數據源的數據呈現也可以直接由計算引擎實現數據源和數據庫的混合計算,這樣就不必將外部數據源導入數據庫,有效減少中間表。在數據呈現時由計算引擎臨時向數據源發出取數指令以獲得***的數據,還可以獲得更好的實時性,而采用中間表方式一般只能定期把外部數據源轉入,無法看到***的外部數據。而且,不將外部數據導入數據庫,還能繼續利用原數據源的某些優勢,比如NoSQL數據庫對于按鍵值查找有很好的性能,還能較好地解決數據結構多樣性的問題。另外,專門設計的計算引擎如果再能處理好XML,json這類多層數據,在計算描述上也比傳統的關系數據庫更有優勢。
二、
除了必須的計算能力本身之外,要用于數據庫瘦身的計算引擎必須擁有較好開放性和可集成性。
開放性是指計算能力并不依賴于某種存儲體系,而可以計算各種來源的數據,比如文件系統中的數據,這樣就能利用適合的存儲方案來組織管理中間數據。如果計算體系要求特有的數據存儲體系(比如數據庫),那只是把數據庫的臃腫換了一個地方繼續臃腫。可集成性是指計算能力可以嵌入到應用程序中,成為應用的一部分,而不能象數據庫那樣是個獨立的進程,這樣就不會被其它應用(模塊)共享,避免出現應用間的耦合問題。
從這個意義上講,Hadoop體系(包括Spark)雖然有一定的計算能力,但并不合適充當開放計算引擎的作用。Hadoop有一定的開放性,可以計算體系外的數據,但并不常用,而且性能較差;Hadoop是以獨立進程方式運行的龐大體系,基本上沒有可集成性,很難完全嵌入到應用程序中。
有了開放可集成的計算能力,相當于實現了計算和存儲的分離,在設計應用的體系結構時就會更為得心應手。不必為了獲得計算能力而部署多余的數據庫或者擴容數據庫,讓數據庫專心做它最合適做的事情,將資源效用發揮到***。