本文來自ITPUB,作者/祁國輝,網(wǎng)名"atiger",前Oracle云平臺事業(yè)部電信行業(yè)技術(shù)總監(jiān)。擁有超過25年數(shù)據(jù)庫和數(shù)據(jù)倉庫HK經(jīng)驗。)
存算分離,現(xiàn)在已經(jīng)成為云原生數(shù)據(jù)庫的標(biāo)配,開始大規(guī)模流行。存算分離后,進(jìn)一步使計算單元和存儲單元解耦,每個單元可以實(shí)現(xiàn)單獨(dú)的動態(tài)擴(kuò)縮容,并且可以通過冗余配置,實(shí)現(xiàn)對單點(diǎn)故障的容忍度,可以說是近年來數(shù)據(jù)庫市場上的一大進(jìn)步。
縱觀歷史,隨著IT技術(shù)的發(fā)展,到底是存算一體還是存算分離,其實(shí)反復(fù)過很多次,讓我們來簡單回顧一下,數(shù)據(jù)庫歷史上幾次大的架構(gòu)變更。希望可以幫助大家按照技術(shù)發(fā)展脈絡(luò),來加深對技術(shù)原理和用戶收益的理解。
第一次存算分離
最早版本的數(shù)據(jù)庫,即網(wǎng)狀數(shù)據(jù)庫管理系統(tǒng)(DBMS),由通用電氣公司1961年開發(fā)成功,其IDS(Integrated DataStore,集成數(shù)據(jù)存儲)是世界上第一個網(wǎng)狀DBMS,也是第一個DBMS。但是它只能運(yùn)行于通用電氣的主機(jī)上,且數(shù)據(jù)庫只有一個文件,所有的表必須通過手工編碼生成、存儲和計算是緊密耦合在一起的。
這一點(diǎn)從它的名字就可以看出來,集成數(shù)據(jù)存儲(IntegratedData Store,IDS)。
而之后的很長時間,數(shù)據(jù)庫都是屬于高端應(yīng)用,和各種大型機(jī)、中型機(jī)緊密綁定在一起,典型的IBM大型機(jī)((MainFrame),老牌IT人都熟悉的System/360,通過編程訪問內(nèi)部的各種數(shù)據(jù)庫,后來大家熟悉的DB2,也是最早運(yùn)行在這個平臺上,借助當(dāng)時超強(qiáng)的計算能力,在全球各種大型金融機(jī)構(gòu),大型科研實(shí)驗室和大型企業(yè)獨(dú)領(lǐng)風(fēng)騷,占據(jù)了領(lǐng)導(dǎo)地位。
IBM當(dāng)時在計算機(jī)領(lǐng)域無愧它“藍(lán)色巨人”的稱號,除了響當(dāng)當(dāng)?shù)漠a(chǎn)品之外,還有大量的精英在其中對最新科技進(jìn)行研究,對數(shù)據(jù)庫影響最大的幾位大神都在IBM供職,包括提出關(guān)系型數(shù)據(jù)庫模型的Codd博士,在此基礎(chǔ)上發(fā)揚(yáng)光大的C.J.Date和Jim Gray??梢哉fDB2在整個數(shù)據(jù)庫歷史上扮演了一個很重要的承上啟下的作用。
當(dāng)然也不得不提另外一位傳奇人物,就是Oracle的創(chuàng)始人之一,Larry Ellison,自1977年創(chuàng)立SDL,1982年更名為Oracle,然后迅速借助小型機(jī)的快速發(fā)展,迅速占領(lǐng)了商用數(shù)據(jù)庫的第一把交椅,直至今日,DB Engine上Oracle仍占據(jù)榜首,數(shù)十年未動搖。
因為小型機(jī)的快速發(fā)展,計算機(jī)市場出現(xiàn)群雄爭霸的局面,而在Unix系統(tǒng)開始大行其道之后,市面上能夠提供unix主機(jī)的企業(yè)越來越多,除了IBM,還有HP、Compaq、富士通、Sun。而幾乎所有的Unix主機(jī)都會連接獨(dú)立的存儲服務(wù)器,來實(shí)現(xiàn)第一次的存儲和計算的分離。
在這次的存算分離當(dāng)中,最重要的支撐技術(shù)主要包括成熟的網(wǎng)絡(luò)組網(wǎng)技術(shù),以及成熟的存儲網(wǎng)絡(luò)技術(shù),當(dāng)然Oracle自己的殺手級技術(shù)緩存融合,也起到很大的作用。
那么看一下用戶得到的好處在哪里?
•增強(qiáng)了系統(tǒng)的伸縮性,用戶可以獨(dú)立增加數(shù)據(jù)庫服務(wù)器來提升處理能力,增加存儲服務(wù)器來擴(kuò)大數(shù)據(jù)庫容量。
•增強(qiáng)了系統(tǒng)的容錯性,在這種分離架構(gòu)下,可以通過冗余配置來防止任何一個環(huán)節(jié)出現(xiàn)單點(diǎn)故障,增強(qiáng)了數(shù)據(jù)庫系統(tǒng)的持續(xù)服務(wù)能力。
內(nèi)存融合技術(shù)則是在兩個計算節(jié)點(diǎn)間共享對方節(jié)點(diǎn)的內(nèi)存數(shù)據(jù),來減少磁盤讀取帶來的IO,從而提高性能。
緩存融合技術(shù)允許不同RAC節(jié)點(diǎn)間通過高速內(nèi)網(wǎng)共享各節(jié)點(diǎn)數(shù)據(jù)庫實(shí)例內(nèi)部緩存的數(shù)據(jù)塊,緩存的數(shù)據(jù)塊直接從一個節(jié)點(diǎn)的共享內(nèi)存?zhèn)鬟f到其他節(jié)點(diǎn)的共享內(nèi)存。這樣對于最新的數(shù)據(jù)塊,就可以直接訪問其他節(jié)點(diǎn)的緩存,而不必等待緩存寫入磁盤之后再從磁盤讀取,從而使得多個節(jié)點(diǎn)之間可以高效率地協(xié)同工作。
為了降低存取遠(yuǎn)端內(nèi)存時的主機(jī)消耗,Oracle還使用了專用的基于RDMA技術(shù)的RDS協(xié)議,可以直接繞開CPU,直接實(shí)現(xiàn)遠(yuǎn)程內(nèi)存的直接讀取,進(jìn)一步提升訪問效率。
海量數(shù)據(jù)催生的存算一體
時間進(jìn)入本世紀(jì),隨著用戶數(shù)據(jù)的快速膨脹,用戶對海量數(shù)據(jù)的分析需求越來越明顯,各行各業(yè)都在搭建自己的數(shù)據(jù)倉庫和商業(yè)智能系統(tǒng),這時用戶面臨的最大挑戰(zhàn)第一是成本,第二是性能。
因為傳統(tǒng)Unix主機(jī)和高端存儲價格高居不下,所以想要搭建一個用于決策支持的數(shù)據(jù)倉庫系統(tǒng),在硬件和軟件license上就是一筆不小的投資。另外可能耗費(fèi)巨資搭建的系統(tǒng),在做海量數(shù)據(jù)統(tǒng)計匯總的時候,比老黃牛還慢,廠家分析過之后,診斷結(jié)果:磁盤轉(zhuǎn)速不夠,網(wǎng)絡(luò)傳輸不夠,CPU處理能力不夠??偠灾到y(tǒng)需要擴(kuò)容。
究其根本原因,還是在IO,因為計算單元處理數(shù)據(jù),但是它不存儲數(shù)據(jù),所有的數(shù)據(jù)要從存儲中取,而存儲在取數(shù)據(jù)的時候,都是一個數(shù)據(jù)塊一個數(shù)據(jù)塊來取,根本沒法判斷這個塊中哪些數(shù)據(jù)是計算單元需要的。在傳統(tǒng)行存儲的場景,一個決策查詢可能只需要幾個字段,但是必須把所有數(shù)據(jù)都拿到計算單元,由計算單元處理/判斷之后再丟棄。
浪費(fèi)了大量的IO,另外由于計算單元內(nèi)存不夠,再大表連接的時候,出現(xiàn)大量的臨時數(shù)據(jù),這些臨時數(shù)據(jù)還需要在存儲中臨時存放,需要的時候再拿出來,這就又造成了大量的資源浪費(fèi)。
所以這個時候就自然催生出新的架構(gòu),普遍的原理是OLTP系統(tǒng)中每次操作都是小數(shù)據(jù)量,這種場景是移動數(shù)據(jù)到計算;而OLAP系統(tǒng)中,每次都會涉及大量數(shù)據(jù)處理,所以要減少網(wǎng)絡(luò)傳輸,這時候應(yīng)該是移動計算到數(shù)據(jù)。這個描述有點(diǎn)抽象,但是大概意思就是海量數(shù)據(jù)首先在本地進(jìn)行初步加工,減少數(shù)據(jù)量之后,再去參與后繼計算,這樣IO和算力都得到節(jié)省,自然性能就上去了。
這個時候的玩家,包括來自大廠的TD和DB2,也包括后來居上的開源MPP產(chǎn)品GreenPlum,還有國內(nèi)的老牌數(shù)據(jù)庫廠商南大通用Gbase,以GP為例,示例如下:
此階段技術(shù)核心關(guān)注在減少網(wǎng)絡(luò)間傳輸?shù)腎O,一方面通過列式存儲,來支持分析系統(tǒng)中按列統(tǒng)計的習(xí)慣,每次查詢只需要取需要的列就可以,減少無謂的IO,同時利用各種索引技術(shù),加快數(shù)據(jù)定位和存取的效率。另外通過閃存技術(shù)的高速發(fā)展,利用高速閃存還可以進(jìn)一步提升系統(tǒng)的性能。
而之后盛行的Hadoop架構(gòu),也是屬于利用本地磁盤通過搭建分布式文件系統(tǒng),來實(shí)現(xiàn)海量數(shù)據(jù)的處理。開源的Hadoop架構(gòu)發(fā)展迅猛,不斷有新的技術(shù)加入,大大催生了數(shù)據(jù)倉庫領(lǐng)域的技術(shù)發(fā)展。衍生出很多非常亮眼的技術(shù),比如Hive、Impala、Presto、Spark等等。
不過MPP雖然讓更多的人能夠以較低的成本搭建海量數(shù)據(jù)倉庫,隨著應(yīng)用的深入,也暴露出幾個問題:
•計算存儲緊耦合,提升了計算效能,但是在系統(tǒng)容量擴(kuò)容的時候,需要對所有節(jié)點(diǎn)上的數(shù)據(jù)進(jìn)行重新分布,而這個時間相對較長,有可能會影響業(yè)務(wù),所以在一些業(yè)務(wù)比較繁忙的客戶場景中,一般智能用新建集群的方式來進(jìn)行容量擴(kuò)容。
•因為開啟了大規(guī)模并行,所有的任務(wù)都會啟動并行計算,啟動后計算任務(wù)會分布到集群中的每個節(jié)點(diǎn),那么集群并發(fā)能力的上限,并不取決于集群大小,而是取決于集群中配置最低的那一臺機(jī)器,這臺機(jī)器能支持多少任務(wù)并行,就代表整個集群能支持多少并行。
•配置彈性不足,因為上述原因,為了能夠支撐企業(yè)業(yè)務(wù)高峰期的業(yè)務(wù),必須把整個集群配置到能符合業(yè)務(wù)高峰期的規(guī)模,而在平時,機(jī)器閑置率就很高,導(dǎo)致投資浪費(fèi)。
云時代帶來的新一代存算分離
隨著公有云的快速發(fā)展,按需付費(fèi)的概念逐步深入人心,對大規(guī)模數(shù)據(jù)的分析也要求能做到按需供給,那么傳統(tǒng)MPP這種存算一體的緊耦合架構(gòu),就沒法滿足用戶的需求了。另外,網(wǎng)絡(luò)技術(shù)和存儲技術(shù)也飛速發(fā)展,這時就自然帶來新一代的云原生數(shù)據(jù)庫的存算分離架構(gòu),把數(shù)據(jù)庫技術(shù)向前推進(jìn)了一大步。
以業(yè)界最有名的Snowflake公司為例,創(chuàng)立Snowflake之前,Benoit Dageville和Thierry Cruanes在甲骨文做了十多年數(shù)據(jù)工程師,后來他們決定在云上創(chuàng)建數(shù)倉,聯(lián)合另外一位創(chuàng)始人Marcin?ukowski,共同創(chuàng)建了Snowflake。
為了更好地利用云上的資源,他們首先把存儲和計算再次分離,把數(shù)據(jù)以大量分區(qū)的方式存儲在共享的對象存儲中,存儲中的數(shù)據(jù)按列保存,而中間的計算層,也通過無狀態(tài)的虛擬數(shù)據(jù)倉庫來動態(tài)拉起和銷毀,來實(shí)現(xiàn)用戶不同workload的靈活調(diào)度和計費(fèi)。目前已經(jīng)成為云原生數(shù)倉的標(biāo)準(zhǔn)范本。
下面簡單看一看Snowflake的技術(shù)架構(gòu):
Snowflake內(nèi)核組件從底向上可以分為三個層次:
數(shù)據(jù)存儲層。Snowflake的數(shù)據(jù)存儲是構(gòu)建在Amazon S3對象存儲上,主要用來存儲表數(shù)據(jù)和查詢結(jié)果。
計算層-虛擬倉庫。虛擬倉庫構(gòu)建在Amazon EC2虛擬機(jī)組成的彈性集群之上,負(fù)責(zé)執(zhí)行用戶的查詢請求。
調(diào)度云服務(wù)層。云服務(wù)組件包括并發(fā)訪問控制、基礎(chǔ)設(shè)施管理、優(yōu)化器、事務(wù)管理、安全管理、元數(shù)據(jù)管理,其中元數(shù)據(jù)包含schema信息、表信息、權(quán)限認(rèn)證信息、秘鑰、統(tǒng)計信息。
在這個架構(gòu)下,不同的workload可以隨時通過創(chuàng)建不同的虛擬倉庫來實(shí)現(xiàn)計算的靈活調(diào)配,而每次計算的時候,計算層通過網(wǎng)絡(luò)直接從存儲層獲得數(shù)據(jù),然后在虛擬數(shù)據(jù)倉庫中進(jìn)行計算,負(fù)載比較中的workload可以創(chuàng)建較大的虛擬倉庫,而普通查詢可以創(chuàng)建較小的虛擬倉庫,用戶還可以通過調(diào)整虛擬倉庫中單節(jié)點(diǎn)CPU和節(jié)點(diǎn)個數(shù)來平衡計算復(fù)雜性和并發(fā)性。
虛擬倉庫之間,通過占用不同的硬件節(jié)點(diǎn)或者計算層中的資源調(diào)度來實(shí)現(xiàn)隔離。因為整個虛擬倉庫的無狀態(tài),所以用戶可以隨時創(chuàng)建和銷毀虛擬倉庫,當(dāng)然也意味著計算層的可以通過增加EC2的臺數(shù),來實(shí)現(xiàn)計算層的橫向擴(kuò)展。
同時,由于存儲層也已經(jīng)完成了與計算層的解耦,所以存儲層也可以隨時按需進(jìn)行橫向擴(kuò)展,而無需停機(jī)做數(shù)據(jù)分布。
◆技術(shù)優(yōu)化手段
我們都知道,存算分離架構(gòu),提高了系統(tǒng)的靈活性,可以實(shí)現(xiàn)計算能力和存儲能力的動態(tài)擴(kuò)縮容,無需按照業(yè)務(wù)峰值來搭建系統(tǒng),但是也帶來了大量數(shù)據(jù)需要在存儲層和計算層之間傳輸?shù)膯栴}。
網(wǎng)絡(luò)加速
好在,這么多年的存儲,網(wǎng)絡(luò)技術(shù)飛速發(fā)展,能很好地滿足這些需求,同時新一代云數(shù)倉也從不同的地方做出優(yōu)化,來提升效率。一般而言,有兩個方向:
第一就是通過各種軟件的優(yōu)化,減少網(wǎng)絡(luò)傳輸;
第二,就是加大網(wǎng)絡(luò)吞吐能力,實(shí)現(xiàn)網(wǎng)絡(luò)提速。
目前的高速低延遲網(wǎng)絡(luò),比如ROCE等數(shù)據(jù)傳輸技術(shù),數(shù)據(jù)中心內(nèi)部的高速互聯(lián)網(wǎng)路等技術(shù),可以大大加快存儲層到計算層的數(shù)據(jù)傳輸效率。
本地緩存
和Oracle的思路類似,計算存儲分離架構(gòu)中,還有一個環(huán)節(jié)就是數(shù)據(jù)緩存,如果每次數(shù)據(jù)訪問都必須訪問磁盤,那么系統(tǒng)性能就會大打折扣,所以在snowflake的虛擬倉庫層,也是會利用cache來進(jìn)行數(shù)據(jù)的緩存。
存儲優(yōu)化
另外,在目前大多數(shù)的云上數(shù)倉解決方案中,都會更加強(qiáng)化Metadata的作用,對于一些基本的sum、Max、min等操作,可以直接從metadata中返回結(jié)果,不需要產(chǎn)生磁盤IO。此外在存儲格式上,類似ORC、Parquet等存儲模式,利用列存和SIMD技術(shù),實(shí)現(xiàn)一次IO,返回更多有效數(shù)據(jù);同時啟用多種索引技術(shù),使得查詢定位更加快捷。
思考與未來展望
展望將來,云原生分布式數(shù)據(jù)庫的高速發(fā)展,必然帶來計算、存儲的分離,“存算分離”是當(dāng)前網(wǎng)絡(luò)技術(shù)發(fā)展和社會經(jīng)濟(jì)進(jìn)步的時代產(chǎn)物,是最適合當(dāng)前時代發(fā)展需求的一種架構(gòu)。擁抱云原生,按需付費(fèi)的云數(shù)倉模式會持續(xù)走強(qiáng),而在中國,也會走出公有云、私有云共同繁榮的未來。