面試官:給我講一下分庫分表方案

作者:尜尜人物

鏈接:https://www.cnblogs.com/littlecharacter/p/9342129.html

一捅彻、數(shù)據(jù)庫瓶頸

1组去、IO瓶頸

2、CPU瓶頸

二步淹、分庫分表

1从隆、水平分庫

2、水平分表

3缭裆、垂直分庫

4键闺、垂直分表

三、分庫分表工具

四澈驼、分庫分表步驟

五辛燥、分庫分表問題

1、非partition key的查詢問題(水平分庫分表缝其,拆分策略為常用的hash法)

2购桑、非partition key跨庫跨表分頁查詢問題(水平分庫分表,拆分策略為常用的hash法)

3氏淑、擴(kuò)容問題(水平分庫分表勃蜘,拆分策略為常用的hash法)

六、分庫分表總結(jié)

七假残、分庫分表示例

一缭贡、數(shù)據(jù)庫瓶頸

不管是IO瓶頸炉擅,還是CPU瓶頸,最終都會導(dǎo)致數(shù)據(jù)庫的活躍連接數(shù)增加阳惹,進(jìn)而逼近甚至達(dá)到數(shù)據(jù)庫可承載活躍連接數(shù)的閾值谍失。在業(yè)務(wù)Service來看就是,可用數(shù)據(jù)庫連接少甚至無連接可用莹汤。接下來就可以想象了吧(并發(fā)量快鱼、吞吐量、崩潰)纲岭。

1抹竹、IO瓶頸

第一種:磁盤讀IO瓶頸,熱點(diǎn)數(shù)據(jù)太多止潮,數(shù)據(jù)庫緩存放不下窃判,每次查詢時會產(chǎn)生大量的IO,降低查詢速度 ->** 分庫和垂直分表喇闸。**

第二種:網(wǎng)絡(luò)IO瓶頸袄琳,請求的數(shù)據(jù)太多,網(wǎng)絡(luò)帶寬不夠 ->** 分庫燃乍。**

2唆樊、CPU瓶頸

第一種:SQL問題,如SQL中包含join刻蟹,group by逗旁,order by,非索引字段條件查詢等座咆,增加CPU運(yùn)算的操作 -> SQL優(yōu)化,建立合適的索引仓洼,在業(yè)務(wù)Service層進(jìn)行業(yè)務(wù)計算介陶。

第二種:單表數(shù)據(jù)量太大,查詢時掃描的行太多色建,SQL效率低哺呜,CPU率先出現(xiàn)瓶頸 -> 水平分表。

二箕戳、分庫分表

1某残、水平分庫

image

1、概念:以字段為依據(jù)陵吸,按照一定策略(hash玻墅、range等),將一個庫中的數(shù)據(jù)拆分到多個庫中壮虫。

2澳厢、結(jié)果:

  • 每個庫的結(jié)構(gòu)都一樣环础;

  • 每個庫的數(shù)據(jù)都不一樣,沒有交集剩拢;

  • 所有庫的并集是全量數(shù)據(jù)线得;

3、場景:系統(tǒng)絕對并發(fā)量上來了徐伐,分表難以根本上解決問題贯钩,并且還沒有明顯的業(yè)務(wù)歸屬來垂直分庫。

4办素、分析:庫多了角雷,io和cpu的壓力自然可以成倍緩解。

2摸屠、水平分表

image

1谓罗、概念:以字段為依據(jù),按照一定策略(hash季二、range等)檩咱,將一個表中的數(shù)據(jù)拆分到多個表中。

2胯舷、結(jié)果:

  • 每個表的結(jié)構(gòu)都一樣刻蚯;

  • 每個表的數(shù)據(jù)都不一樣,沒有交集桑嘶;

  • 所有表的并集是全量數(shù)據(jù)炊汹;

3、場景:系統(tǒng)絕對并發(fā)量并沒有上來逃顶,只是單表的數(shù)據(jù)量太多讨便,影響了SQL效率,加重了CPU負(fù)擔(dān)以政,以至于成為瓶頸霸褒。

4、分析:表的數(shù)據(jù)量少了盈蛮,單次SQL執(zhí)行效率高废菱,自然減輕了CPU的負(fù)擔(dān)。

3抖誉、垂直分庫

image

1殊轴、概念:以表為依據(jù),按照業(yè)務(wù)歸屬不同袒炉,將不同的表拆分到不同的庫中旁理。

2、結(jié)果:

  • 每個庫的結(jié)構(gòu)都不一樣我磁;

  • 每個庫的數(shù)據(jù)也不一樣韧拒,沒有交集淹接;

  • 所有庫的并集是全量數(shù)據(jù);

3叛溢、場景:系統(tǒng)絕對并發(fā)量上來了塑悼,并且可以抽象出單獨(dú)的業(yè)務(wù)模塊。

4楷掉、分析:到這一步厢蒜,基本上就可以服務(wù)化了。例如烹植,隨著業(yè)務(wù)的發(fā)展一些公用的配置表斑鸦、字典表等越來越多,這時可以將這些表拆到單獨(dú)的庫中草雕,甚至可以服務(wù)化巷屿。再有,隨著業(yè)務(wù)的發(fā)展孵化出了一套業(yè)務(wù)模式墩虹,這時可以將相關(guān)的表拆到單獨(dú)的庫中嘱巾,甚至可以服務(wù)化。

4诫钓、垂直分表

image

1旬昭、概念:以字段為依據(jù),按照字段的活躍性菌湃,將表中字段拆到不同的表(主表和擴(kuò)展表)中问拘。

2、結(jié)果:

  • 每個表的結(jié)構(gòu)都不一樣惧所;

  • 每個表的數(shù)據(jù)也不一樣骤坐,一般來說,每個表的字段至少有一列交集下愈,一般是主鍵纽绍,用于關(guān)聯(lián)數(shù)據(jù);

  • 所有表的并集是全量數(shù)據(jù)驰唬;

3顶岸、場景:系統(tǒng)絕對并發(fā)量并沒有上來腔彰,表的記錄并不多叫编,但是字段多,并且熱點(diǎn)數(shù)據(jù)和非熱點(diǎn)數(shù)據(jù)在一起霹抛,單行數(shù)據(jù)所需的存儲空間較大搓逾。以至于數(shù)據(jù)庫緩存的數(shù)據(jù)行減少,查詢時會去讀磁盤數(shù)據(jù)產(chǎn)生大量的隨機(jī)讀IO杯拐,產(chǎn)生IO瓶頸霞篡。

4世蔗、分析:可以用列表頁和詳情頁來幫助理解。垂直分表的拆分原則是將熱點(diǎn)數(shù)據(jù)(可能會冗余經(jīng)常一起查詢的數(shù)據(jù))放在一起作為主表朗兵,非熱點(diǎn)數(shù)據(jù)放在一起作為擴(kuò)展表污淋。這樣更多的熱點(diǎn)數(shù)據(jù)就能被緩存下來,進(jìn)而減少了隨機(jī)讀IO余掖。拆了之后寸爆,要想獲得全部數(shù)據(jù)就需要關(guān)聯(lián)兩個表來取數(shù)據(jù)。但記住盐欺,千萬別用join赁豆,因?yàn)閖oin不僅會增加CPU負(fù)擔(dān)并且會講兩個表耦合在一起(必須在一個數(shù)據(jù)庫實(shí)例上)。關(guān)聯(lián)數(shù)據(jù)冗美,應(yīng)該在業(yè)務(wù)Service層做文章魔种,分別獲取主表和擴(kuò)展表數(shù)據(jù)然后用關(guān)聯(lián)字段關(guān)聯(lián)得到全部數(shù)據(jù)。

三粉洼、分庫分表工具

1节预、sharding-sphere:jar,前身是sharding-jdbc漆改;

2心铃、TDDL:jar,Taobao Distribute Data Layer挫剑;

3去扣、Mycat:中間件。

注:工具的利弊樊破,請自行調(diào)研愉棱,官網(wǎng)和社區(qū)優(yōu)先。

四哲戚、分庫分表步驟

根據(jù)容量(當(dāng)前容量和增長量)評估分庫或分表個數(shù) -> 選key(均勻)-> 分表規(guī)則(hash或range等)-> 執(zhí)行(一般雙寫)-> 擴(kuò)容問題(盡量減少數(shù)據(jù)的移動)奔滑。

五、分庫分表問題

1顺少、非partition key的查詢問題(水平分庫分表朋其,拆分策略為常用的hash法)

1、端上除了partition key只有一個非partition key作為條件查詢

  • 映射法
image
  • 基因法
image

注:寫入時脆炎,基因法生成user_id梅猿,如圖。關(guān)于xbit基因秒裕,例如要分8張表袱蚓,23=8,故x取3几蜻,即3bit基因喇潘。根據(jù)user_id查詢時可直接取模路由到對應(yīng)的分庫或分表体斩。根據(jù)user_name查詢時,先通過user_name_code生成函數(shù)生成user_name_code再對其取模路由到對應(yīng)的分庫或分表颖低。id生成常用snowflake算法絮吵。

2、端上除了partition key不止一個非partition key作為條件查詢

  • 映射法
image
  • 冗余法
image

注:按照order_id或buyer_id查詢時路由到db_o_buyer庫中忱屑,按照seller_id查詢時路由到db_o_seller庫中源武。感覺有點(diǎn)本末倒置!有其他好的辦法嗎想幻?改變技術(shù)棧呢粱栖?

3、后臺除了partition key還有各種非partition key組合條件查詢

  • NoSQL法
image
  • 冗余法
image

2脏毯、非partition key跨庫跨表分頁查詢問題(水平分庫分表闹究,拆分策略為常用的hash法)

注:用NoSQL法解決(ES等)。

3食店、擴(kuò)容問題(水平分庫分表渣淤,拆分策略為常用的hash法)

1、水平擴(kuò)容庫(升級從庫法

image

注:擴(kuò)容是成倍的吉嫩。

2价认、水平擴(kuò)容表(雙寫遷移法)

image

第一步:(同步雙寫)應(yīng)用配置雙寫,部署自娩;
第二步:(同步雙寫)將老庫中的老數(shù)據(jù)復(fù)制到新庫中用踩;
第三步:(同步雙寫)以老庫為準(zhǔn)校對新庫中的老數(shù)據(jù);
第四步:(同步雙寫)應(yīng)用去掉雙寫忙迁,部署脐彩;

注:雙寫是通用方案。

六姊扔、分庫分表總結(jié)

分庫分表惠奸,首先得知道瓶頸在哪里,然后才能合理地拆分(分庫還是分表恰梢?水平還是垂直佛南?分幾個?)嵌言。且不可為了分庫分表而拆分嗅回。

1、選key很重要呀页,既要考慮到拆分均勻妈拌,也要考慮到非partition key的查詢拥坛。

2蓬蝶、只要能滿足需求尘分,拆分規(guī)則越簡單越好。

七丸氛、分庫分表示例

示例GitHub地址:https://github.com/littlecharacter4s/study-sharding

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末培愁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缓窜,更是在濱河造成了極大的恐慌定续,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禾锤,死亡現(xiàn)場離奇詭異私股,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)恩掷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門倡鲸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黄娘,你說我怎么就攤上這事峭状。” “怎么了逼争?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵优床,是天一觀的道長。 經(jīng)常有香客問我誓焦,道長胆敞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任杂伟,我火速辦了婚禮竿秆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘稿壁。我一直安慰自己幽钢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布傅是。 她就那樣靜靜地躺著匪燕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喧笔。 梳的紋絲不亂的頭發(fā)上帽驯,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音书闸,去河邊找鬼尼变。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嫌术。 我是一名探鬼主播哀澈,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼度气!你這毒婦竟也來了割按?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤磷籍,失蹤者是張志新(化名)和其女友劉穎适荣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體院领,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弛矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了比然。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汪诉。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谈秫,靈堂內(nèi)的尸體忽然破棺而出扒寄,到底是詐尸還是另有隱情,我是刑警寧澤拟烫,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布该编,位于F島的核電站,受9級特大地震影響硕淑,放射性物質(zhì)發(fā)生泄漏课竣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一置媳、第九天 我趴在偏房一處隱蔽的房頂上張望于樟。 院中可真熱鬧,春花似錦拇囊、人聲如沸迂曲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽路捧。三九已至,卻和暖如春传黄,著一層夾襖步出監(jiān)牢的瞬間杰扫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工膘掰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留章姓,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像凡伊,于是被迫代替她去往敵國和親零渐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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