1.擴容與縮容
這個是你必須面對的一個事兒限煞,就是你已經(jīng)弄好分庫分表方案了撮抓,然后一堆庫和表都建好了棋电,基于分庫分表中間件的代碼開發(fā)啥的都好了振劳,測試都ok了昭伸,數(shù)據(jù)能均勻分布到各個庫和各個表里去,而且接著你還通過雙寫的方案咔嚓一下上了系統(tǒng)澎迎,已經(jīng)直接基于分庫分表方案在搞了庐杨。
那么現(xiàn)在問題來了选调,你現(xiàn)在這些庫和表又支撐不住了,要繼續(xù)擴容咋辦灵份?這個可能就是說你的每個庫的容量又快滿了仁堪,或者是你的表數(shù)據(jù)量又太大了,也可能是你每個庫的寫并發(fā)太高了填渠,你得繼續(xù)擴容弦聂。
縮容就是現(xiàn)在業(yè)務不景氣了,數(shù)據(jù)量減少氛什,并發(fā)量下降莺葫,那么不能讓他占著太多的數(shù)據(jù)庫啊,肯定要進行縮容枪眉。
2.停機擴容
①原理
這個方案就跟停機遷移一樣捺檬,步驟幾乎一致,唯一的一點就是那個導數(shù)的工具贸铜,是把現(xiàn)有庫表的數(shù)據(jù)抽出來慢慢倒入到新的庫和表里去堡纬。但是最好別這么玩兒,有點不太靠譜蒿秦,因為既然分庫分表就說明數(shù)據(jù)量實在是太大了烤镐,可能多達幾億條,甚至幾十億棍鳖,你這么玩兒炮叶,可能會出問題。
從單庫單表遷移到分庫分表的時候渡处,數(shù)據(jù)量并不是很大悴灵,單表最大也就兩三千萬。寫個工具骂蓖,多弄幾臺機器并行跑积瞒,1小時數(shù)據(jù)就導完了
如果經(jīng)過分庫分表之后,那么數(shù)據(jù)量肯定會非常大登下,那么這種方案的耗時會太長茫孔。
3.優(yōu)雅設計擴容縮容
優(yōu)雅的設計擴容縮容的意思就是 進行擴容縮容的代價要小,遷移數(shù)據(jù)要快被芳。
可以采用邏輯分庫分表的方式來代替物理分庫分表的方式缰贝,要擴容縮容時,只需要將邏輯上的數(shù)據(jù)庫畔濒、表改為物理上的數(shù)據(jù)庫剩晴、表。
第一次進行分庫分表時就多分幾個庫,一個實踐是利用32 * 32來分庫分表赞弥,即分為32個庫毅整,每個庫32張表,一共就是1024張表绽左,根據(jù)某個id先根據(jù)先根據(jù)數(shù)據(jù)庫數(shù)量32取模路由到庫悼嫉,再根據(jù)一個庫的表數(shù)量32取模路由到表里面。
剛開始的時候拼窥,這個庫可能就是邏輯庫戏蔑,建在一個mysql服務上面,比如一個mysql服務器建了16個數(shù)據(jù)庫鲁纠。
如果后面要進行拆分总棵,就是不斷的在庫和mysql實例之間遷移就行了。將mysql服務器的庫搬到另外的一個服務器上面去改含,比如每個服務器創(chuàng)建8個庫情龄,這樣就由兩臺mysql服務器變成了4臺mysql服務器。我們系統(tǒng)只需要配置一下新增的兩臺服務器即可候味。
比如說最多可以擴展到32個數(shù)據(jù)庫服務器,每個數(shù)據(jù)庫服務器是一個庫隔心。如果還是不夠白群?最多可以擴展到1024個數(shù)據(jù)庫服務器,每個數(shù)據(jù)庫服務器上面一個庫一個表硬霍。因為最多是1024個表么帜慢。
這么搞,是不用自己寫代碼做數(shù)據(jù)遷移的唯卖,都交給dba來搞好了粱玲,但是dba確實是需要做一些庫表遷移的工作,但是總比你自己寫代碼拜轨,抽數(shù)據(jù)導數(shù)據(jù)來的效率高得多了抽减。
哪怕是要減少庫的數(shù)量,也很簡單橄碾,其實說白了就是按倍數(shù)縮容就可以了卵沉,然后修改一下路由規(guī)則。
②分庫分表路由規(guī)則
對庫可以進行根據(jù)庫的數(shù)量取模決定庫的路由法牲。
對表可以先根據(jù)表的數(shù)量進行整除史汗,然后將結果再對表的數(shù)量進行取模,這樣可以跟均勻的分布拒垃。
③過程
1停撞、設定好幾臺數(shù)據(jù)庫服務器,每臺服務器上幾個庫悼瓮,每個庫多少個表戈毒,推薦是32庫 * 32表艰猬,對于大部分公司來說,可能幾年都夠了
2副硅、路由的規(guī)則姥宝,orderId 模 32 = 庫,orderId / 32 模 32 = 表
3恐疲、擴容的時候腊满,申請增加更多的數(shù)據(jù)庫服務器,裝好mysql培己,倍數(shù)擴容碳蛋,4臺服務器,擴到8臺服務器省咨,16臺服務器
4肃弟、由dba負責將原先數(shù)據(jù)庫服務器的庫,遷移到新的數(shù)據(jù)庫服務器上去零蓉,很多工具笤受,庫遷移,比較便捷
5敌蜂、我們這邊就是修改一下配置箩兽,調整遷移的庫所在數(shù)據(jù)庫服務器的地址
6、重新發(fā)布系統(tǒng)章喉,上線汗贫,原先的路由規(guī)則變都不用變,直接可以基于2倍的數(shù)據(jù)庫服務器的資源秸脱,繼續(xù)進行線上系統(tǒng)的提供服務