前言
回顧過(guò)去二十年的技術(shù)發(fā)展,整個(gè)應(yīng)用形態(tài)和技術(shù)架構(gòu)發(fā)生了很大的升級(jí)換代,而任何技術(shù)的發(fā)展都與幾個(gè)重要的變量相關(guān)。
一,應(yīng)用形態(tài)的變遷,產(chǎn)生更多的場(chǎng)景和需求。整個(gè)應(yīng)用形態(tài)從企業(yè)應(yīng)用、互聯(lián)網(wǎng)服務(wù)再到移動(dòng)應(yīng)用,歷經(jīng)了幾個(gè)不同階段的發(fā)展。從最早企業(yè)內(nèi)應(yīng)用系統(tǒng),到通過(guò)移動(dòng)互聯(lián)網(wǎng)技術(shù)覆蓋到每個(gè)人生活的方方面面,這個(gè)過(guò)程中產(chǎn)生了大量的場(chǎng)景和需求。而新的場(chǎng)景和需求,是推動(dòng)產(chǎn)品和技術(shù)發(fā)展的主要因素。
二,更復(fù)雜的場(chǎng)景,更大規(guī)模的挑戰(zhàn),推動(dòng)技術(shù)的快速發(fā)展。新一代應(yīng)用面臨更復(fù)雜的場(chǎng)景和更大的規(guī)模挑戰(zhàn),老一代技術(shù)架構(gòu)無(wú)法支撐業(yè)務(wù)的快速發(fā)展,所以急需推動(dòng)新的技術(shù)的研究和發(fā)展。這是一個(gè)綜合的ROI的考慮,流量和數(shù)據(jù)到一定規(guī)模才能讓技術(shù)架構(gòu)升級(jí)帶來(lái)更大的效率和成本的收益。
三,技術(shù)基礎(chǔ)設(shè)施的完善,提供了技術(shù)和產(chǎn)品發(fā)展的基礎(chǔ)。互聯(lián)網(wǎng)、4G/5G等基礎(chǔ)設(shè)施的建立和完善,是新一代應(yīng)用誕生和發(fā)展的基礎(chǔ)。分布式技術(shù)、云計(jì)算、新一代硬件等技術(shù)的成熟,是技術(shù)架構(gòu)變革的基礎(chǔ)。
本篇文章會(huì)給大家分享應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)的演進(jìn)以及云上的架構(gòu)最佳實(shí)踐,這里先對(duì)數(shù)據(jù)系統(tǒng)的分類(lèi)做一個(gè)定義,數(shù)據(jù)系統(tǒng)如果按照主體來(lái)區(qū)分的話分為以下兩類(lèi):
應(yīng)用為主體:常見(jiàn)的數(shù)據(jù)架構(gòu)都是以『應(yīng)用』為主體,數(shù)據(jù)主要產(chǎn)生自應(yīng)用。數(shù)據(jù)架構(gòu)圍繞業(yè)務(wù)來(lái)設(shè)計(jì),通常是先定義業(yè)務(wù)模型后設(shè)計(jì)業(yè)務(wù)流程。由于業(yè)務(wù)之間區(qū)分度很大,每個(gè)業(yè)務(wù)都有截然不同的業(yè)務(wù)模型,所以數(shù)據(jù)系統(tǒng)需要具備高度『抽象』的能力,所以通常會(huì)選擇關(guān)系型數(shù)據(jù)庫(kù)這類(lèi)抽象能力強(qiáng)的組件作為核心存儲(chǔ)。
數(shù)據(jù)為主體:這類(lèi)數(shù)據(jù)系統(tǒng)通常圍繞『特定類(lèi)型數(shù)據(jù)』進(jìn)行構(gòu)建,比如說(shuō)圍繞云原生監(jiān)控?cái)?shù)據(jù)設(shè)計(jì)的以Prometheus為核心的監(jiān)控?cái)?shù)據(jù)系統(tǒng),再比如圍繞日志數(shù)據(jù)分析設(shè)計(jì)的ELK數(shù)據(jù)系統(tǒng)。這類(lèi)數(shù)據(jù)系統(tǒng)的設(shè)計(jì)過(guò)程通常是圍繞數(shù)據(jù)的收集、存儲(chǔ)、處理、查詢和分析等環(huán)節(jié)來(lái)設(shè)計(jì)整套數(shù)據(jù)系統(tǒng),數(shù)據(jù)具備統(tǒng)一的『具象』的模型。不同的場(chǎng)景有不同的數(shù)據(jù)系統(tǒng),當(dāng)某個(gè)場(chǎng)景具備通用性以及得到一定規(guī)模的應(yīng)用,通常在開(kāi)源界會(huì)誕生一套成熟的、完整的解決方案,比如說(shuō)云原生Prometheus、ELK、Hadoop等。
本篇文章介紹的數(shù)據(jù)架構(gòu)主要是第一類(lèi),即以『應(yīng)用為主體』的數(shù)據(jù)架構(gòu)。
應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)
應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)歷經(jīng)了多次迭代,從傳統(tǒng)的單一系統(tǒng)數(shù)據(jù)架構(gòu),到多組件構(gòu)成的現(xiàn)代數(shù)據(jù)架構(gòu)?,F(xiàn)代數(shù)據(jù)架構(gòu)下包含不同的計(jì)算和存儲(chǔ)組件,這些組件在處理不同類(lèi)型數(shù)據(jù)以及負(fù)載下各有優(yōu)劣?,F(xiàn)代數(shù)據(jù)架構(gòu)通過(guò)合理選擇和組合這些組件,讓各個(gè)組件能發(fā)揮最大的能力,從而讓整個(gè)數(shù)據(jù)系統(tǒng)能滿足更多樣化的場(chǎng)景需求以及支撐更大的數(shù)據(jù)規(guī)模。
傳統(tǒng)數(shù)據(jù)架構(gòu)(單一系統(tǒng))
LAMP架構(gòu)
一個(gè)應(yīng)用系統(tǒng)的基本構(gòu)成包括:API(提供服務(wù)接口)、應(yīng)用(業(yè)務(wù)處理邏輯)、數(shù)據(jù)存儲(chǔ)(應(yīng)用數(shù)據(jù)存儲(chǔ))以及運(yùn)行環(huán)境(應(yīng)用和數(shù)據(jù)庫(kù)的運(yùn)行環(huán)境)?;ヂ?lián)網(wǎng)早期最流行的LAMP架構(gòu)就是典型的單一系統(tǒng)數(shù)據(jù)架構(gòu),其中使用Apache Server作為API層、使用PHP開(kāi)發(fā)應(yīng)用,使用MySQL作為應(yīng)用數(shù)據(jù)存儲(chǔ),所有組件均運(yùn)行在Linux系統(tǒng)上。
整套架構(gòu)采用開(kāi)源軟件構(gòu)建,相比商業(yè)軟件能提供更低的成本,所以能快速在互聯(lián)網(wǎng)早期的各大中小站點(diǎn)流行起來(lái),成為最流行的建站技術(shù)架構(gòu)。但隨著互聯(lián)網(wǎng)的流量越來(lái)越大,LAMP架構(gòu)面臨的最大的問(wèn)題是可擴(kuò)展性,需要解決應(yīng)用和存儲(chǔ)的擴(kuò)展問(wèn)題。
如何進(jìn)行擴(kuò)展
關(guān)于擴(kuò)展技術(shù)的幾個(gè)基本概念:
Scale-up vs Scale-out
Scale-up即直接提升機(jī)器的配置規(guī)格,是最直接的擴(kuò)展手段,計(jì)算和存儲(chǔ)均可通過(guò)Scale-up的方式來(lái)進(jìn)行擴(kuò)展,但擴(kuò)展空間有限,相對(duì)成本較高。Scale-out即增加更多的機(jī)器進(jìn)來(lái),是相對(duì)成本更低、更靈活的手段,但需要相關(guān)組件具備能Scale-out的能力。
存儲(chǔ)和計(jì)算分離
存儲(chǔ)和計(jì)算是兩個(gè)不同維度的資源,如果強(qiáng)綁定會(huì)極大限制擴(kuò)展性。對(duì)數(shù)據(jù)系統(tǒng)來(lái)說(shuō),應(yīng)用節(jié)點(diǎn)和存儲(chǔ)節(jié)點(diǎn)分離就是應(yīng)用了存儲(chǔ)計(jì)算分離的設(shè)計(jì)思想,讓?xiě)?yīng)用和存儲(chǔ)都能獨(dú)立擴(kuò)展。
Scale-out具備更好的靈活性和經(jīng)濟(jì)性,計(jì)算和存儲(chǔ)進(jìn)行Scale-out的常見(jiàn)技術(shù)手段包括:
存儲(chǔ)Scale-out
通常采用數(shù)據(jù)分片技術(shù),將數(shù)據(jù)分散到多臺(tái)機(jī)器上。
計(jì)算Scale-out
基于狀態(tài)路由計(jì)算:通常用于狀態(tài)遷移代價(jià)大的數(shù)據(jù)架構(gòu),比如數(shù)據(jù)庫(kù)的分庫(kù)分表。分庫(kù)分表的擴(kuò)展需要進(jìn)行數(shù)據(jù)復(fù)制,所以通常需要提前規(guī)劃,根據(jù)數(shù)據(jù)所在分片來(lái)路由計(jì)算。
基于計(jì)算復(fù)制狀態(tài):如果狀態(tài)能非常靈活的復(fù)制或者是共享,那可基于計(jì)算來(lái)復(fù)制狀態(tài),是一種更靈活的計(jì)算擴(kuò)展架構(gòu)。比如說(shuō)基于共享存儲(chǔ)的大數(shù)據(jù)計(jì)算架構(gòu),可靈活調(diào)度任意計(jì)算節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行處理。
無(wú)狀態(tài)計(jì)算:計(jì)算不依賴任何狀態(tài),可以發(fā)生在任意節(jié)點(diǎn)上,所以計(jì)算節(jié)點(diǎn)可非常容易實(shí)現(xiàn)Scale-out,但需要解決計(jì)算調(diào)度問(wèn)題。常見(jiàn)Web應(yīng)用中的LoadBalancer后置一堆Web Server就是一個(gè)簡(jiǎn)單的無(wú)狀態(tài)計(jì)算擴(kuò)展架構(gòu)。
有狀態(tài)計(jì)算:計(jì)算依賴狀態(tài),計(jì)算的擴(kuò)展依賴狀態(tài)的遷移。如果狀態(tài)不可遷移,那計(jì)算的擴(kuò)展只能采取Scale-up的方式。如果狀態(tài)可遷移,那計(jì)算就可實(shí)現(xiàn)Scale-out,此時(shí)計(jì)算的可擴(kuò)展性依賴于狀態(tài)遷移的靈活性。對(duì)于可Scale-out的計(jì)算我們分為兩類(lèi)實(shí)現(xiàn)方式,分別是:
可擴(kuò)展的傳統(tǒng)數(shù)據(jù)架構(gòu)
LAMP架構(gòu)應(yīng)用上面提到的擴(kuò)展技術(shù),演變成了上圖的可擴(kuò)展的數(shù)據(jù)架構(gòu)。應(yīng)用側(cè)通常是無(wú)狀態(tài)計(jì)算,所以可以簡(jiǎn)單采取Scale-out的擴(kuò)展方式,前置Load Balancer來(lái)進(jìn)行流量調(diào)度。存儲(chǔ)側(cè)采取分庫(kù)分表的方式來(lái)進(jìn)行存儲(chǔ)和計(jì)算的擴(kuò)展,以及只讀庫(kù)的方式來(lái)對(duì)查詢計(jì)算進(jìn)行擴(kuò)展。雖然各層具備了擴(kuò)展能力,但該系統(tǒng)還存在一些問(wèn)題:
存儲(chǔ)側(cè)擴(kuò)展靈活性差,擴(kuò)展成本較高:計(jì)算側(cè)通常是無(wú)狀態(tài)計(jì)算節(jié)點(diǎn),擴(kuò)展相對(duì)靈活。但存儲(chǔ)側(cè)的擴(kuò)展需要進(jìn)行數(shù)據(jù)復(fù)制遷移,擴(kuò)展周期長(zhǎng)且靈活性差。同時(shí)MySQL的分庫(kù)分表每次擴(kuò)展需要雙倍資源,成本也較高。
單一存儲(chǔ)系統(tǒng),提供的能力有限:MySQL作為關(guān)系模型數(shù)據(jù)庫(kù),在業(yè)務(wù)模型抽象上提供極強(qiáng)的抽象能力,所以可以說(shuō)是一個(gè)萬(wàn)能存儲(chǔ)。在互聯(lián)網(wǎng)早期應(yīng)用負(fù)載不高的情況下,MySQL是最優(yōu)選擇,且已經(jīng)擁有了成熟的擴(kuò)展方案。但是隨著應(yīng)用場(chǎng)景和負(fù)載不斷變化,MySQL還是難以承載。
存儲(chǔ)成本高:簡(jiǎn)單來(lái)說(shuō),關(guān)系數(shù)據(jù)庫(kù)是結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)單位成本最高的存儲(chǔ)系統(tǒng)。
如何解決存儲(chǔ)側(cè)擴(kuò)展問(wèn)題
MySQL不是萬(wàn)能的,但MySQL對(duì)應(yīng)用系統(tǒng)來(lái)說(shuō)是不可替換的,到目前為止都是這樣。雖然現(xiàn)在有更多新的云原生關(guān)系數(shù)據(jù)庫(kù)出現(xiàn)來(lái)取代傳統(tǒng)MySQL的位置,但本質(zhì)上都脫不了MySQL這個(gè)殼,只是更強(qiáng)大的MySQL而已。所以很多解決方案都是圍繞MySQL作為輔助方案而不是替換方案出現(xiàn),比如說(shuō)Memcached/Redis這類(lèi)緩存系統(tǒng),幫助MySQL抵御大部分查詢流量,來(lái)解決MySQL容易被查詢打崩的問(wèn)題。
這個(gè)設(shè)計(jì)思想是『分而治之』,將原本MySQL所承擔(dān)的職責(zé)進(jìn)行細(xì)分,能分離解決的就分離解決?,F(xiàn)代數(shù)據(jù)架構(gòu)就是基于此思路,仍然以MySQL作為應(yīng)用交互和業(yè)務(wù)數(shù)據(jù)存儲(chǔ)的核心,但是使用一些輔助方案解決MySQL的問(wèn)題。
現(xiàn)代數(shù)據(jù)架構(gòu)(多樣化系統(tǒng))
定義問(wèn)題,分而治之
前面提到MySQL是應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)的核心存儲(chǔ),且是不可替換的組件。MySQL直接承載業(yè)務(wù)數(shù)據(jù)和大部分業(yè)務(wù)交互,現(xiàn)代數(shù)據(jù)架構(gòu)的演進(jìn)思路是圍繞MySQL提供輔助解決方案,采用『分而治之』的設(shè)計(jì)思路。所以我們首先得羅列清楚在單一系統(tǒng)架構(gòu)中MySQL所承擔(dān)的職責(zé),以及明確哪些點(diǎn)是可以分而治之的。分而治之的具體手段包括:
流量卸載:承載和抵御MySQL的部分讀寫(xiě)流量,讓MySQL有更多資源進(jìn)行事務(wù)處理。由于讀和寫(xiě)依賴MySQL內(nèi)數(shù)據(jù),所以在卸載流量的同時(shí)還會(huì)復(fù)制全部或者部分?jǐn)?shù)據(jù)。
數(shù)據(jù)卸載:MySQL內(nèi)部分?jǐn)?shù)據(jù)會(huì)用于事務(wù)處理,而部分?jǐn)?shù)據(jù)僅存儲(chǔ)和查詢。不參與事務(wù)處理的數(shù)據(jù)可卸載,來(lái)降低表的存儲(chǔ)量,對(duì)降成本和減負(fù)載都是有極大好處的。
為方便理解對(duì)MySQL承載的職責(zé)的具體含義,我們對(duì)應(yīng)到一個(gè)實(shí)際場(chǎng)景來(lái)解釋對(duì)應(yīng)的職責(zé),我們以『電商訂單』系統(tǒng)來(lái)進(jìn)行舉例。
事務(wù)處理一般是需要根據(jù)數(shù)據(jù)庫(kù)內(nèi)的一致的狀態(tài)決定操作的執(zhí)行,必須要有ACID的保證,這部分只能由MySQL來(lái)承載。MySQL的大部分查詢流量都是可被卸載的,最簡(jiǎn)單的是創(chuàng)建只讀庫(kù)來(lái)卸載查詢流量,但某些復(fù)雜查詢操作只讀庫(kù)無(wú)法很高效的執(zhí)行,必須依賴外部存儲(chǔ)來(lái)加速,比如說(shuō)數(shù)據(jù)搜索和數(shù)據(jù)分析。所以這部分流量需要卸載,并且需要復(fù)制部分或者全部數(shù)據(jù)。另外MySQL內(nèi)存儲(chǔ)的數(shù)據(jù)并不會(huì)都用于事務(wù)處理,很大一部分?jǐn)?shù)據(jù)在生成后僅提供查詢或非事務(wù)型操作,這部分?jǐn)?shù)據(jù)的查詢流量和存儲(chǔ)都是可被卸載的。
我們把職責(zé)給定義清楚后,也明確了哪些職責(zé)是MySQL主要承擔(dān)的,哪些職責(zé)是可以被卸載從而得以有效的『分而治之』的。
在理清了整個(gè)解決問(wèn)題的思路后,接下來(lái)才是對(duì)架構(gòu)師最大的挑戰(zhàn):如何選擇合適的組件來(lái)卸載流量或者存儲(chǔ)?
選擇合適的存儲(chǔ)組件
1.根據(jù)場(chǎng)景定義需求
準(zhǔn)確的定義需求是選對(duì)組件的前置條件,切勿僅根據(jù)功能性需求來(lái)進(jìn)行匹配,還需考慮一些基礎(chǔ)性需求,例如存儲(chǔ)組件可提供的SLA、數(shù)據(jù)可靠性、擴(kuò)展性、可運(yùn)維性等等。從上面的表中,我們能夠非常清晰的看到對(duì)各組件的功能性需求,那接下來(lái)我們?cè)倏纯椿A(chǔ)性需求如何區(qū)分和選擇。
在做數(shù)據(jù)系統(tǒng)設(shè)計(jì)時(shí)可以把應(yīng)用數(shù)據(jù)嘗試落在上圖的不同周期內(nèi),看下如何對(duì)存儲(chǔ)組件定義合適的基礎(chǔ)性需求。通常應(yīng)用系統(tǒng)最先產(chǎn)生的是事務(wù)數(shù)據(jù),事務(wù)數(shù)據(jù)會(huì)逐步向在線數(shù)據(jù)、離線數(shù)據(jù)轉(zhuǎn)換和流動(dòng),在線性逐步降低,從面向前臺(tái)逐步轉(zhuǎn)向后臺(tái)。再看從事務(wù)數(shù)據(jù)到離線數(shù)據(jù),基礎(chǔ)性要求的具體變化:
SLA要求逐步從高到底,在線系統(tǒng)對(duì)穩(wěn)定性要求極高,而后臺(tái)系統(tǒng)相對(duì)來(lái)說(shuō)要求可放低。
從TP逐步轉(zhuǎn)向AP,TP對(duì)訪問(wèn)延遲要求更高,而AP對(duì)分析能力要求更高。
數(shù)據(jù)的更新頻率逐步降低,逐步歸檔為不可變數(shù)據(jù),所以很多離線系統(tǒng)都是基于數(shù)據(jù)的不可變性來(lái)做存儲(chǔ)和計(jì)算優(yōu)化。
存儲(chǔ)成本逐步降低,數(shù)據(jù)規(guī)模逐步增大。
2.存儲(chǔ)組件的種類(lèi)和差異
先從宏觀層面比較下數(shù)據(jù)庫(kù)類(lèi)存儲(chǔ)組件的差異:
數(shù)據(jù)模型和查詢語(yǔ)言:這兩個(gè)點(diǎn)仍然是不同數(shù)據(jù)庫(kù)最顯著的區(qū)別。關(guān)系模型、文檔模型和寬表模型是相對(duì)抽象的模型,而類(lèi)似時(shí)序模型和圖模型等其他非關(guān)系模型是相對(duì)具象的模型。抽象模型表達(dá)力更強(qiáng),而具象模型更貼近具體場(chǎng)景。
SQL vs NoSQL:SQL類(lèi)更適合事務(wù)處理,包含開(kāi)源或商業(yè)關(guān)系數(shù)據(jù)庫(kù);NoSQL類(lèi)更適合非事務(wù)數(shù)據(jù)處理,基本是以開(kāi)源為主;場(chǎng)景使用上可以與SQL類(lèi)配合使用,提供流量卸載和存儲(chǔ)卸載;另外NoSQL類(lèi)更多是具象模型,貼近場(chǎng)景而生。
數(shù)據(jù)庫(kù)vs數(shù)據(jù)倉(cāng)庫(kù):數(shù)據(jù)倉(cāng)庫(kù)更偏離線數(shù)據(jù)分析,提供更大規(guī)模存儲(chǔ),但是在SLA和穩(wěn)定性方面相比數(shù)據(jù)庫(kù)略差。
云托管vs云原生:云原生的本質(zhì)是利用云上池化資源來(lái)實(shí)現(xiàn)更強(qiáng)的彈性,所以簡(jiǎn)單把一個(gè)開(kāi)源軟件托管在云上,并不能稱之為云原生。云原生帶來(lái)的優(yōu)勢(shì)是更低使用成本、更低運(yùn)維成本、更靈活的數(shù)據(jù)流轉(zhuǎn)以及更彈性的架構(gòu)。
我們看下當(dāng)前主流開(kāi)源數(shù)據(jù)庫(kù)以及對(duì)應(yīng)的云原生數(shù)據(jù)庫(kù)產(chǎn)品的對(duì)比:
在做存儲(chǔ)組件選型時(shí),要考慮功能性需求和基礎(chǔ)性需求,選擇合適的存儲(chǔ)組件。以上表格只是列舉了部分場(chǎng)景和其中推薦的產(chǎn)品,這些產(chǎn)品不是唯一選擇也不一定是最適合的選擇,因業(yè)務(wù)不同發(fā)展階段和需求而異。
選擇對(duì)存儲(chǔ)組件是一件很難的事,所以架構(gòu)師在設(shè)計(jì)數(shù)據(jù)架構(gòu)時(shí),要提前考慮到存儲(chǔ)組件的新增或替換,數(shù)據(jù)架構(gòu)必須具備這樣的靈活性,因?yàn)椤簶?gòu)建快速迭代能力比應(yīng)對(duì)未知需求的擴(kuò)展性更重要』。
在一個(gè)復(fù)雜的應(yīng)用系統(tǒng)中,必然會(huì)存在多套存儲(chǔ)組件的組合,而不是單一的存儲(chǔ)組件來(lái)支撐所有的場(chǎng)景和流量,所以架構(gòu)師還得面臨下一個(gè)難題:如何合理的組合這些存儲(chǔ)組件?
合理的進(jìn)行組合
1.派生數(shù)據(jù)架構(gòu)
在數(shù)據(jù)系統(tǒng)架構(gòu)中,我們可以看到會(huì)存在多套存儲(chǔ)組件。對(duì)于這些存儲(chǔ)組件中的數(shù)據(jù),有些是來(lái)自應(yīng)用的直寫(xiě),有些是來(lái)自其他存儲(chǔ)組件的數(shù)據(jù)復(fù)制。例如業(yè)務(wù)關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)通常是來(lái)自業(yè)務(wù),而高速緩存和搜索引擎的數(shù)據(jù),通常是來(lái)自業(yè)務(wù)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步與復(fù)制。不同用途的存儲(chǔ)組件有不同類(lèi)型的上下游數(shù)據(jù)鏈路,我們可以大概將其歸類(lèi)為主存儲(chǔ)和輔存儲(chǔ)兩類(lèi),這兩類(lèi)存儲(chǔ)有不同的設(shè)計(jì)目標(biāo),主要特征為:
主存儲(chǔ):數(shù)據(jù)產(chǎn)生自業(yè)務(wù)或者是計(jì)算,通常為數(shù)據(jù)首先落地的存儲(chǔ)。在應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)中,MySQL就是主存儲(chǔ)。
輔存儲(chǔ):數(shù)據(jù)主要來(lái)自主存儲(chǔ)的數(shù)據(jù)同步與復(fù)制,輔存儲(chǔ)是主存儲(chǔ)的某個(gè)視圖,通常面向數(shù)據(jù)查詢、檢索和分析做優(yōu)化。在應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)中,承擔(dān)流量卸載或存儲(chǔ)卸載的存儲(chǔ)組件,就是輔存儲(chǔ)。
這種主與輔的存儲(chǔ)組件相輔相成的架構(gòu)設(shè)計(jì),我們稱之為『派生數(shù)據(jù)體系』。在這個(gè)體系下,最大的技術(shù)挑戰(zhàn)是數(shù)據(jù)如何在主與輔之間進(jìn)行同步與復(fù)制。
上圖我們可以看到幾個(gè)常見(jiàn)的數(shù)據(jù)復(fù)制方式:
應(yīng)用層多寫(xiě):這是實(shí)現(xiàn)最簡(jiǎn)單、依賴最少的一種實(shí)現(xiàn)方式,通常采取的方式是在應(yīng)用代碼中先向主存儲(chǔ)寫(xiě)數(shù)據(jù),后向輔存儲(chǔ)寫(xiě)數(shù)據(jù)。這種方式不是很?chē)?yán)謹(jǐn),通常用在對(duì)數(shù)據(jù)可靠性要求不是很高的場(chǎng)景。因?yàn)榇嬖诘膯?wèn)題有很多,一是很難保證主與輔之間的數(shù)據(jù)一致性,無(wú)法處理數(shù)據(jù)寫(xiě)入失效問(wèn)題;二是數(shù)據(jù)寫(xiě)入的消耗堆積在應(yīng)用層,加重應(yīng)用層的代碼復(fù)雜度和計(jì)算負(fù)擔(dān),不是一種解耦很好的架構(gòu);三是擴(kuò)展性較差,數(shù)據(jù)同步邏輯固化在代碼中,比較難靈活添加輔存儲(chǔ)。
異步隊(duì)列復(fù)制:這是目前被應(yīng)用比較廣的架構(gòu),應(yīng)用層將派生數(shù)據(jù)的寫(xiě)入通過(guò)隊(duì)列來(lái)異步化和解耦。這種架構(gòu)下可將主存儲(chǔ)和輔存儲(chǔ)的數(shù)據(jù)寫(xiě)入都異步化,也可僅將輔存儲(chǔ)的數(shù)據(jù)寫(xiě)入異步化。第一種方式必須接受主存儲(chǔ)可異步寫(xiě)入,否則只能采取第二種方式。而如果采用第二種方式的話,也會(huì)遇到和上一種『應(yīng)用層多寫(xiě)』方案類(lèi)似的問(wèn)題,應(yīng)用層也是多寫(xiě),只不過(guò)是寫(xiě)主存儲(chǔ)與隊(duì)列,隊(duì)列來(lái)解決多個(gè)輔存儲(chǔ)的寫(xiě)入和擴(kuò)展性問(wèn)題。
CDC(Change Data Capture)技術(shù):這種架構(gòu)下數(shù)據(jù)寫(xiě)入主存儲(chǔ)后會(huì)由主存儲(chǔ)再向輔存儲(chǔ)進(jìn)行同步,對(duì)應(yīng)用層是最友好的,只需要與主存儲(chǔ)打交道。主存儲(chǔ)到輔存儲(chǔ)的數(shù)據(jù)同步,則可以再利用異步隊(duì)列復(fù)制技術(shù)來(lái)做。不過(guò)這種方案對(duì)主存儲(chǔ)的能力有很高的要求,必須要求主存儲(chǔ)能支持CDC技術(shù)。
『派生數(shù)據(jù)體系』是一個(gè)比較重要的技術(shù)架構(gòu)設(shè)計(jì)理念,其中CDC技術(shù)是更好的驅(qū)動(dòng)數(shù)據(jù)流動(dòng)的關(guān)鍵手段。具備CDC技術(shù)的存儲(chǔ)組件,才能更好的支撐數(shù)據(jù)派生體系,從而能讓整個(gè)數(shù)據(jù)系統(tǒng)架構(gòu)更加靈活,降低了數(shù)據(jù)一致性設(shè)計(jì)的復(fù)雜度,從而來(lái)面向高速迭代設(shè)計(jì)。MySQL的CDC技術(shù)是比較成熟的,也演化出來(lái)一些中間件和云產(chǎn)品,比如Canal以及阿里云的DTS。所以在我們的現(xiàn)代應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)中,也主要是基于MySQL的CDC技術(shù)來(lái)進(jìn)行數(shù)據(jù)派生。
現(xiàn)代應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)
上圖就是一個(gè)典型的現(xiàn)代應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu),我們來(lái)系統(tǒng)的看下:
1.由多存儲(chǔ)組件構(gòu)成,每個(gè)存儲(chǔ)組件各司其職:
MySQL:承載事務(wù)處理,為整個(gè)數(shù)據(jù)架構(gòu)的主存儲(chǔ),其余組件承擔(dān)流量卸載和存儲(chǔ)卸載的職責(zé)。
Redis:作為MySQL的查詢結(jié)果集緩存,幫助MySQL來(lái)抵御大部分的查詢流量,但Redis如果失效,則會(huì)有擊穿MySQL的風(fēng)險(xiǎn)。
Elasticsearch:倒排索引和搜索引擎技術(shù)能提供MySQL索引所無(wú)法支持的高效模糊查詢、全文檢索和多字段組合條件過(guò)濾的能力,所以主要是承擔(dān)復(fù)雜查詢的流量卸載。
HBase:分布式KV存儲(chǔ),提供寬表模型。可用于卸載MySQL內(nèi)非事務(wù)性數(shù)據(jù),可存儲(chǔ)MySQL內(nèi)所有表的全量數(shù)據(jù),提供低成本的存儲(chǔ)卸載。HBase也是一個(gè)在線系統(tǒng),所以也能提供簡(jiǎn)單查詢的流量卸載。
ClickHouse:MPP架構(gòu)的開(kāi)源數(shù)倉(cāng),具備非常優(yōu)異的分析性能,主要職責(zé)是分析流量卸載。
2.基于MySQL CDC的派生數(shù)據(jù)架構(gòu),由開(kāi)源產(chǎn)品Canal來(lái)做實(shí)時(shí)數(shù)據(jù)同步。但這里ClickHouse的數(shù)據(jù)同步并不一定需要是實(shí)時(shí)增量的,也可采用T+1的全量同步方式。
3.應(yīng)用系統(tǒng)需要與這些不同組件分別進(jìn)行交互,且交互接口各不相同。
這個(gè)架構(gòu)具備一定的靈活性,通過(guò)Canal來(lái)解決異構(gòu)存儲(chǔ)間的數(shù)據(jù)同步問(wèn)題,通過(guò)插件機(jī)制可靈活增加新的存儲(chǔ)組件來(lái)應(yīng)對(duì)未來(lái)的新的需求。每個(gè)組件都是開(kāi)源界打磨多年的成熟產(chǎn)品,也有一些中間件來(lái)降低應(yīng)用與這些組件的交互成本。但也存在一些明顯的問(wèn)題:
1.運(yùn)維成本極大:運(yùn)維是一門(mén)技術(shù)活,需要對(duì)組件的原理有比較清楚的了解才能更好的運(yùn)維,以及進(jìn)行線上問(wèn)題的排查和優(yōu)化。這些開(kāi)源產(chǎn)品已經(jīng)將使用成本降的足夠低,但是運(yùn)維成本還是很高,比如HBase組件的運(yùn)維還需要額外運(yùn)維Zookeeper、HDFS等。云托管產(chǎn)品降低了一定的運(yùn)維成本,但仍無(wú)法做到免運(yùn)維,業(yè)務(wù)OPS仍需要花大量精力在性能調(diào)優(yōu)、容量規(guī)劃等工作上。另外多組件會(huì)比單組件運(yùn)維成本更高,因?yàn)檫€需要管理組件間的數(shù)據(jù)流。
2.多API交互復(fù)雜:每個(gè)組件都提供了不盡相同的API,應(yīng)用與不同組件的交互很難抽象和解耦。
3.成本高:每一個(gè)新的組件的引入都需要額外的存儲(chǔ)和計(jì)算成本,但各組件的偏向不一樣,有的更重計(jì)算有的更重存儲(chǔ)。如果多組件間能共享計(jì)算或存儲(chǔ),那能極大的降低成本。而在當(dāng)前的架構(gòu)中,每個(gè)組件都是相互獨(dú)立的,需要獨(dú)享存儲(chǔ)和計(jì)算資源。
云上數(shù)據(jù)架構(gòu)實(shí)踐
把現(xiàn)代數(shù)據(jù)架構(gòu)搬到云上,可利用云的優(yōu)勢(shì)來(lái)優(yōu)化整套架構(gòu):一是找到合適的云原生產(chǎn)品替換開(kāi)源產(chǎn)品,最大好處是降低運(yùn)維成本,其次能獲得更強(qiáng)的穩(wěn)定性和性能;二是用更少的組件做更多的事,來(lái)降低管理和使用成本,也能降低應(yīng)用交互開(kāi)發(fā)復(fù)雜度。
以上就是完整的云上數(shù)據(jù)架構(gòu),重點(diǎn)講下替換開(kāi)源組件的幾個(gè)云產(chǎn)品:
DTS(數(shù)據(jù)傳輸服務(wù)):原理與Canal類(lèi)似,能對(duì)接更多數(shù)據(jù)庫(kù)上游和下游,全托管的MySQL實(shí)時(shí)數(shù)據(jù)同步中間件。
Tair(Redis企業(yè)版):阿里自研企業(yè)級(jí)緩存,兼容Redis協(xié)議,具備更強(qiáng)的性能。
Tablestore(表格存儲(chǔ)):阿里自研Bigtable,提供兼容HBase的寬表引擎,以及能力和性能都優(yōu)于Elasticsearch的索引引擎。純Serverless免運(yùn)維能最大程度降低運(yùn)維成本,同時(shí)提供API和SQL的接口降低應(yīng)用開(kāi)發(fā)成本。
ADB(分析型數(shù)據(jù)庫(kù)):阿里自研實(shí)時(shí)數(shù)倉(cāng),具備強(qiáng)大的分析性能,完全兼容MySQL協(xié)議。
接下來(lái)我們?cè)僦攸c(diǎn)提下Tablestore,因?yàn)樵趹?yīng)用系統(tǒng)在線場(chǎng)景,Tablestore承載了流量卸載和存儲(chǔ)卸載的重要職責(zé)。Tair的使用和定位與Redis完全一致,而Tablestore相比HBase和Elasticsearch有更大的差異性。
表格存儲(chǔ)Tablestore
表格存儲(chǔ)Tablestore是阿里云自研的面向海量結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)的Serverless多模型結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ),被廣泛用于社交、物聯(lián)網(wǎng)、人工智能、元數(shù)據(jù)和大數(shù)據(jù)等業(yè)務(wù)場(chǎng)景。采用與Google Bigtable類(lèi)似的寬表模型,天然的分布式架構(gòu),能支撐高吞吐的數(shù)據(jù)寫(xiě)入以及PB級(jí)數(shù)據(jù)存儲(chǔ),具體產(chǎn)品介紹可以參考官網(wǎng)以及權(quán)威指南。
Tablestore提供兼容HBase的寬表引擎,以及能力和性能都優(yōu)于Elasticsearch的索引引擎,它的核心能力包括:
多模型:提供抽象模型WideColumn寬表模型,以及具象模型Timeline消息模型以及Timestream時(shí)序模型。具象模型更適合應(yīng)用與應(yīng)用系統(tǒng),而具象模型是圍繞具體場(chǎng)景的數(shù)據(jù)架構(gòu)而設(shè)計(jì)和深度優(yōu)化。
多元化索引:提供二級(jí)索引和多元索引,不同查詢加速場(chǎng)景提供不同的索引實(shí)現(xiàn),其中多元索引能提供全文檢索、地理位置檢索以及靈活的多條件組合查詢,功能和性能都優(yōu)于Elasticsearch。
存儲(chǔ)計(jì)算分離架構(gòu):提供計(jì)算和存儲(chǔ)側(cè)的靈活擴(kuò)展能力,不僅體現(xiàn)在架構(gòu)上,也體現(xiàn)在產(chǎn)品形態(tài)上。用戶可以單獨(dú)為存儲(chǔ)付費(fèi)或?yàn)橛?jì)算付費(fèi),提供更靈活的資源組合,獲得最低的成本。
Serverless服務(wù):純Serverless服務(wù),提供完全免運(yùn)維的服務(wù),全球部署、即開(kāi)即用。零成本即可接入,最大可擴(kuò)展至千萬(wàn)TPS服務(wù)能力以及PB級(jí)存儲(chǔ)。
計(jì)算生態(tài):能夠與開(kāi)源計(jì)算引擎對(duì)接,融合流批一體計(jì)算能力。同時(shí)自身提供CDC能力,讓數(shù)據(jù)能夠更靈活的進(jìn)行流轉(zhuǎn)。
CDC技術(shù):Tablestore的CDC技術(shù)名為T(mén)unnel Service,支持全量和增量的實(shí)時(shí)數(shù)據(jù)訂閱,并且能無(wú)縫對(duì)接Flink流計(jì)算引擎來(lái)實(shí)現(xiàn)表內(nèi)數(shù)據(jù)的實(shí)時(shí)流計(jì)算。
SQL支持:提供SQL支持,大大降低使用和應(yīng)用開(kāi)發(fā)門(mén)檻。
總結(jié)
技術(shù)架構(gòu)的選擇沒(méi)有統(tǒng)一標(biāo)準(zhǔn)答案,是一個(gè)綜合的權(quán)衡考慮。本文主要介紹了應(yīng)用系統(tǒng)數(shù)據(jù)架構(gòu)的變遷,相信隨著應(yīng)用場(chǎng)景越來(lái)越復(fù)雜、更多需求的提出,隨著底層基礎(chǔ)設(shè)施的完善,會(huì)有更多新技術(shù)和產(chǎn)品出現(xiàn),而數(shù)據(jù)架構(gòu)也會(huì)繼續(xù)演進(jìn)。但是一些經(jīng)典的設(shè)計(jì)思想會(huì)保留,例如分而治之、派生數(shù)據(jù)架構(gòu)、如何靈活的選擇和組合存儲(chǔ)和計(jì)算組件等。