1.擴(kuò)容與縮容
這個(gè)是你必須面對(duì)的一個(gè)事兒,就是你已經(jīng)弄好分庫(kù)分表方案了,然后一堆庫(kù)和表都建好了,基于分庫(kù)分表中間件的代碼開發(fā)啥的都好了,測(cè)試都o(jì)k了,數(shù)據(jù)能均勻分布到各個(gè)庫(kù)和各個(gè)表里去,而且接著你還通過雙寫的方案咔嚓一下上了系統(tǒng),已經(jīng)直接基于分庫(kù)分表方案在搞了。
那么現(xiàn)在問題來了,你現(xiàn)在這些庫(kù)和表又支撐不住了,要繼續(xù)擴(kuò)容咋辦?這個(gè)可能就是說你的每個(gè)庫(kù)的容量又快滿了,或者是你的表數(shù)據(jù)量又太大了,也可能是你每個(gè)庫(kù)的寫并發(fā)太高了,你得繼續(xù)擴(kuò)容。
縮容就是現(xiàn)在業(yè)務(wù)不景氣了,數(shù)據(jù)量減少,并發(fā)量下降,那么不能讓他占著太多的數(shù)據(jù)庫(kù)啊,肯定要進(jìn)行縮容。
2.停機(jī)擴(kuò)容
①原理
這個(gè)方案就跟停機(jī)遷移一樣,步驟幾乎一致,唯一的一點(diǎn)就是那個(gè)導(dǎo)數(shù)的工具,是把現(xiàn)有庫(kù)表的數(shù)據(jù)抽出來慢慢倒入到新的庫(kù)和表里去。但是最好別這么玩兒,有點(diǎn)不太靠譜,因?yàn)榧热环謳?kù)分表就說明數(shù)據(jù)量實(shí)在是太大了,可能多達(dá)幾億條,甚至幾十億,你這么玩兒,可能會(huì)出問題。
從單庫(kù)單表遷移到分庫(kù)分表的時(shí)候,數(shù)據(jù)量并不是很大,單表最大也就兩三千萬。寫個(gè)工具,多弄幾臺(tái)機(jī)器并行跑,1小時(shí)數(shù)據(jù)就導(dǎo)完了
如果經(jīng)過分庫(kù)分表之后,那么數(shù)據(jù)量肯定會(huì)非常大,那么這種方案的耗時(shí)會(huì)太長(zhǎng)。
3.優(yōu)雅設(shè)計(jì)擴(kuò)容縮容
優(yōu)雅的設(shè)計(jì)擴(kuò)容縮容的意思就是 進(jìn)行擴(kuò)容縮容的代價(jià)要小,遷移數(shù)據(jù)要快。
可以采用邏輯分庫(kù)分表的方式來代替物理分庫(kù)分表的方式,要擴(kuò)容縮容時(shí),只需要將邏輯上的數(shù)據(jù)庫(kù)、表改為物理上的數(shù)據(jù)庫(kù)、表。
第一次進(jìn)行分庫(kù)分表時(shí)就多分幾個(gè)庫(kù),一個(gè)實(shí)踐是利用32 * 32來分庫(kù)分表,即分為32個(gè)庫(kù),每個(gè)庫(kù)32張表,一共就是1024張表,根據(jù)某個(gè)id先根據(jù)先根據(jù)數(shù)據(jù)庫(kù)數(shù)量32取模路由到庫(kù),再根據(jù)一個(gè)庫(kù)的表數(shù)量32取模路由到表里面。
剛開始的時(shí)候,這個(gè)庫(kù)可能就是邏輯庫(kù),建在一個(gè)mysql服務(wù)上面,比如一個(gè)mysql服務(wù)器建了16個(gè)數(shù)據(jù)庫(kù)。
如果后面要進(jìn)行拆分,就是不斷的在庫(kù)和mysql實(shí)例之間遷移就行了。將mysql服務(wù)器的庫(kù)搬到另外的一個(gè)服務(wù)器上面去,比如每個(gè)服務(wù)器創(chuàng)建8個(gè)庫(kù),這樣就由兩臺(tái)mysql服務(wù)器變成了4臺(tái)mysql服務(wù)器。我們系統(tǒng)只需要配置一下新增的兩臺(tái)服務(wù)器即可。
比如說最多可以擴(kuò)展到32個(gè)數(shù)據(jù)庫(kù)服務(wù)器,每個(gè)數(shù)據(jù)庫(kù)服務(wù)器是一個(gè)庫(kù)。如果還是不夠?最多可以擴(kuò)展到1024個(gè)數(shù)據(jù)庫(kù)服務(wù)器,每個(gè)數(shù)據(jù)庫(kù)服務(wù)器上面一個(gè)庫(kù)一個(gè)表。因?yàn)樽疃嗍?024個(gè)表么。
這么搞,是不用自己寫代碼做數(shù)據(jù)遷移的,都交給dba來搞好了,但是dba確實(shí)是需要做一些庫(kù)表遷移的工作,但是總比你自己寫代碼,抽數(shù)據(jù)導(dǎo)數(shù)據(jù)來的效率高得多了。
哪怕是要減少庫(kù)的數(shù)量,也很簡(jiǎn)單,其實(shí)說白了就是按倍數(shù)縮容就可以了,然后修改一下路由規(guī)則。
②分庫(kù)分表路由規(guī)則
對(duì)庫(kù)可以進(jìn)行根據(jù)庫(kù)的數(shù)量取模決定庫(kù)的路由。
對(duì)表可以先根據(jù)表的數(shù)量進(jìn)行整除,然后將結(jié)果再對(duì)表的數(shù)量進(jìn)行取模,這樣可以跟均勻的分布。
③過程
1、設(shè)定好幾臺(tái)數(shù)據(jù)庫(kù)服務(wù)器,每臺(tái)服務(wù)器上幾個(gè)庫(kù),每個(gè)庫(kù)多少個(gè)表,推薦是32庫(kù) * 32表,對(duì)于大部分公司來說,可能幾年都?jí)蛄?/p>
2、路由的規(guī)則,orderId 模 32 = 庫(kù),orderId / 32 模 32 = 表
3、擴(kuò)容的時(shí)候,申請(qǐng)?jiān)黾痈嗟臄?shù)據(jù)庫(kù)服務(wù)器,裝好mysql,倍數(shù)擴(kuò)容,4臺(tái)服務(wù)器,擴(kuò)到8臺(tái)服務(wù)器,16臺(tái)服務(wù)器
4、由dba負(fù)責(zé)將原先數(shù)據(jù)庫(kù)服務(wù)器的庫(kù),遷移到新的數(shù)據(jù)庫(kù)服務(wù)器上去,很多工具,庫(kù)遷移,比較便捷
5、我們這邊就是修改一下配置,調(diào)整遷移的庫(kù)所在數(shù)據(jù)庫(kù)服務(wù)器的地址
6、重新發(fā)布系統(tǒng),上線,原先的路由規(guī)則變都不用變,直接可以基于2倍的數(shù)據(jù)庫(kù)服務(wù)器的資源,繼續(xù)進(jìn)行線上系統(tǒng)的提供服務(wù)