數(shù)據(jù)存儲(chǔ) - 分庫(kù)與分表帶來(lái)的分布式困境與應(yīng)對(duì)之策

學(xué)習(xí)完整課程請(qǐng)移步 互聯(lián)網(wǎng) Java 全棧工程師

數(shù)據(jù)遷移與擴(kuò)容問(wèn)題

前面介紹到水平分表策略歸納總結(jié)為隨機(jī)分表和連續(xù)分表兩種情況。連續(xù)分表有可能存在數(shù)據(jù)熱點(diǎn)的問(wèn)題,有些表可能會(huì)被頻繁地查詢從而造成較大壓力,熱數(shù)據(jù)的表就成為了整個(gè)庫(kù)的瓶頸,而有些表可能存的是歷史數(shù)據(jù),很少需要被查詢到。連續(xù)分表的另外一個(gè)好處在于比較容易,不需要考慮遷移舊的數(shù)據(jù),只需要添加分表就可以自動(dòng)擴(kuò)容。隨機(jī)分表的數(shù)據(jù)相對(duì)比較均勻,不容易出現(xiàn)熱點(diǎn)和并發(fā)訪問(wèn)的瓶頸。但是,分表擴(kuò)展需要遷移舊的數(shù)據(jù)。

針對(duì)于水平分表的設(shè)計(jì)至關(guān)重要,需要評(píng)估中短期內(nèi)業(yè)務(wù)的增長(zhǎng)速度,對(duì)當(dāng)前的數(shù)據(jù)量進(jìn)行容量規(guī)劃,綜合成本因素,推算出大概需要多少分片。對(duì)于數(shù)據(jù)遷移的問(wèn)題,一般做法是通過(guò)程序先讀出數(shù)據(jù),然后按照指定的分表策略再將數(shù)據(jù)寫入到各個(gè)分表中。

表關(guān)聯(lián)問(wèn)題

在單庫(kù)單表的情況下,聯(lián)合查詢是非常容易的。但是,隨著分庫(kù)與分表的演變,聯(lián)合查詢就遇到跨庫(kù)關(guān)聯(lián)和跨表關(guān)系問(wèn)題。在設(shè)計(jì)之初就應(yīng)該盡量避免聯(lián)合查詢,可以通過(guò)程序中進(jìn)行拼裝,或者通過(guò)反范式化設(shè)計(jì)進(jìn)行規(guī)避。

分頁(yè)與排序問(wèn)題

一般情況下,列表分頁(yè)時(shí)需要按照指定字段進(jìn)行排序。在單庫(kù)單表的情況下,分頁(yè)和排序也是非常容易的。但是,隨著分庫(kù)與分表的演變,也會(huì)遇到跨庫(kù)排序和跨表排序問(wèn)題。為了最終結(jié)果的準(zhǔn)確性,需要在不同的分表中將數(shù)據(jù)進(jìn)行排序并返回,并將不同分表返回的結(jié)果集進(jìn)行匯總和再次排序,最后再返回給用戶。

分布式事務(wù)問(wèn)題

隨著分庫(kù)與分表的演變,一定會(huì)遇到分布式事務(wù)問(wèn)題,那么如何保證數(shù)據(jù)的一致性就成為一個(gè)必須面對(duì)的問(wèn)題。目前,分布式事務(wù)并沒(méi)有很好的解決方案,難以滿足數(shù)據(jù)強(qiáng)一致性,一般情況下,使存儲(chǔ)數(shù)據(jù)盡可能達(dá)到用戶一致,保證系統(tǒng)經(jīng)過(guò)一段較短的時(shí)間的自我恢復(fù)和修正,數(shù)據(jù)最終達(dá)到一致。

分布式全局唯一 ID

在單庫(kù)單表的情況下,直接使用數(shù)據(jù)庫(kù)自增特性來(lái)生成主鍵ID,這樣確實(shí)比較簡(jiǎn)單。在分庫(kù)分表的環(huán)境中,數(shù)據(jù)分布在不同的分表上,不能再借助數(shù)據(jù)庫(kù)自增長(zhǎng)特性。需要使用全局唯一 ID,例如 UUID、GUID等。關(guān)于如何選擇合適的全局唯一 ID,我會(huì)在后面的章節(jié)中進(jìn)行介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容