計算機行業是唯一一個比時裝行業概念更多的行業。概念頻出,最慢的話半年一定出一個,短的話半個月就能看到新的名詞和技術甚至是概念。
存算分離的概念
我第一次聽到存算分離時候還是從Hadoop上聽到的。然后就去問什么是存算分離。聽了講解以后,我問這和Oracle的集群–RAC的不是一樣嗎?回答說是基本這個意思。只是Oracle并沒有這樣宣傳。RAC因為有ASM一層,打通了不同存儲節點,讓數據庫看存儲是一大塊。而Hadoop的HDFS也類似的實現。
我之所以說類似,是因為還有一點不同的。區別就是一個屬于引擎級存算分離還有一個數部署級存算分離。(可能是現有實物,再有冠名,依然是概念)
什么是引擎級存算分離?在數據庫引擎的內部架構設計層面,天然將存儲層(數據持久化)與計算層(查詢處理)解耦,二者通過明確的接口或協議通信。優勢:彈性擴展:計算和存儲可獨立擴縮容。資源隔離:計算節點無狀態,故障恢復快。云原生友好。云原生依然是一個概念,說的直白點就是在公有云上使用更好。根據這些特征我們也可以判斷了OceanBase、TiDB等就是這類的存算分離(這里提及的是他們的分布式版,他們都有單機版和敏捷版不屬于這種)
什么是部署級存算分離?將存儲與計算分離,但數據庫引擎本身并非原生支持。通常依賴共享存儲(如SAN、分布式文件系統)。硬件復用:存儲資源可被多計算節點共享。簡化遷移:計算節點可快速替換,數據無需遷移。根據這些特征我們也可以判斷了Oracle的RAC,YashanDB和cantian等屬于這種存算分類。
兩種存算分離各有千秋。個人認為如果是企業級應用那么部署級存算分離更加貼近業務一些,企業內部不會有爆炸式增長和太多的不確定性。而引擎級存算分離更多的是面向互聯網場景的不確定性。
存算分離自帶高可用
當談及存算分離的時候,其實已經進入分布式和高可用的范疇。無論那種存算分離都是對應用透明的。TIDB也好Oracle也罷。1個計算節點宕機或者重啟不影響使用。同樣存儲上都是多副本的,硬盤發生故障數據也不會丟失。那么可靠性的問題就解決了。
存算分離是需求的產物
可以看出有很多產品都有存算分類的架構和方案,那么為什么要做呢?因為有需求!
從一個角度上說,這樣做我認為有兩個原因。第一個原因是單機的存儲有上限,第二個是多個存儲并行的話,可以提升讀寫性能。這些都是和硬件的容量和IO能力有關。只是這些年硬件也在進步。所以也出現了分布式向集中式變遷的趨勢。這也就是為什么不少分布式數據庫出單機版的原因。這時候部署級存算分離似乎就更加凸顯優勢。即是分布式又相對集中。
而從另外一個角度,是說計算和存儲之間的矛盾。一般來說存儲的IO比內存差,比起L1 L2 L3以及CPU就更差了。那么就會出現CPU在等IO情況。那么在存算一體的情況下,只能等。這種場景下存儲就限制了計算的發揮。多余的計算能力,其他機器也用不到。同樣如果是多余的存儲資源其他機器也用不到。
對于以上的問題虛擬機可以增加存儲空間和CPU數量。但是如果加到物理機分配的上限也不能加了。而物理機這個擴展到上限也無法加了。而在存算分離的架構下,就可以動態的增加。
這時候就可以看出存算分離的優勢了。就像步步高點讀機,哪里不會點哪里一樣。存算分離哪里不夠補哪里。
存算分離是自身的產物
關于算子下推的也在存算分離數據庫中都體現了。因為這部分的主要工作其實是存儲做的。所謂算子下推比如select * from t where id<1000 and status=0 如果id有索引,但是status沒有索引,加上0的有50個。 那么一般情況下通過謂詞過濾索引定位掃描1000行,在這1000個中在找到50返回。 而在算子下推到存儲層后,在存儲層就直接把這50個給出來,而不必把這些行和列加載到內存后再過濾返回給客戶端,減少了內存和磁盤、以及內存和網絡之間的交互。沒有存儲上的工作是做不到這個特性的。不是買來一堆硬盤攢一個存儲就可以。
還有一點說到分布式那么分布式數據庫要不要備份。從前我個人認為不需要。畢竟沒聽過誰說給Hadoop做備份。百度也沒聽說過做備份。但是對于有些存算分離的數據庫還是提出了備份的要求。在這種情況下備份其實是不好做的。而部署級存算分離可以通過全局一致性快照來完成。什么是全局一致性快照?其實就是對存儲上所有的使用的數據塊做一次備份。可以理解成虛擬機那種快照。不同的是存算分離的數據庫中有管理元數據的機器通過他知道數據在磁盤上的分布,所以就克隆了一份。這種在存儲級存算分離上似乎實現比較容易一些,例如Oracle的備份一體機對RAC以及上述提到的其他存儲級存算一體數據庫。
存算分離是存儲不足還是計算不足?
那么到底是計算會經常不足還是存儲會經常不足?按說通過合理的設計和實現,絕大部分企業都不需要用到Hadoop。本身也沒有海量的數據,如果SQL用到索引計算不會是大問題。
至于存儲方面,現在網上看到硬盤N (n>=4) TB的很常見。也就是說中小企業來說都不太需要存算分離。只有達到大型企業比如金融的幾個大行,幾個運營商等這種規模的是需要存算分離架構的。
打個比方就是如果1000人要從上海去北京,那么選擇火車是最優的。但是如果小于等于5個人從加到公司(在一個行政區內),那么開車是最優的。
還是看自己的規模選擇
所以存算分離還是集中處理,需要結合情況來說。既不能小馬拉大車,也不能殺雞用牛刀。如果出現以上情況不是方案本身的問題,而是不適配的問題。