傳統的數據系統就是所謂的『大數據』技術,這是一個被創造出來的名詞,表明着新的技術門檻。近幾年得益於產業的發展、業務的創新、數據的爆發式增加以及開源技術的普遍應用,經歷多年的磨鍊以及在廣大開發者的共建下,大數據的核心組件和技術架構日趨成熟。特別是隨着雲的發展,讓『大數據』技術的使用門檻進一步下降,愈來愈多的業務創新會由數據來驅動完成。數據庫
『大數據』技術會逐步向輕量化和智能化方向發展,最終也會成爲一個研發工程師的必備技能之一,而這個過程必須是由雲計算技術來驅動以及在雲平臺之上才能完成。應用系統和數據系統也會逐漸融合,數據系統再也不隱藏在應用系統以後,而是也會貫穿在整個業務交互邏輯。傳統的應用系統,重點在於交互。而現代的應用系統,在與你交互的同時,會慢慢地熟悉你。數據系統的發展驅動了業務系統的發展,從業務化到規模化,再到智能化。緩存
向規模化和智能化的發展,仍然存在必定的技術門檻。成熟的開源技術的應用能讓一個大數據系統的搭建變得簡單,同時大數據架構也變得很廣泛,例如廣爲人知的Lambda架構,必定程度上下降了技術的入門門檻。可是對數據系統的後續維護,例如對大數據組件的規模化應用、運維管控和成本優化,須要掌握大數據、分佈式技術及複雜環境下定位問題的能力,仍然具有很高的技術門檻。架構
數據系統的核心組件包含數據管道、分佈式存儲和分佈式計算,數據系統架構的搭建會是使用這些組件的組合拼裝。每一個組件各司其職,組件與組件之間進行上下游的數據交換,而不一樣模塊的選擇和組合是架構師面臨的最大的挑戰。併發
上圖是一個比較典型的技術架構,包含應用系統和數據系統。這個架構與具體業務無關聯,主要用於體現一個數據應用系統中會包含的幾大核心組件,以及組件間的數據流關係。應用系統主要實現了應用的主要業務邏輯,處理業務數據或應用元數據等。數據系統主要對業務數據及其餘數據進行彙總和處理,對接BI、推薦或風控等系統。整個系統架構中,會包含如下比較常見的幾大核心組件:運維
對於數據存儲組件咱們再進一步分析,當前各種數據存儲組件的設計是爲知足不一樣場景下數據存儲的需求,提供不一樣的數據模型抽象,以及面向在線和離線的不一樣的優化偏向。咱們來看下下面這張詳細對比表:異步
派生數據體系 分佈式
在數據系統架構中,咱們能夠看到會存在多套存儲組件。對於這些存儲組件中的數據,有些是來自應用的直寫,有些是來自其餘存儲組件的數據複製。例如業務關係數據庫的數據一般是來自業務,而高速緩存和搜索引擎的數據,一般是來自業務數據庫的數據同步與複製。不一樣用途的存儲組件有不一樣類型的上下游數據鏈路,咱們能夠大概將其歸類爲主存儲和輔存儲兩類,這兩類存儲有不一樣的設計目標,主要特徵爲:ide
爲什麼會有主存儲和輔存儲的存在?能不能統一存儲統一讀寫,知足全部場景的需求呢?目前看尚未,存儲引擎的實現技術有多種,選擇行存仍是列存,選擇B+tree仍是LSM-tree,存儲的是不可變數據、頻繁更新數據仍是時間分區數據,是爲高速隨機查詢仍是高吞吐掃描設計等等。數據庫產品目前也是分兩類,TP和AP,雖然在往HTAP方向走,但實現方式仍然是底層存儲分爲行存和列存。高併發
再來看主輔存儲在實際架構中的例子,例如關係數據庫中主表和二級索引表也能夠看作是主與輔的關係,索引表數據會隨着主表數據而變化,強一致同步而且爲某些特定條件組合查詢而優化。關係數據庫與高速緩存和搜索引擎也是主與輔的關係,採用知足最終一致的數據同步方式,提供高速查詢和檢索。在線數據庫與數倉也是主與輔的關係,在線數據庫內數據集中複製到數倉來提供高效的BI分析。工具
這種主與輔的存儲組件相輔相成的架構設計,咱們稱之爲『派生數據體系』。在這個體系下,最大的技術挑戰是數據如何在主與輔之間進行同步與複製。
上圖咱們能夠看到幾個常見的數據複製方式:
異步隊列複製:這是目前被應用比較廣的架構,應用層將派生數據的寫入經過隊列來異步化和解耦。這種架構下可將主存儲和輔存儲的數據寫入都異步化,也可僅將輔存儲的數據寫入異步化。第一種方式必須接受主存儲可異步寫入,不然只能採起第二種方式。而若是採用第二種方式的話,也會遇到和上一種『應用層多寫』方案相似的問題,應用層也是多寫,只不過是寫主存儲與隊列,隊列來解決多個輔存儲的寫入和擴展性問題。
『派生數據體系』是一個比較重要的技術架構設計理念,其中CDC技術是更好的驅動數據流動的關鍵手段。具有CDC技術的存儲組件,才能更好的支撐數據派生體系,從而能讓整個數據系統架構更加靈活,下降了數據一致性設計的複雜度,從而來面向高速迭代設計。惋惜的是大多數存儲組件不具有CDC技術,例如HBase。而阿里雲Tablestore具有很是成熟的CDC技術,CDC技術的應用也推進了架構的創新。
一個好的產品,在產品內部會採用派生數據架構來不斷擴充產品的能力,能將派生的過程透明化,內部解決數據同步、一致性及資源配比問題。而現實中大多數技術架構採用產品組合的派生架構,須要本身去管理數據同步與複製等問題,例如常見的MySQL+Elasticsearch,或HBase+Solr等。這種組合一般被忽視的最大問題是,在解決CDC技術來實時複製數據後,如何解決數據一致性問題?如何追蹤數據同步延遲?如何保證輔存儲與主存儲具有相同的數據寫入能力?
存儲組件的選型
架構師在作架構設計時,最大的挑戰是如何對計算組件和存儲組件進行選型和組合,同類的計算引擎的差別化相對不大,一般會優先選擇成熟和生態健全的計算引擎,例如批量計算引擎Spark和流計算引擎Flink。而對於存儲組件的選型是一件很是有挑戰的事,存儲組件包含數據庫(又分爲SQL和NoSQL兩類,NoSQL下又根據各種數據模型細分爲多類)、對象存儲、文件存儲和高速緩存等不一樣類別。帶來存儲選型複雜度的主要緣由是架構師須要綜合考慮數據分層、成本優化以及面向在線和離線的查詢優化偏向等各類因素,且當前的技術發展仍是多樣化的發展趨勢,不存在一個存儲產品能知足全部場景下的數據寫入、存儲、查詢和分析等需求。有一些經驗能夠分享給你們:
另外關於數據存儲架構,我認爲最終的趨勢是:
定位
結構化大數據存儲在數據系統中是一個很是關鍵的組件,它起的一個很大的做用是鏈接『在線』和『離線』。做爲數據中臺中的結構化數據彙總存儲,用於在線數據庫中數據的彙總來對接離線數據分析,也用於離線數據分析的結果集存儲來直接支持在線查詢或者是數據派生。根據這樣的定位,咱們總結下對結構化大數據存儲的幾個關鍵需求。
關鍵需求
開源產品
目前開源界比較知名的結構化大數據存儲是HBase,Cassandra和Tablestore,Cassandra是WideColumn模型NoSQL類別下排名Top-1的產品,在國外應用比較普遍,在國內的話相比Cassandra會更流行一點,Tablestore是阿里雲自研的結構化大數據存儲產品。