作者 | 祁國輝
責編 | 韓 楠
作者 | 祁國輝
責編 | 韓 楠
縱觀歷史, 隨著IT技術的發展, 到底是存算一體還是存算分離, 其實反覆過很多次 , 讓我們來簡單回顧一下,資料庫歷史上幾次大的架構變更。 希望可以 幫助大家按照技術發展脈絡,來加深對技術原理和使用者收益的理解。
第一次存算分離
最早版本的資料庫 , 即網狀資料庫管理系統(DBMS) , 由通用電氣公司1961年開發成功,其IDS(Integrated DataStore,整合資料儲存)是世界上第一個網狀DBMS,也是第一個DBMS。 但是它只能執行於通用電氣的主機上,且資料庫只有一個檔案,所有的表必須透過手工編碼生成 、 儲存和計算是緊密耦合在一起的。
這一點從它的名字就可以看出來,整合資料儲存(IntegratedData Store,IDS)。
而之後的很長時間,資料庫都是屬於高階應用,和各種大型機 、 中型機緊密繫結在一起,典型的IBM大型機( (MainFrame) ,老牌IT人都熟悉的System/360, 透過程式設計訪問內部的各種資料庫, 後來大家熟悉的DB2, 也是最早執行在這個平臺上, 藉助當時超強的計算能力, 在全球各種大型金融機構, 大型科研實驗室和大型企業獨領風騷, 佔據了領導地位。
IBM當時在計算機領域無愧它 “ 藍色巨人 ” 的稱號, 除了響噹噹的產品之外, 還有大量的精英在其中對最新科技進行研究, 對資料庫影響最大的幾位大神都在IBM供職, 包括提出關係型資料庫模型的Codd博士, 在此基礎上發揚光大的 C.J.Date和Jim Gray。 可以說DB2 在整個資料庫歷史上扮演了一個很重要的承上啟下的作用。
當然也不得不提另外一位傳奇人物, 就是Oracle的創始人之一,Larry Ellison, 自1977年創立SDL, 1982年更名為Oracle, 然後迅速藉助小型機的快速發展,迅速佔領了商用資料庫的第一把交椅, 直至今日, DB Engine上Oracle仍佔據榜首, 數十年未動搖。
因為小型機的快速發展,計算機市場出現群雄爭霸的局面, 而在Unix 系統開始大行其道之後, 市面上能夠提供unix主機的企業越來越多, 除了IBM, 還有HP 、 Compaq 、 富士通 、 Sun。而幾乎所有的Unix主機都會連線獨立的儲存伺服器,來實現第一次的儲存和計算的分離 。
在這次的存算分離當中, 最重要的支撐技術主要包括成熟的網路組網技術,以及成熟的儲存網路技術,當然Oracle自己的殺手級技術快取融合,也起到很大的作用。
那麼看一下使用者得到的好處在哪裡?
• 增強了系統的伸縮性, 使用者可以獨立增加資料庫伺服器來提升處理能力,增加儲存伺服器來擴大資料庫容量。
• 增強了系統的容錯性,在這種分離架構下,可以透過冗餘配置來防止任何一個環節出現單點故障, 增強了資料庫系統的持續服務能力。
記憶體融合技術 則是在兩個計算節點間 共享對方節點的記憶體資料, 來減少磁碟讀取帶來的IO, 從而提高效能。
快取融合技術允許不同RAC節點間 透過高速內網共享各節點資料庫例項內部快取的資料塊,快取的資料塊直接從一個節點的共享記憶體傳遞到其他節點的共享記憶體。這樣對於最新的資料塊, 就可以直接訪問其他節點的快取, 而不必等待快取寫入磁碟之後再從磁碟讀取, 從而使得多個節點之間可以高效率地協同工作。
為了降低存取遠端記憶體時的主機消耗, Oracle 還使用了專用的基於RDMA技術的RDS協議, 可以直接繞開CPU, 直接實現遠端記憶體的直接讀取,進一步提升訪問效率。
海量資料催生的存算一體
時間進入本世紀, 隨著使用者資料的快速膨脹, 使用者對海量資料的分析需求越來越明顯, 各行各業都在搭建自己的資料倉儲和商業智慧系統, 這時使用者面臨的最大挑戰第一是成本, 第二是效能。
因為傳統Unix主機和高階儲存價格高居不下, 所以想要搭建一個用於決策支援的資料倉儲系統, 在硬體和軟體license上就是一筆不小的投資。另外可能耗費巨資搭建的系統, 在做海量資料統計彙總的時候,比老黃牛還慢, 廠家分析過之後, 診斷結果:磁碟轉速不夠, 網路傳輸不夠,CPU處理能力不夠。總而言之, 系統需要擴容。
究其根本原因, 還是在IO , 因為計算單元處理資料, 但是它不儲存資料, 所有的資料要從儲存中取, 而儲存在取資料的時候, 都是一個資料塊一個資料塊來取, 根本沒法判斷這個塊中哪些資料是計算單元需要的。在傳統行儲存的場景, 一個決策查詢可能只需要幾個欄位, 但是必須把所有資料都拿到計算單元, 由計算單元處理/判斷之後再丟棄。
浪費了大量的IO, 另外由於計算單元記憶體不夠, 再大表連線的時候, 出現大量的臨時資料, 這些臨時資料還需要在儲存中臨時存放, 需要的時候再拿出來, 這就又造成了大量的資源浪費。
所以這個時候就自然 催生出新的架構 , 普遍的原理是OLTP系統中每次操作都是小資料量, 這種場景是移動資料到計算;而OLAP系統中,每次都會涉及大量資料處理, 所以要減少網路傳輸, 這時候應該是移動計算到資料。這個描述有點抽象, 但是大概意思就是 海量資料首先在本地進行初步加工, 減少資料量之後,再去參與後繼計算,這樣IO和算力都得到節省, 自然效能就上去了。
這個時候的玩家, 包括來自大廠的TD 和DB2, 也包括後來居上的開源MPP產品GreenPlum,還有國內的老牌資料庫廠商南大通用Gbase, 以GP為例, 示例如下:
此階段 技術核心關注 在減少網路間傳輸的IO, 一方面透過列式儲存, 來支援分析系統中按列統計的習慣, 每次查詢只需要取需要的列就可以, 減少無謂的IO, 同時利用各種索引技術, 加快資料定位和存取的效率。另外透過快閃記憶體技術的高速發展, 利用高速快閃記憶體還可以進一步提升系統的效能。
而之後盛行的Hadoop架構, 也是屬於利用本地磁碟透過搭建分散式檔案系統 , 來實現海量資料的處理。開源的Hadoop架構發展迅猛, 不斷有新的技術加入,大大催生了資料倉儲領域的技術發展。衍生出很多非常亮眼的技術, 比如Hive、Impala、Presto、Spark等等。
不過MPP雖然讓更多的人能夠以較低的成本搭建海量資料倉儲, 隨著應用的深入,也暴露出幾個問題:
• 計算儲存緊耦合, 提升了計算效能, 但是在系統容量擴容的時候, 需要對所有節點上的資料進行重新分佈, 而這個時間相對較長, 有可能會影響業務, 所以 在一些業務比較繁忙的客戶場景中, 一般智慧用新建叢集的方式來進行容量擴容 。
• 因為開啟了大規模並行, 所有的任務都會啟動平行計算,啟動後計算任務會分佈到叢集中的每個節點, 那麼 叢集併發能力的上限, 並不取決於叢集大小, 而是取決於叢集中配置最低的那一臺機器, 這臺機器能支援多少任務並行, 就代表整個叢集能支援多少並行 。
• 配置彈性不足, 因為上述原因, 為了能夠支撐企業業務高峰期的業務, 必須把整個叢集配置到能符合業務高峰期的規模, 而在平時, 機器閒置率就很高, 導致投資浪費。
雲時代帶來的新一代存算分離
隨著公有云的快速發展, 按需付費的概念逐步深入人心,對大規模 資料 的 分析 也 要求能做到按需供給,那麼傳統MPP這種存算一體的緊耦合架構,就沒法滿足使用者的需求了。另外, 網路技術和儲存技術也飛速發展, 這時就自然帶來新一代的雲原生資料庫的存算分離架構, 把資料庫技術向前推進了一大步 。
以業界最有名的Snowflake公司為例,創立Snowflake之前,Benoit Dageville和Thierry Cruanes在甲骨文做了十多年資料工程師,後來他們決定在雲上建立數倉,聯合另外一位創始人Marcin Żukowski, 共同建立了 S nowflake 。
為了更好地利用雲上的資源,他們首先把儲存和計算再次分離,把資料以大量分割槽的方式儲存在共享的物件儲存中,儲存中的資料按列儲存,而中間的計算層, 也透過無狀態的虛擬資料倉儲來動態拉起和銷燬, 來實現使用者不同workload的靈活排程和計費。 目前已經成為雲原生數倉的標準範本 。
下面簡單看一看Snowflake的技術架構 :
Snowflake核心元件從底向上可以分為三個層次:
資料儲存 層 。Snowflake的資料儲存是構建在 Amazon S3物件儲存上 ,主要用來儲存表資料和查詢結果。
計算層-虛擬倉庫 。虛擬倉庫構建在Amazon EC2虛擬機器組成的彈性叢集之上,負責執行使用者的查詢請求。
排程雲服務層 。雲服務元件包括併發訪問控制、基礎設施管理、最佳化器、事務管理、安全管理、後設資料管理,其中元 資料包含schema資訊、表資訊、許可權認證資訊、秘鑰、統計資訊 。
在這個架構下, 不同的workload可以隨時透過建立不同的虛擬倉庫來實現計算的靈活調配, 而每次計算的時候, 計算層透過網路直接從儲存層獲得資料 , 然後在虛擬資料倉儲中進行計算, 負載比較中的workload可以建立較大的虛擬倉庫, 而普通查詢可以建立較小的虛擬倉庫,使用者還可以透過調整虛擬倉庫中單節點CPU和節點個數來平衡計算複雜性和併發性 。
虛擬倉庫之間,透過佔用不同的硬體節點或者計算層中的資源排程來實現隔離。因為整個虛擬倉庫的無狀態, 所以使用者可以隨時建立和銷燬虛擬倉庫, 當然也意味著計算層的可以透過增加EC2的臺數,來實現計算層的橫向擴充套件。
同時, 由於儲存層也已經完成了與計算層的解耦, 所以儲存層也可以隨時按需進行橫向擴充套件, 而無需停機做資料分佈。
◆ 技術最佳化手段
我們都知道, 存算分離架構,提高了系統的靈活性, 可以實現計算能力和儲存能力的動態擴縮容,無需按照業務峰值來搭建系統, 但是也帶來了大量資料需要在儲存層和計算層之間傳輸的問題。
網路加速
好在,這麼多年的儲存,網路技術飛速發展, 能很好地滿足這些需求, 同時新一代雲數倉也從不同的地方做出最佳化,來提升效率。一般而言, 有兩個方向 :
第一就是透過各種軟體的最佳化,減少網路傳輸;
第二,就是加大網路吞吐能力,實現網路提速。
目前的高速低延遲網路,比如ROCE等資料傳輸技術, 資料中心內部的高速網際網路路等技術, 可以大大加快儲存層到計算層的資料傳輸效率。
本地快取
和 O racle的思路類似, 計算儲存分離架構中, 還有一個環節就是資料快取,如果每次資料訪問都必須訪問磁碟, 那麼系統效能就會大打折扣, 所以在snowflake的虛擬倉庫層, 也是會利用cache來進行資料的快取。
儲存最佳化
另外,在目前大多數的雲上數倉解決方案中, 都會更加強化Metadata的作用, 對於一些基本的sum 、 Max 、 min等操作, 可以直接從metadata中返回結果, 不需要產生磁碟IO。 此 外在儲存格式上, 類似ORC 、 Parquet等儲存模式,利用列存和SIMD技術, 實現一次IO,返回更多有效資料;同時啟用多種索引技術, 使得查詢定位更加快捷。
思考與未來展望
展望將來, 雲原生分散式資料庫的高速發展,必然帶來計算、儲存的分離, “存算分離”是當前網路技術發展和社會經濟進步的時代產物,是最適合當前時代發展需求的一種架構。 擁抱雲原生,按需付費的雲數倉模式會持續走強,而在中國,也會走出公有云 、 私有云共同繁榮的未來。
▼
作者介紹
祁國輝
前 Oracle 雲平臺事業部電信行業技術總監;現就職於杭州石原子科技有限公司
【作者介紹】網名"atiger",前 Oracle 雲平臺事業部電信行業技術總監。擁有超過25年資料庫和資料倉儲HK經驗。曾創辦著名資料倉儲網站: (資料倉儲之路)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016482/viewspace-2924044/,如需轉載,請註明出處,否則將追究法律責任。