輕松優(yōu)化MySQL-之?dāng)?shù)據(jù)庫切分1

當(dāng)數(shù)據(jù)量達(dá)到一定程度時(shí)绞蹦,我們處于性能考慮就需要將我們存放在同一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)分散存放到多個(gè)數(shù)據(jù)庫(主機(jī))上面懊纳,以達(dá)到分散單臺設(shè)備負(fù)載的效果嘀倒。數(shù)據(jù)的切分同一時(shí)候還能夠提高系統(tǒng)的總體可用性页藻,由于單臺設(shè)備Crash之后软免。僅僅有總體數(shù)據(jù)的某部分不可用周循,而不是全部的數(shù)據(jù)强法。
數(shù)據(jù)的切分(Sharding)依據(jù)其切分規(guī)則的類型,能夠分為垂直切分湾笛、水平切分拟烫、聯(lián)合切分模式。

數(shù)據(jù)的垂直切分

簡介

是依照不同的表(或者Schema)來切分到不同的數(shù)據(jù)庫(主機(jī))之上迄本,這樣的切能夠稱之為數(shù)據(jù)的垂直(縱向)切分硕淑。
垂直切分的最大特點(diǎn)就是規(guī)則簡單,實(shí)施也更為方便嘉赎,尤其適合各業(yè)務(wù)之間的耦合度非常低置媳。相互影響非常小,業(yè)務(wù)邏輯非常清晰的系統(tǒng)公条。在這樣的系統(tǒng)中拇囊,能夠非常容易做到將不同業(yè)務(wù)模塊所使用的表分拆到不同的數(shù)據(jù)庫中。依據(jù)不同的表來進(jìn)行拆分靶橱。對應(yīng)用程序的影響也更小寥袭,拆分規(guī)則也會比較簡單清晰路捧。

一個(gè)架構(gòu)設(shè)計(jì)較好的應(yīng)用系統(tǒng)。其總體功能肯定是由非常多個(gè)功能模塊所組成的传黄。而每一個(gè)功能模塊所須要的數(shù)據(jù)對應(yīng)到數(shù)據(jù)庫中就是一個(gè)或者多個(gè)表杰扫。而在架構(gòu)設(shè)計(jì)中,各個(gè)功能模塊相互之間的交互點(diǎn)越統(tǒng)一越少膘掰,系統(tǒng)的耦合度就越低章姓,系統(tǒng)各個(gè)模塊的維護(hù)性以及擴(kuò)展性也就越好。這樣的系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的垂直切分也就越容易识埋,不同功能模塊的數(shù)據(jù)存放于不同的數(shù)據(jù)庫主機(jī)中凡伊,能夠非常容易就避免掉跨數(shù)據(jù)庫的Join存在。

當(dāng)然很多情況下系統(tǒng)的耦合度沒有那么低窒舟,我們就必須依據(jù)實(shí)際的應(yīng)用場景進(jìn)行評估權(quán)衡系忙。決定是遷就應(yīng)用程序?qū)㈨氁狫oin的表的相關(guān)某快都存放在同一個(gè)數(shù)據(jù)庫中,還是讓應(yīng)用程序做很多其它的事情惠豺,也就是程序全然通過模塊接口取得不同數(shù)據(jù)庫中的數(shù)據(jù)银还,然后在程序中完畢Join操作。

案例分析

系統(tǒng)功能能夠基本分為四個(gè)功能模塊:用戶耕腾,群組消息见剩,相冊以及事件。分別對應(yīng)為例如以下這些表:

  1. 用戶模塊表:user,user_profile,user_group,user_photo_album
  2. 群組討論表:groups,group_message,group_message_content,top_message
  3. 相冊相關(guān)表:photo,photo_album,photo_album_relation,photo_comment
  4. 事件信息表:event

初略一看扫俺,沒有哪一個(gè)模塊能夠脫離其它模塊獨(dú)立存在苍苞,模塊與模塊之間都存在著關(guān)系。莫非無法切分狼纬?
當(dāng)然不是羹呵,我們再略微深入分析一下,能夠發(fā)現(xiàn)疗琉,盡管各個(gè)模塊所使用的表之間都有關(guān)聯(lián)冈欢,可是關(guān)聯(lián)關(guān)系還算比較清晰,也比較簡單盈简。

  • 群組討論模塊和用戶模塊之間主要存在通過用戶或者是群組關(guān)系來進(jìn)行關(guān)聯(lián)凑耻。一般關(guān)聯(lián)的時(shí)候都會是通過用戶的id或者nick_name以及group的id來進(jìn)行關(guān)聯(lián)。通過模塊之間的接口實(shí)現(xiàn)不會帶來太多麻煩柠贤。
  • 相冊模塊僅僅與用戶模塊存在通過用戶的關(guān)聯(lián)香浩。這兩個(gè)模塊之間的關(guān)聯(lián)基本就有通過用戶id關(guān)聯(lián)的內(nèi)容。簡單清晰臼勉,接口明白邻吭;
  • 事件模塊與各個(gè)模塊可能都有關(guān)聯(lián),可是都僅僅關(guān)注其各個(gè)模塊中對象的ID信息宴霸,相同能夠做到非常容易分拆囱晴。

所以膏蚓。我們第一步能夠?qū)?shù)據(jù)庫依照功能模塊相關(guān)的表進(jìn)行一次垂直拆分。每一個(gè)模塊所涉及的表單獨(dú)到一個(gè)數(shù)據(jù)庫中畸写,模塊與模塊之間的表關(guān)聯(lián)都在應(yīng)用系統(tǒng)端通過藉口來處理驮瞧。例如以下圖所看到的:

image.png

通過這樣的垂直切分之后。之前僅僅能通過一個(gè)數(shù)據(jù)庫來提供的服務(wù)艺糜。就被分拆成四個(gè)數(shù)據(jù)庫來提供服務(wù)剧董,服務(wù)能力自然是添加幾倍了幢尚。

垂直切分的長處

  • 數(shù)據(jù)庫的拆分簡單明了破停,拆分規(guī)則明白;
  • 應(yīng)用程序模塊清晰明白尉剩,整合容易真慢。
  • 數(shù)據(jù)維護(hù)方便易行,容易定位理茎。

垂直切分的缺點(diǎn)

  • 部分表關(guān)聯(lián)無法在數(shù)據(jù)庫級別完畢黑界。須要在程序中完畢。
  • 對于訪問極其頻繁且數(shù)據(jù)量超大的表仍然存在性能平靜皂林,不一定能滿足要求朗鸠。
  • 事務(wù)處理相對更為復(fù)雜;
  • 切分達(dá)到一定程度之后础倍,擴(kuò)展性會遇到限制烛占;
  • 過讀切分可能會帶來系統(tǒng)過渡復(fù)雜而難以維護(hù)。

數(shù)據(jù)的水平切分

簡介

依據(jù)表中的數(shù)據(jù)的邏輯關(guān)系沟启,將同一個(gè)表中的數(shù)據(jù)依照某種條件拆分到多臺數(shù)據(jù)庫(主機(jī))上面忆家,這樣的切分稱之為數(shù)據(jù)的水平(橫向)切分。一般來說德迹,簡單的水平切分主要是將某個(gè)訪問極其頻繁的表再依照某個(gè)字段的某種規(guī)則來分散到多個(gè)表之中芽卿。每一個(gè)表中包括一部分?jǐn)?shù)據(jù)。

水平切分于垂直切分相比胳搞。相對來說略微復(fù)雜一些卸例。由于要將同一個(gè)表中的不同數(shù)據(jù)拆分到不同的數(shù)據(jù)庫中,對于應(yīng)用程序來說肌毅,拆分規(guī)則本身就較依據(jù)表名來拆分更為復(fù)雜筷转,后期的數(shù)據(jù)維護(hù)也會更為復(fù)雜一些。
如依據(jù)某個(gè)數(shù)字類型字段基于特定數(shù)目取模芽腾,某個(gè)時(shí)間類型字段的范圍旦装,或者是某個(gè)字符類型字段的hash值。假設(shè)整個(gè)系統(tǒng)中大部分核心表都能夠通過某個(gè)字段來進(jìn)行關(guān)聯(lián)摊滔。那這個(gè)字段自然是一個(gè)進(jìn)行水平分區(qū)的上上之選了阴绢。
一般來說店乐,像如今互聯(lián)網(wǎng)非常火爆的Web2.0類型的站點(diǎn)呻袭≌0耍基本上大部分?jǐn)?shù)據(jù)都能夠通過會員用戶信息關(guān)聯(lián)上,可能非常多核心表都非常適合通過會員ID來進(jìn)行數(shù)據(jù)的水平切分左电。切分之后基本上不會出現(xiàn)各個(gè)庫之間的交互廉侧。

案例分析

全部數(shù)據(jù)都是和用戶關(guān)聯(lián)的。那么我們就能夠依據(jù)用戶來進(jìn)行水平拆分篓足,將不同用戶的數(shù)據(jù)切分到不同的數(shù)據(jù)庫中段誊。當(dāng)然,唯一有點(diǎn)差別的是用戶模塊中的groups表和用戶沒有直接關(guān)系栈拖。所以groups不能依據(jù)用戶來進(jìn)行水平拆分连舍。對于這樣的特殊情況下的表,我們?nèi)荒軌颡?dú)立出來涩哟。單獨(dú)放在一個(gè)獨(dú)立的數(shù)據(jù)庫中索赏。

所以,對于我們的演示樣例數(shù)據(jù)庫來說贴彼,大部分的表都能夠依據(jù)用戶ID來進(jìn)行水平的切分潜腻。不同用戶相關(guān)的數(shù)據(jù)進(jìn)行切分之后存放在不同的數(shù)據(jù)庫中。如將全部用戶ID通過5取模然后分別存放于五個(gè)不同的數(shù)據(jù)庫中器仗。

每一個(gè)和用戶ID關(guān)聯(lián)上的表都能夠這樣切分融涣。這樣,基本上每一個(gè)用戶相關(guān)的數(shù)據(jù)青灼。都在同一個(gè)數(shù)據(jù)庫中暴心,即使是須要關(guān)聯(lián),也能夠非常簡單的關(guān)聯(lián)上杂拨。

我們能夠通過下圖來更為直觀的展示水平切分相關(guān)信息:

image.png

水平切分的長處

  • 表關(guān)聯(lián)基本能夠在數(shù)據(jù)庫端全部完畢专普;
  • 不會存在某些超大型數(shù)據(jù)量和高負(fù)載的表遇到瓶頸的問題;
  • 應(yīng)用程序端總體架構(gòu)修改相對較少弹沽;
  • 事務(wù)處理相對簡單檀夹;
  • 僅僅要切分規(guī)則能夠定義好〔唛伲基本上較難遇到擴(kuò)展性限制炸渡;

水平切分的缺點(diǎn)

  • 切分規(guī)則相對更為復(fù)雜,非常難抽象出一個(gè)能夠滿足整個(gè)數(shù)據(jù)庫的切分規(guī)則丽已;
  • 后期數(shù)據(jù)的維護(hù)難度有所添加蚌堵,人為手工定位數(shù)據(jù)更困難;
  • 應(yīng)用系統(tǒng)各模塊耦合度較高,可能會對后面數(shù)據(jù)的遷移拆分造成一定的困難吼畏。

聯(lián)合切分

簡介

當(dāng)我們某個(gè)(或者某些)表的數(shù)據(jù)量和訪問量特別的大督赤,通過垂直切分將其放在獨(dú)立的設(shè)備上后仍然無法滿足性能要求,這時(shí)候我們就必須將垂直切分和水平切分相結(jié)合泻蚊。先垂直切分躲舌,然后再水平切分,才能解決這樣的超大型表的性能問題性雄。

每一個(gè)應(yīng)用系統(tǒng)的負(fù)載都是一步一步增長上來的没卸,在開始遇到性能瓶頸的時(shí)候,大多數(shù)架構(gòu)師和DBA都會選擇先進(jìn)行數(shù)據(jù)的垂直拆分秒旋,由于這樣的成本最小约计。最符合這個(gè)時(shí)期所追求的最大投入產(chǎn)出比。然而隨著業(yè)務(wù)的不斷擴(kuò)張滩褥,系統(tǒng)負(fù)載的持續(xù)增長病蛉,在系統(tǒng)穩(wěn)定一段時(shí)期之后炫加,經(jīng)過了垂直拆分之后的數(shù)據(jù)庫集群可能又再一次不堪重負(fù)瑰煎,遇到了性能瓶頸。這時(shí)候我們就必須要通過數(shù)據(jù)的水平切分的優(yōu)勢俗孝,來解決這里所遇到的問題酒甸。并且,我們?nèi)徊槐卦谑褂脭?shù)據(jù)水平切分的時(shí)候赋铝,推倒之前進(jìn)行數(shù)據(jù)垂直切分的成果插勤,而是在其基礎(chǔ)上利用水平切分的優(yōu)勢來避開垂直切分的弊端。而水平拆分的弊端(規(guī)則難以統(tǒng)一)也已經(jīng)被之前的垂直切分解決掉了革骨,讓水平拆分能夠進(jìn)行的得心應(yīng)手农尖。

案例分析

假設(shè)在最開始。我們進(jìn)行了數(shù)據(jù)的垂直切分良哲,然而隨著業(yè)務(wù)的不斷增長盛卡,數(shù)據(jù)庫系統(tǒng)遇到了瓶頸,我們選擇重構(gòu)數(shù)據(jù)庫集群的架構(gòu)筑凫。怎樣重構(gòu)滑沧?我們選擇了在垂直切分的基礎(chǔ)上再進(jìn)行水平拆分。在經(jīng)歷過垂直拆分后的各個(gè)數(shù)據(jù)庫集群中的每一個(gè)都僅僅有一個(gè)功能模塊巍实。而每一個(gè)功能模塊中的全部表基本上都會與某個(gè)字段進(jìn)行關(guān)聯(lián)滓技。如用戶模塊全部都能夠通過用戶ID進(jìn)行切分,群組討論模塊則都通過群組ID來切分棚潦。相冊模塊則依據(jù)相冊ID來進(jìn)切分令漂。最后的事件通知信息表考慮到數(shù)據(jù)的時(shí)限性(僅僅會訪問近期某個(gè)事件段的信息),則考慮按時(shí)間來切分。

下圖展示了切分后的整個(gè)架構(gòu):


image.png

實(shí)際上叠必,在非常多大型的應(yīng)用系統(tǒng)中外潜,垂直切分和水平切這兩種數(shù)據(jù)的切分方法基本上都是并存的。并且經(jīng)常在不斷的交替進(jìn)行挠唆,以不斷的添加系統(tǒng)的擴(kuò)展能力处窥。我們在應(yīng)對不同的應(yīng)用場景的時(shí)候,也須要充分考慮到這兩種切分方法各自的局限玄组,以及各自的優(yōu)勢滔驾。在不同的時(shí)期(負(fù)載壓力)使用不同的結(jié)合方式。

聯(lián)合切分的長處

  • 能夠充分利用垂直切分和水平切分各自的優(yōu)勢而避免各自的缺陷俄讹;
  • 讓系統(tǒng)擴(kuò)展性得到最大化提升哆致。

聯(lián)合切分的缺點(diǎn)

  • 數(shù)據(jù)庫系統(tǒng)架構(gòu)比較復(fù)雜。維護(hù)難度更大
  • 應(yīng)用程序架構(gòu)也相對更復(fù)雜患膛;
上一篇 《性能優(yōu)化系列文章目錄》 下一篇
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摊阀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踪蹬,更是在濱河造成了極大的恐慌胞此,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跃捣,死亡現(xiàn)場離奇詭異漱牵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疚漆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門酣胀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娶聘,你說我怎么就攤上這事闻镶。” “怎么了丸升?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵铆农,是天一觀的道長。 經(jīng)常有香客問我发钝,道長顿涣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任酝豪,我火速辦了婚禮涛碑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孵淘。我一直安慰自己蒲障,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揉阎,像睡著了一般庄撮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毙籽,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天洞斯,我揣著相機(jī)與錄音,去河邊找鬼坑赡。 笑死烙如,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毅否。 我是一名探鬼主播亚铁,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼螟加!你這毒婦竟也來了徘溢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤捆探,失蹤者是張志新(化名)和其女友劉穎然爆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徐许,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡施蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雌隅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缸沃,死狀恐怖恰起,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趾牧,我是刑警寧澤检盼,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站翘单,受9級特大地震影響吨枉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜哄芜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一貌亭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧认臊,春花似錦圃庭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘央。三九已至,卻和暖如春书在,著一層夾襖步出監(jiān)牢的瞬間灰伟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工儒旬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袱箱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓义矛,卻偏偏與公主長得像发笔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子凉翻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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