?分布式數(shù)據(jù)庫(kù),無疑是近些年來數(shù)據(jù)庫(kù)領(lǐng)域的重大技術(shù)進(jìn)步。越來越多的用戶考慮將傳統(tǒng)集中式或單機(jī)數(shù)據(jù)庫(kù),遷移到分布式數(shù)據(jù)庫(kù)。然而,正如同其他新技術(shù)一樣,使用分布式數(shù)據(jù)庫(kù)同樣面臨一定的使用門檻。如何平滑地遷移到這一新架構(gòu),享受新架構(gòu)帶來的優(yōu)勢(shì)的同時(shí),還需規(guī)避潛在的劣勢(shì)。盡管很多分布式數(shù)據(jù)庫(kù)產(chǎn)品,正努力降低使用門檻,讓用戶近似傳統(tǒng)數(shù)據(jù)庫(kù)的體驗(yàn)去使用它,但這一過程仍面臨諸多問題。此外,要想更好地使用分布式數(shù)據(jù)庫(kù),是需要其實(shí)現(xiàn)細(xì)節(jié)有著更多的了解。本文,嘗試從研發(fā)角度談?wù)劊绾紊鲜址植际綌?shù)據(jù)庫(kù),針對(duì)常見的如何做表分片、如何選擇分片鍵等問題加以描述。為了降低過程難度,結(jié)合之前在項(xiàng)目實(shí)施中的一點(diǎn)經(jīng)驗(yàn),自己也嘗試編寫工具來方便遷移分析。
1. 分布式數(shù)據(jù)庫(kù)設(shè)計(jì)要點(diǎn)
1).選擇分片對(duì)象
分布式數(shù)據(jù)庫(kù)設(shè)計(jì)的第一個(gè)要點(diǎn),就是選擇需分片的對(duì)象。這其中需考慮幾個(gè)問題:
數(shù)據(jù)規(guī)模
一般來說,選擇分布式數(shù)據(jù)庫(kù)的常見原因之一就是原有數(shù)據(jù)庫(kù)容量不足,通過分布式架構(gòu)存儲(chǔ)更多的數(shù)據(jù)。因此,大數(shù)據(jù)量的表是優(yōu)先采用分片設(shè)計(jì)的首要理由。當(dāng)然,也存在些特例情況,如表雖然規(guī)模很大,但無法明確使用到部分?jǐn)?shù)據(jù)或數(shù)據(jù)不經(jīng)常使用等,也可考慮使用數(shù)據(jù)分析或大數(shù)據(jù)平臺(tái)。
熱點(diǎn)表
還有一種常見的的情況是表雖然不大,但非常熱,在單機(jī)或集中式架構(gòu)下成為熱點(diǎn),存在性能擴(kuò)展的瓶頸。這種情況下,也適合采用分片方式將其分而治之。
管理需求
第三種情況是有些表有著管理需求,如歸檔、清理、備份等,也可以通過分片設(shè)計(jì)更精準(zhǔn)地滿足此類需求。
誤區(qū):所有表都需要分片
在分布式數(shù)據(jù)庫(kù)下,是否是所有對(duì)象都需要分片呢?答案是否定的。當(dāng)表采用分片化設(shè)計(jì)后,在享受到分片帶來的收益的同時(shí),勢(shì)必也會(huì)有損失。如數(shù)據(jù)庫(kù)約束會(huì)受到限制、數(shù)據(jù)表訪問存在約束、數(shù)據(jù)庫(kù)結(jié)構(gòu)變更更為復(fù)雜等。因此,在分布式數(shù)據(jù)庫(kù)下仍可考慮采用“單表”設(shè)計(jì)。此時(shí),就需要考慮如存儲(chǔ)位置(單片或廣播)等。
2).選擇分片鍵
當(dāng)確定了哪些表采用分片設(shè)計(jì)后,后面的問題就是確定每個(gè)表的分片鍵如何選擇?這往往也是分布式改造中最難取舍的地方。因?yàn)?,分布式?shù)據(jù)庫(kù)下,數(shù)據(jù)只能按照一種方式分布。數(shù)據(jù)分布的方式主要就是由分片鍵字段和選擇的分片算法來確定。因此,選擇一個(gè)最具有代表意義的字段最為分片鍵尤為重要。而選擇依據(jù)主要是看表是如何被訪問的及字段的數(shù)據(jù)特征,根據(jù)多種因素綜合考慮。當(dāng)表按照某種分片邏輯拆分后,其他無法使用該拆分邏輯進(jìn)行的訪問又該如何處理呢?這是可考慮如異構(gòu)二級(jí)索引、冗余對(duì)象等方式來解決了。下文介紹的小工具,就是從SQL語(yǔ)句的角度分析潛在的劃分依據(jù),供設(shè)計(jì)者參考。后面將詳細(xì)展開說明。
3).關(guān)聯(lián)對(duì)象設(shè)計(jì)
當(dāng)表確定了分片方式后,其關(guān)聯(lián)對(duì)象需同步進(jìn)行設(shè)計(jì)。這里面設(shè)計(jì)包括:
約束
在分布式架構(gòu)下,傳統(tǒng)的約束會(huì)受到很大限制,這其中包括主鍵、外鍵、非空、唯一、檢查五類。很多分布式數(shù)據(jù)庫(kù)不再支持上面這些約束中的部分。這時(shí)就需在設(shè)計(jì)時(shí)有所考慮,將約束能力上移到應(yīng)用側(cè)去解決。
索引
索引,是優(yōu)化數(shù)據(jù)庫(kù)訪問最常用的手段之一。在分布式架構(gòu)下,索引能力同樣有所限制。一般來說,若索引字段前綴包含分片字段,還可以支持;否則,只能通過異構(gòu)索引方式來實(shí)現(xiàn)。可簡(jiǎn)單理解為,分布式架構(gòu)下的索引就是按照另一種方式存儲(chǔ)的分片表。當(dāng)然,過多的索引在分布式架構(gòu)下,開銷也是很大的。因此,因分布式架構(gòu)下分片內(nèi)的數(shù)據(jù)已經(jīng)有限,某些索引是可以考慮不再創(chuàng)建。
序列
序列,主要是為了滿足唯一性或自增類需求的。這一能力在單機(jī)或集中式架構(gòu)下比較簡(jiǎn)單,在分布式架構(gòu)下通??煽紤]用“分布式ID”的方式實(shí)現(xiàn)。功能上較之前還是有所限制,特別是自增需求。有些分布式數(shù)據(jù)庫(kù)雖然支持,但性能也會(huì)較差。
視圖
一般來說,分布式數(shù)據(jù)庫(kù)支持簡(jiǎn)單視圖,對(duì)于復(fù)雜視圖來說則各有差異。此外,需要注意的是優(yōu)化器的差異。針對(duì)視圖類的優(yōu)化,是比較考驗(yàn)優(yōu)化器能力的,這點(diǎn)各家產(chǎn)品差異較大。
庫(kù)內(nèi)計(jì)算(存儲(chǔ)過程、函數(shù)、觸發(fā)器等)
針對(duì)庫(kù)內(nèi)計(jì)算,是單機(jī)或集中式數(shù)據(jù)庫(kù)的一大優(yōu)勢(shì)。離數(shù)據(jù)越近的運(yùn)算,其效率往往也越高,但對(duì)于分布式數(shù)據(jù)庫(kù),存在較大技術(shù)難點(diǎn)。目前行業(yè)內(nèi),能較完美地支持分布式架構(gòu)下的庫(kù)內(nèi)計(jì)算,尚有不小的差距。建議還是在應(yīng)用側(cè)去解決。
4).關(guān)聯(lián)語(yǔ)句驗(yàn)證
在做好上述分片設(shè)計(jì)后,很重要的一步就是要驗(yàn)證上面設(shè)計(jì)是否滿足需要。驗(yàn)證的方式就是將對(duì)象關(guān)聯(lián)的語(yǔ)句提取出來,分析在分布式條件下的運(yùn)行情況。這里包括語(yǔ)法是否支持、語(yǔ)義是否等價(jià)、效率是否有保障?若上述驗(yàn)證不滿足預(yù)期,就需要考慮做出調(diào)整。有些可通過改寫方式解決,有些更為復(fù)雜情況可能需考慮在應(yīng)用側(cè)甚至架構(gòu)層面來解決。這一過程也是很多分布式改造的痛點(diǎn),存在大量驗(yàn)證過程。
5).其他需考慮因素
除去上述要點(diǎn)外,還有其他因素值得關(guān)注:
分區(qū)表情況
在傳統(tǒng)數(shù)據(jù)庫(kù)中,應(yīng)對(duì)海量數(shù)據(jù)規(guī)模的有效手段之一就是分區(qū)。是否在分片條件下仍然使用分區(qū),是需要綜合考慮的。原則上來講,數(shù)據(jù)經(jīng)過分片設(shè)計(jì),已經(jīng)減少處理規(guī)模,分區(qū)必要性有所降低,要綜合考慮。
復(fù)雜計(jì)算情況
分布式架構(gòu)下,有些計(jì)算是無法下推到分片內(nèi)完成的,這就需要提取分片數(shù)據(jù),匯聚后計(jì)算。這對(duì)于上面的計(jì)算層的壓力較大,也會(huì)造成很大的資源開銷。這點(diǎn)要關(guān)注到分布式數(shù)據(jù)庫(kù)的處理邏輯,驗(yàn)證其這方面能力如何。
數(shù)據(jù)分析需求
針對(duì)數(shù)據(jù)分析類需求,很多分布式數(shù)據(jù)庫(kù)考慮到這點(diǎn),引入諸如HTAP方向的技術(shù)能力來解決。有此類需求的場(chǎng)景,需重點(diǎn)驗(yàn)證。
2. 工具實(shí)踐:分片設(shè)計(jì)輔助分析
如上面闡述,在分布式數(shù)據(jù)庫(kù)改造中,選擇需分片的表、確定分片字段及方式是非常重要的環(huán)節(jié)。之前在不少客戶實(shí)施過程中,這一過程較為繁瑣。雖然通過用戶培訓(xùn),能夠了解原理上手設(shè)計(jì),但在實(shí)操中如何從紛繁復(fù)雜的運(yùn)行環(huán)境中找到要點(diǎn),在眾多可能選擇中選出相對(duì)較優(yōu)仍比較困難。為解決上述問題,自己嘗試通過工具解決上述痛點(diǎn),降低遷移難度、減少工作量。其原理是以運(yùn)行環(huán)境中SQL為輸入,通過解析SQL語(yǔ)句,找到業(yè)務(wù)核心對(duì)象及使用方式;再關(guān)聯(lián)數(shù)據(jù)字典提取數(shù)據(jù)特征,方便設(shè)計(jì)者快速做出選擇且不遺漏重要信息。下面根據(jù)工具輸出,簡(jiǎn)單介紹下,感興趣者可與我私聊。
1).輸出解讀
概覽信息
此部分主要為概覽性信息,主要包括數(shù)據(jù)庫(kù)及分析語(yǔ)句。
此部分為收集數(shù)據(jù)庫(kù)信息。目前支持MySQL,其他數(shù)據(jù)庫(kù)可擴(kuò)展支持。
此部分為分析SQL文本。根據(jù)輸入,可能為多條。
設(shè)計(jì)參考
此部分是根據(jù)輸入的SQL語(yǔ)句,提取出表。根據(jù)數(shù)據(jù)字典信息提取表的統(tǒng)計(jì)信息。這里需重點(diǎn)關(guān)注表大小。如上面所說,表大小分片設(shè)計(jì)的考慮因素之一。小規(guī)模的表,是可以考慮設(shè)計(jì)為單表或廣播表。
此部分是根據(jù)數(shù)據(jù)表,提取索引信息。這些原有的索引設(shè)計(jì),可作為后續(xù)分片設(shè)計(jì)的參考之一。此外,分片情況下索引代價(jià)過大,也可根據(jù)此信息做取舍設(shè)計(jì)。
此部分根據(jù)SQL語(yǔ)句解析結(jié)果,提取關(guān)聯(lián)或過濾謂詞;并進(jìn)一步將謂詞左右的字段及字段數(shù)據(jù)特征顯示出來。這些提取出的字段,可作為分片鍵字段選擇的重要參考依據(jù)。其對(duì)應(yīng)的數(shù)據(jù)類型、是否為空、基數(shù)及使用它的謂詞,可方便設(shè)計(jì)者快速?zèng)Q策。
2).使用建議
工具使用上,可依據(jù)如下步驟:
提取業(yè)務(wù)SQL??赏ㄟ^系統(tǒng)日志、數(shù)據(jù)庫(kù)日志等,提取業(yè)務(wù)SQL,作為工具輸入。提取的SQL需真實(shí)反應(yīng)線上情況,不遺漏重要的業(yè)務(wù)SQL。
分析業(yè)務(wù)SQL。通過工具分析提取SQL,獲取輸出報(bào)告。
輔助設(shè)計(jì)。得到報(bào)告后,可根據(jù)數(shù)據(jù)量定位待分片表;根據(jù)表字段及謂詞字段,確定分片鍵的范圍;根據(jù)前面信息和索引,做出初步的設(shè)計(jì)決策。
驗(yàn)證設(shè)計(jì)。根據(jù)初步的設(shè)計(jì)結(jié)果,在分布式環(huán)境下驗(yàn)證上述設(shè)計(jì),判斷是否滿足之前提到的語(yǔ)法、語(yǔ)義及性能。
3).增強(qiáng)改進(jìn)
這一工具,目前僅考慮到SQL文本,未來可增加對(duì)runtime信息的捕獲能力,可更為準(zhǔn)確描述業(yè)務(wù)負(fù)載。從上述信息中增加對(duì)不同語(yǔ)句權(quán)重,為后續(xù)設(shè)計(jì)判斷提供更為豐富的依據(jù)。?