業(yè)務(wù)系統(tǒng)不停服拆庫

背景
一般來說,單mysql的寫入瓶頸在3000-5000條每秒寞酿,讀qps在3w-10w。單表的存儲極限在2000w條脱柱,全庫的極限在4-5億條伐弹。
我們在構(gòu)建一個新業(yè)務(wù)時,會評估這個業(yè)務(wù)的總體數(shù)據(jù)量榨为,讀寫高峰請求量等等惨好。大多數(shù)時候,對于to B業(yè)務(wù)柠逞,單庫單表策略昧狮,是可以滿足需求的;對于to C業(yè)務(wù)板壮,單庫分表策略一般也足夠了逗鸣。
用數(shù)據(jù)庫去抗特別大的用戶流量,往往都不是一個好的設(shè)計绰精,一般都是通過增加redis/memcache/localCache的緩存層來解決撒璧。
但對于一些比較特殊的業(yè)務(wù),比如涉及到金錢的笨使,對一致性要求特別高的業(yè)務(wù)卿樱,如果這個時候使用緩存的策略,就非常容易產(chǎn)生不一致的問題硫椰,雖然也有一些辦法可以解決繁调,但復(fù)雜性比較高,而且往往會有一些意想不到的坑靶草。這種時候蹄胰,使用數(shù)據(jù)庫直接去抗用戶請求,看起來很“笨拙”奕翔,可也許是性價比最高的做法裕寨。

我們最近的一個業(yè)務(wù),就有這種一致性的要求派继,而且是to C的業(yè)務(wù)宾袜,在第一期實(shí)現(xiàn)的時候,使用了單庫分表的策略驾窟,運(yùn)行良好庆猫。但隨著業(yè)務(wù)量不斷增大,單庫壓力越來越大绅络,在一次活動時阅悍,庫被打滿好渠,造成服務(wù)出現(xiàn)10分鐘左右的不可用。后來短期的解決方案是在接口層增加限流节视,超過限流時拳锚,犧牲一定的用戶體驗。
長期的解決方案寻行,就是拆庫霍掺,把原來的一個庫,拆分成10個或者更多個庫拌蜘。

難點(diǎn)
1 服務(wù)不可停杆烁,用戶無感知。就好比給行進(jìn)中的公交車換輪子一樣简卧。
2 數(shù)據(jù)必須強(qiáng)一致兔魂,不能出現(xiàn)數(shù)據(jù)錯誤的情況。
3 方案必須可回滾举娩,在出現(xiàn)問題時析校,必須回滾,讓風(fēng)險可控铜涉。

拆庫前置條件
這里需要說明一下拆庫的前置條件:
1 程序?qū)?shù)據(jù)庫的訪問必須經(jīng)由zoomkeeper智玻,如果是通過代碼寫死ip:port的方式訪問db,必須先改成可動態(tài)配置的模式芙代。
2 必須已完成分表吊奢,一般這種to C業(yè)務(wù)的表,都把userId作為分庫分表的shardId纹烹。舉個例子页滚,在單庫100個分表的情況下,用userId對100取模铺呵,比如userId=1的逻谦,在table_1 (1 % 100)中,userId=1003的陪蜻,在table_3 (1003 % 100)中。這個時候贱鼻,將單庫拆成10個庫時宴卖,依舊使用userId對庫分組,比如userId=1的邻悬,在 database_1 (1 % 10)中的table_1中症昏,userId=1003的,在database_3 (1003 % 10) 的table_3中父丰。

拆庫流程
當(dāng)時一共設(shè)計了3個方案肝谭,最終使用了第3個方案掘宪,整個拆庫的過程很成功,這里貼一下大概的流程攘烛。
1 向dba申請10個新的庫魏滚,并基于dba的工具完成3張表的數(shù)據(jù)同步
(數(shù)據(jù)同步一般是這樣做的,首先把10個新庫都作為老庫的備庫坟漱,通過mysql的binlog及snapshot機(jī)制鼠次,自動完成數(shù)據(jù)的同步)
2 新庫數(shù)據(jù)及讀驗證
(可以通過一個離線的腳本簡單驗證一下,由于這是mysql的同步機(jī)制芋齿,所以準(zhǔn)確性及可靠性非常高腥寇。只驗證讀是正常的,保證配置正常就可以觅捆,注意:不能驗證寫赦役,寫會導(dǎo)致新老庫數(shù)據(jù)不一致)
3 切換使用binlog的服務(wù)源
(對于使用binlog的一些服務(wù),這個時候需要切換到新庫的binlog配置)
4 增加一個新的dataSource栅炒,先讓它指向老庫
(這里解釋一下掂摔,原來的庫A的dataSourceA配置在zk中,程序中訪問庫的代碼都通過dataSourceA完成职辅。這個時候棒呛,新配置一個dataSourceB,讓dataSourceB的配置和dataSourceA一致)
5 修改DAO層代碼域携,將使用dataSourceA的地方統(tǒng)一改成dataSourceB
(正常的編碼規(guī)范簇秒,對數(shù)據(jù)庫的操作都會放在DAO層,因此改動是非常收斂的秀鞭,如果發(fā)現(xiàn)需要改的地方非常多趋观,一定是代碼寫的太隨意)
6 上線所有訪問庫的服務(wù)
(這個上線過程也需要灰度上線,一旦發(fā)現(xiàn)問題锋边,很可能是配置問題皱坛,需要立刻回滾)
7 將dataSourceB的zk配置切成新的庫
(這是最核心的一步,通過zk的觀察者模式豆巨,自動將新的配置通知到所有客戶端剩辟,有一定的風(fēng)險性,最好在流量低峰期進(jìn)行往扔。同時要看著監(jiān)控贩猎,一旦出現(xiàn)問題,立刻把配置刷回來)
8 關(guān)閉新老庫的數(shù)據(jù)同步
(把新庫從老庫的備庫列表摘除就可以)
9 刪除老庫中的表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萍膛,一起剝皮案震驚了整個濱河市吭服,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝗罗,老刑警劉巖艇棕,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌戒,死亡現(xiàn)場離奇詭異,居然都是意外死亡沼琉,警方通過查閱死者的電腦和手機(jī)北苟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刺桃,“玉大人粹淋,你說我怎么就攤上這事∩龋” “怎么了桃移?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葛碧。 經(jīng)常有香客問我借杰,道長,這世上最難降的妖魔是什么进泼? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任蔗衡,我火速辦了婚禮,結(jié)果婚禮上乳绕,老公的妹妹穿的比我還像新娘绞惦。我一直安慰自己,他們只是感情好洋措,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布济蝉。 她就那樣靜靜地躺著,像睡著了一般菠发。 火紅的嫁衣襯著肌膚如雪王滤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天滓鸠,我揣著相機(jī)與錄音雁乡,去河邊找鬼。 笑死糜俗,一個胖子當(dāng)著我的面吹牛踱稍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悠抹,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼珠月,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锌钮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤引矩,失蹤者是張志新(化名)和其女友劉穎梁丘,沒想到半個月后侵浸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氛谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年掏觉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值漫。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡澳腹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杨何,到底是詐尸還是另有隱情酱塔,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布危虱,位于F島的核電站羊娃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏埃跷。R本人自食惡果不足惜蕊玷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弥雹。 院中可真熱鬧垃帅,春花似錦、人聲如沸剪勿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窗宦。三九已至赦颇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赴涵,已是汗流浹背媒怯。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留髓窜,地道東北人扇苞。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像寄纵,于是被迫代替她去往敵國和親鳖敷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容