一篇了解集中式數(shù)據(jù)庫(kù)的集群計(jì)算
節(jié)前寫過(guò)一篇關(guān)于分布式數(shù)據(jù)庫(kù)的文章,當(dāng)時(shí)有幾個(gè)朋友和我討論集中式數(shù)據(jù)庫(kù)和分布式數(shù)據(jù)庫(kù)如何選擇的問(wèn)題。實(shí)際上,數(shù)據(jù)庫(kù)產(chǎn)品都不是萬(wàn)能的,對(duì)于不同的應(yīng)用場(chǎng)景,不同的用戶群體,其對(duì)數(shù)據(jù)庫(kù)的選擇有所不同。對(duì)于一些用戶或者一些應(yīng)用場(chǎng)景來(lái)說(shuō),可能選擇分布式數(shù)據(jù)庫(kù)是必然的選擇,另外一些用戶或者應(yīng)用場(chǎng)景,選擇集中式數(shù)據(jù)庫(kù)更簡(jiǎn)單一些。
總體來(lái)說(shuō),集中式數(shù)據(jù)庫(kù)因?yàn)橄鄬?duì)簡(jiǎn)單,因此可能適用的場(chǎng)景更廣泛一些,特別是對(duì)于中小型非關(guān)鍵性系統(tǒng)或者沒(méi)有能力運(yùn)行于維護(hù)大型分布式數(shù)據(jù)庫(kù)系統(tǒng)的用戶來(lái)說(shuō),選擇集中式數(shù)據(jù)庫(kù)可能更符合企業(yè)的需求。
實(shí)際上使用集中式數(shù)據(jù)庫(kù)的客戶也需要很多分布式數(shù)據(jù)庫(kù)具有的特性,比如高可用、多副本、故障自動(dòng)隔離、橫向擴(kuò)展等。
很多用戶都怕集中式數(shù)據(jù)庫(kù)的單機(jī)總體容量可能受限,實(shí)際上對(duì)于絕大多數(shù)系統(tǒng)來(lái)說(shuō),單機(jī)容量達(dá)到極限還是很困難的。無(wú)論是內(nèi)存,CPU,IO,網(wǎng)絡(luò)、存儲(chǔ)容量,現(xiàn)在的上限都相當(dāng)高,對(duì)于一般的系統(tǒng)來(lái)說(shuō)還是比較難達(dá)到極限的。
雖然如此,集中式數(shù)據(jù)庫(kù)支持某種意義上的橫向擴(kuò)展還是很有必要的。比如ORACLE 的RAC,雖然不能像分布式數(shù)據(jù)庫(kù)一樣橫向擴(kuò)展到幾十上百個(gè)節(jié)點(diǎn),RAC的橫向擴(kuò)展能力還是會(huì)讓人感到比較放心。對(duì)于國(guó)產(chǎn)集中式關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),強(qiáng)一致性讀寫分離是很好的橫向擴(kuò)展方式,其實(shí)現(xiàn)方式?jīng)]有Oracle RAC那么難,又能夠解決大量的讀操作消耗過(guò)多系統(tǒng)資源的問(wèn)題。通過(guò)一個(gè)較好的方案實(shí)現(xiàn)強(qiáng)一致性讀寫分離,是國(guó)產(chǎn)集中式數(shù)據(jù)庫(kù)在同質(zhì)化競(jìng)爭(zhēng)中脫穎而出的一個(gè)途徑。
可能有些朋友會(huì)說(shuō)了,現(xiàn)在的國(guó)產(chǎn)數(shù)據(jù)庫(kù),開(kāi)源數(shù)據(jù)庫(kù),基本上都有類似的功能,這個(gè)有什么難的。實(shí)際上目前開(kāi)源、國(guó)產(chǎn)數(shù)據(jù)庫(kù)的集群計(jì)算都是外掛的,不是從數(shù)據(jù)庫(kù)的底層設(shè)計(jì)開(kāi)始的,僅僅是集群計(jì)算框架與原有RDBMS內(nèi)核的整合。
要想把這個(gè)問(wèn)題說(shuō)清楚,首先我們需要分析一下客戶為什么需要找個(gè)功能。有些時(shí)候客戶需要強(qiáng)一致性的讀寫分離并不是為了橫向擴(kuò)展,而是用一種最簡(jiǎn)單的方式實(shí)現(xiàn)應(yīng)用系統(tǒng)的高可用。
數(shù)據(jù)庫(kù)的無(wú)數(shù)據(jù)丟失強(qiáng)一致性同步一直是保證數(shù)據(jù)庫(kù)高可用的一種客戶的強(qiáng)需求,雖然大部分用戶可以接受部分的數(shù)據(jù)丟失,只要當(dāng)主系統(tǒng)故障的時(shí)候,能夠快速恢復(fù)業(yè)務(wù)就可以達(dá)到他們的最基本的要求。不過(guò)正是因?yàn)楣收锨袚Q是有損的,所以在真正做切換的時(shí)候還是會(huì)有些猶豫。因?yàn)槊看吻袚Q后,都有一些臟數(shù)據(jù)要處理,對(duì)于運(yùn)維部門,業(yè)務(wù)部門,開(kāi)發(fā)商來(lái)說(shuō),都是留下了一些尾巴。如果切換后能夠?qū)崿F(xiàn)0數(shù)據(jù)丟失,不需要做收尾的工作,那么當(dāng)主系統(tǒng)故障時(shí),就會(huì)十分堅(jiān)決的進(jìn)行故障切換了。
強(qiáng)一致性同步的另外一個(gè)好處是,我們的MIS類的系統(tǒng)中,讀寫比例高達(dá)8:2甚至9:1,在應(yīng)用的角度上講,把一些讀操作都轉(zhuǎn)移到只讀副本上去,可以大大減少主實(shí)例的負(fù)擔(dān),也可以減少主實(shí)例故障的幾率。如果主備實(shí)例的數(shù)據(jù)不是隨時(shí)都是完全一致的,那么我們的應(yīng)用需要做相應(yīng)的修改,確保某些只讀操作是可以在只讀副本上運(yùn)行,有些只讀操作需要強(qiáng)一致性,必須在主實(shí)例上運(yùn)行。不過(guò)如果主從數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)隨時(shí)都能確保強(qiáng)一致,那么在一個(gè)集群環(huán)境中寫應(yīng)用的難度就大大降低了。
除了強(qiáng)一致性的讀寫分離,客戶的另外一個(gè)重要需求就是透明應(yīng)用故障切換,這個(gè)詞Oracle簡(jiǎn)稱TAF,屬于RAC故障切換的一種早期方式,雖然十多年前這種切換方式就已經(jīng)被更為強(qiáng)大的快速連接故障切換(FCF)所替代,不過(guò)目前國(guó)內(nèi)的大多數(shù)應(yīng)用軟件還在使用TAF。TAF的好處是當(dāng)數(shù)據(jù)庫(kù)實(shí)例故障時(shí),應(yīng)用可以自動(dòng)切換。
Oracle 12.1后支持的GDS服務(wù)就可以在一個(gè)集群計(jì)算環(huán)境中支持讀寫分離、負(fù)載均衡與故障切換,我們的國(guó)產(chǎn)數(shù)據(jù)庫(kù)廠商可以認(rèn)真學(xué)習(xí)一下其功能與實(shí)現(xiàn)方式。
Oracle GDS可以構(gòu)建一個(gè)統(tǒng)一而又復(fù)雜強(qiáng)大的統(tǒng)一計(jì)算環(huán)境,讓RAC\ADG\OGG等復(fù)制技術(shù)與計(jì)算框架有效地整合成一個(gè)整體。
我們需要數(shù)據(jù)庫(kù)集群計(jì)算環(huán)境的強(qiáng)一致性,強(qiáng)一致性讀寫分離的實(shí)現(xiàn)方式主要有以下幾種:
- 第一種模式:多實(shí)例共享存儲(chǔ)+緩沖區(qū)融合的讀寫分離:多個(gè)讀寫分離的數(shù)據(jù)庫(kù)實(shí)例共用一套存儲(chǔ)數(shù)據(jù),只有主實(shí)例支持讀寫,其他實(shí)例均為只讀。對(duì)于未寫盤的臟塊,直接從主實(shí)例的緩沖區(qū)中獲得。這種實(shí)現(xiàn)方式比ORACLE RAC的多主模式實(shí)現(xiàn)起來(lái)要簡(jiǎn)單一些;
- 第二種模式:多實(shí)例共享存儲(chǔ)+WAL APPLY:和第一種模式類似,采用一主多從模式,主實(shí)例可讀寫,其他實(shí)例只讀。不同的是,多實(shí)例之間是完全獨(dú)立的,不通過(guò)緩沖區(qū)融合來(lái)保證讀寫一致性,而是通過(guò)在備用實(shí)例上重演WAL數(shù)據(jù)來(lái)確保讀寫一致性。這種模式比第一種模式的優(yōu)點(diǎn)是主從實(shí)例之間完全是獨(dú)立的,互相的影響不大,只要底層存儲(chǔ)支撐得住,從節(jié)點(diǎn)的數(shù)量多一點(diǎn)也問(wèn)題不大。缺點(diǎn)是如果主實(shí)例存在大量的寫操作,那么從實(shí)例的重演可能會(huì)產(chǎn)生一定的延時(shí)。Polardb-PG就是采用這種模式的一個(gè)例子;
- 第三種模式是多實(shí)例存儲(chǔ)復(fù)制+WAL APPLY:為了防止底層存儲(chǔ)的IO性能達(dá)到極限,從底層實(shí)現(xiàn)存儲(chǔ)的同步/半同步自動(dòng)復(fù)制,確保多個(gè)存儲(chǔ)副本之間的數(shù)據(jù)一致性。不同的實(shí)例可以使用獨(dú)立的副本,或者某幾個(gè)有限的實(shí)例共享一個(gè)獨(dú)立的副本。其他的實(shí)現(xiàn)方式和第二種模式類似,這是第二種模式的變種方案。亞馬遜的AURORA DB CLUSTER就是這種模式的典型案例;
- 第四種模式是多實(shí)例非共享存儲(chǔ)0數(shù)據(jù)丟失復(fù)制:主從實(shí)例是完全獨(dú)立的數(shù)據(jù)庫(kù),在存儲(chǔ)底層確保WAL數(shù)據(jù)自動(dòng)實(shí)現(xiàn)無(wú)損復(fù)制,確保已經(jīng)提交的事務(wù)的WAL文件能夠復(fù)制到從庫(kù)。從庫(kù)通過(guò)日志重演確保與主庫(kù)的同步或者半同步。
實(shí)際上,以目前的數(shù)據(jù)庫(kù)與分布式數(shù)據(jù)庫(kù)技術(shù),實(shí)現(xiàn)上述的四種模式,在技術(shù)上并沒(méi)有不可逾越的難關(guān),最關(guān)鍵的是需要從數(shù)據(jù)庫(kù)SQL引擎、存儲(chǔ)引擎、緩沖區(qū)管理、DB WRITER、WAL WRITER等核心組件上到操作系統(tǒng)、存儲(chǔ)系統(tǒng)、網(wǎng)絡(luò)實(shí)現(xiàn)全棧貫通的設(shè)計(jì)和優(yōu)化,使之成為一體化的數(shù)據(jù)庫(kù)設(shè)計(jì),而不是把一堆組件做簡(jiǎn)單的集成。這種一體化的設(shè)計(jì)與實(shí)現(xiàn),才能夠從整體上實(shí)現(xiàn)最優(yōu)處理,自動(dòng)處置各種異常,并自動(dòng)進(jìn)行相關(guān)的容錯(cuò)處理,從而確保數(shù)據(jù)庫(kù)提供的強(qiáng)一致性讀寫、故障切換、故障數(shù)據(jù)修復(fù)等都是能夠根據(jù)數(shù)據(jù)庫(kù)底層模塊自動(dòng)完成的,而不是需要運(yùn)維人員或者應(yīng)用開(kāi)發(fā)商去做相關(guān)的處理的。甚至今后在SQL執(zhí)行算子方面實(shí)現(xiàn)下推,實(shí)現(xiàn)某些計(jì)算場(chǎng)景跨數(shù)據(jù)庫(kù)實(shí)例的并行計(jì)算。
這種計(jì)算框架可以解決一些當(dāng)前集中式數(shù)據(jù)庫(kù)中比較麻煩的問(wèn)題。比如大型數(shù)據(jù)庫(kù)表分析時(shí)產(chǎn)生的大量IO導(dǎo)致的系統(tǒng)性能問(wèn)題。在這種計(jì)算框架下,可以按照下面的方式實(shí)現(xiàn)集群計(jì)算。
當(dāng)表分析任務(wù)發(fā)起后,主庫(kù)分解分布式計(jì)算的任務(wù),通過(guò)消息隊(duì)列分發(fā)任務(wù)給各多個(gè)從庫(kù),由從庫(kù)完成實(shí)際的計(jì)算任務(wù),再把結(jié)果發(fā)送給主庫(kù),由主庫(kù)統(tǒng)一入庫(kù)。再通過(guò)復(fù)制技術(shù)分發(fā)到各個(gè)從庫(kù)。
如果是十多年前,當(dāng)硬件處理能力、分布式復(fù)制技術(shù)等還沒(méi)有發(fā)展到今天的時(shí)候,集中式數(shù)據(jù)庫(kù)的設(shè)計(jì)可能不會(huì)向這個(gè)方向去考慮,不過(guò)隨著這些年軟硬件與分布式計(jì)算框架的高速發(fā)展,我們的集中式數(shù)據(jù)庫(kù)的架構(gòu)設(shè)計(jì)是不是也可以脫離開(kāi)已經(jīng)使用了幾十年的老方案,嘗試一些適合現(xiàn)代軟硬件技術(shù)的新的方案呢?
實(shí)際上Oracle GDS也不是原生態(tài)的集群計(jì)算框架,是集成了ADG、OGG、ONS、FAN、ADG FAR SYNC等技術(shù)基礎(chǔ)上逐步發(fā)展起來(lái)的集成計(jì)算框架。不過(guò)從GDS我們也可以看出,集中式數(shù)據(jù)庫(kù)完全可以從單打獨(dú)斗模式過(guò)渡到了集群計(jì)算的新模式了。
實(shí)際上,集群計(jì)算模式在開(kāi)源社區(qū)的發(fā)展也很迅速,MYSQL MGR就是一種典型的集群計(jì)算架構(gòu)。只是目前的大多數(shù)集群計(jì)算架構(gòu)大多數(shù)是以數(shù)據(jù)庫(kù)與服務(wù)組件集成的方式組建的,并不是基于數(shù)據(jù)庫(kù)原生態(tài)設(shè)計(jì)的,沒(méi)有形成硬件、操作系統(tǒng)、數(shù)據(jù)庫(kù)內(nèi)核、服務(wù)網(wǎng)關(guān)的一體化設(shè)計(jì),因此在應(yīng)用上還需要大量的工程化的實(shí)施工作,運(yùn)行時(shí)也還需要對(duì)整個(gè)集群進(jìn)行監(jiān)控和調(diào)整,無(wú)法像一個(gè)數(shù)據(jù)庫(kù)一樣一體化部署和一體化運(yùn)行。
實(shí)際上我們完全可以從數(shù)據(jù)庫(kù)底層開(kāi)始一體化設(shè)計(jì)一個(gè)支持集群計(jì)算框架的集中式數(shù)據(jù)庫(kù)系統(tǒng),將現(xiàn)有集群計(jì)算的工程化工作變得十分簡(jiǎn)化,這種基于集群計(jì)算架構(gòu)的集中式數(shù)據(jù)庫(kù)在技術(shù)實(shí)現(xiàn)上會(huì)比分布式數(shù)據(jù)庫(kù)簡(jiǎn)單不少,而其使用效果肯定也是相當(dāng)不錯(cuò)的。