數(shù)據(jù)庫(kù)性能提升利器—Mycat數(shù)據(jù)切分

一、前言

數(shù)據(jù)庫(kù)是每個(gè)系統(tǒng)都不可缺少的東西寺旺,里面記錄了系統(tǒng)各種數(shù)據(jù)資料组去。但是如今的數(shù)據(jù)膨脹的時(shí)代鞍陨,數(shù)據(jù)庫(kù)性能不能滿(mǎn)足我們的需要了。所以我們要對(duì)數(shù)據(jù)庫(kù)進(jìn)行強(qiáng)化添怔,就用到了Mycat湾戳。

二、何為數(shù)據(jù)切分广料?

簡(jiǎn)單來(lái)說(shuō),就是指通過(guò)某種特定的條件幼驶,把我們存放在同一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)分散存儲(chǔ)到多個(gè)數(shù)據(jù)庫(kù)里艾杏。

數(shù)據(jù)的切分(Sharding)根據(jù)其切分規(guī)則的類(lèi)型,可以分為兩種切分模式盅藻。一種是按照不同的表(或者Schema)來(lái)切分到不同的

數(shù)據(jù)庫(kù)(主機(jī))之上购桑,這種切可以稱(chēng)之為數(shù)據(jù)的垂直(縱向)切分;另外一種則是根據(jù)表中的數(shù)據(jù)的邏輯關(guān)系氏淑,將同一個(gè)表中的

數(shù)據(jù)按照某種條件拆分到多臺(tái)數(shù)據(jù)庫(kù)(主機(jī))上面勃蜘,這種切分稱(chēng)之為數(shù)據(jù)的水平(橫向)切分。

垂直切分的最大特點(diǎn)就是規(guī)則簡(jiǎn)單假残,實(shí)施也更為方便缭贡,尤其適合各業(yè)務(wù)之間的耦合度非常低炉擅,相互影響很小,業(yè)務(wù)邏輯非常清晰

的系統(tǒng)阳惹。在這種系統(tǒng)中谍失,可以很容易做到將不同業(yè)務(wù)模塊所使用的表分拆到不同的數(shù)據(jù)庫(kù)中。根據(jù)不同的表來(lái)進(jìn)行拆分莹汤,對(duì)應(yīng)用

程序的影響也更小快鱼,拆分規(guī)則也會(huì)比較簡(jiǎn)單清晰。

水平切分于垂直切分相比纲岭,相對(duì)來(lái)說(shuō)稍微復(fù)雜一些抹竹。因?yàn)橐獙⑼粋€(gè)表中的不同數(shù)據(jù)拆分到不同的數(shù)據(jù)庫(kù)中,對(duì)于應(yīng)用程序來(lái)

說(shuō)止潮,拆分規(guī)則本身就較根據(jù)表名來(lái)拆分更為復(fù)雜窃判,后期的數(shù)據(jù)維護(hù)也會(huì)更為復(fù)雜一些。

2.1 垂直切分

一個(gè)數(shù)據(jù)庫(kù)由很多表的構(gòu)成沽翔,每個(gè)表對(duì)應(yīng)著不同的業(yè)務(wù)兢孝,垂直切分是指按照業(yè)務(wù)將表進(jìn)行分類(lèi),分布到不同的數(shù)據(jù)庫(kù)上面仅偎,這樣

也就將數(shù)據(jù)或者說(shuō)壓力分擔(dān)到不同的庫(kù)上面跨蟹,如下圖:

下面來(lái)分析下垂直切分的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

拆分后業(yè)務(wù)清晰,拆分規(guī)則明確橘沥。

系統(tǒng)之間整合或擴(kuò)展容易窗轩。

數(shù)據(jù)維護(hù)簡(jiǎn)單。

缺點(diǎn):

部分業(yè)務(wù)表無(wú)法join座咆,只能通過(guò)接口方式解決痢艺,提高了系統(tǒng)復(fù)雜度。

受每種業(yè)務(wù)不同的限制存在單庫(kù)性能瓶頸介陶,不易數(shù)據(jù)擴(kuò)展跟性能提高堤舒。

事務(wù)處理復(fù)雜。

由于垂直切分是按照業(yè)務(wù)的分類(lèi)將表分散到不同的庫(kù)哺呜,所以有些業(yè)務(wù)表會(huì)過(guò)于龐大舌缤,存在單庫(kù)讀寫(xiě)與存儲(chǔ)瓶頸,所以就需要水平拆分來(lái)做解決某残。

2.2 水平切分

相對(duì)于垂直拆分国撵,水平拆分不是將表做分類(lèi),而是按照某個(gè)字段的某種規(guī)則來(lái)分散到多個(gè)庫(kù)之中玻墅,每個(gè)表中包含一部分?jǐn)?shù)據(jù)介牙。簡(jiǎn)

單來(lái)說(shuō),我們可以將數(shù)據(jù)的水平切分理解為是按照數(shù)據(jù)行的切分澳厢,就是將表中的某些行切分到一個(gè)數(shù)據(jù)庫(kù)环础,而另外的某些行又切

分到其他的數(shù)據(jù)庫(kù)中囚似,如圖:

幾種典型的分片規(guī)則包括:

按照用戶(hù)ID求模,將數(shù)據(jù)分散到不同的數(shù)據(jù)庫(kù)喳整,具有相同數(shù)據(jù)用戶(hù)的數(shù)據(jù)都被分散到一個(gè)庫(kù)中谆构。

按照日期,將不同月甚至日的數(shù)據(jù)分散到不同的庫(kù)中框都。

按照某個(gè)特定的字段求摸搬素,或者根據(jù)特定范圍段分散到不同的庫(kù)中。

既然數(shù)據(jù)做了拆分有優(yōu)點(diǎn)也就優(yōu)缺點(diǎn)魏保。

優(yōu)點(diǎn)有:

拆分規(guī)則抽象好熬尺,join操作基本可以數(shù)據(jù)庫(kù)做。

不存在單庫(kù)大數(shù)據(jù)谓罗,高并發(fā)的性能瓶頸粱哼。

應(yīng)用端改造較少。

提高了系統(tǒng)的穩(wěn)定性跟負(fù)載能力檩咱。

缺點(diǎn)有:

拆分規(guī)則難以抽象揭措。

分片事務(wù)一致性難以解決。

數(shù)據(jù)多次擴(kuò)展難度跟維護(hù)量極大刻蚯。

跨庫(kù)join性能較差

前面講了垂直切分跟水平切分的不同跟優(yōu)缺點(diǎn)绊含,會(huì)發(fā)現(xiàn)每種切分方式都有缺點(diǎn),但共同的特點(diǎn)缺點(diǎn)有:

引入分布式事務(wù)的問(wèn)題炊汹。

跨節(jié)點(diǎn)Join的問(wèn)題躬充。跨節(jié)點(diǎn)合并排序分頁(yè)問(wèn)題讨便。

多數(shù)據(jù)源管理問(wèn)題充甚。

由于數(shù)據(jù)切分后數(shù)據(jù)Join的難度在此也分享一下數(shù)據(jù)切分的經(jīng)驗(yàn):

第一原則:能不切分盡量不要切分。

第二原則:如果要切分一定要選擇合適的切分規(guī)則霸褒,提前規(guī)劃好伴找。

第三原則:數(shù)據(jù)切分盡量通過(guò)數(shù)據(jù)冗余或表分組(Table Group)來(lái)降低跨庫(kù)Join的可能。

第四原則:由于數(shù)據(jù)庫(kù)中間件對(duì)數(shù)據(jù)Join實(shí)現(xiàn)的優(yōu)劣難以把握废菱,而且實(shí)現(xiàn)高性能難度極大疆瑰,業(yè)務(wù)讀取盡量少使用多表Join。

三昙啄、Mycat簡(jiǎn)介

最近項(xiàng)目中使用了數(shù)據(jù)庫(kù)中間件——Mycat。

這個(gè)中間件可以說(shuō)是很奇妙的東西寸五,可以讓數(shù)據(jù)庫(kù)的負(fù)載能力提高很多梳凛。小編項(xiàng)目中使用的是Mysql,單表數(shù)據(jù)達(dá)到500w的時(shí)候梳杏,數(shù)據(jù)庫(kù)的各方面性能就會(huì)有一定的下降韧拒,比如淹接,單表查詢(xún),或者連表查詢(xún)等叛溢。

加入mycat后塑悼,可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行分庫(kù),分表楷掉。把一個(gè)邏輯完整的數(shù)據(jù)庫(kù)分成物理拆分的數(shù)據(jù)庫(kù)厢蒜。

Mycat背后是阿里曾經(jīng)開(kāi)源的知名產(chǎn)品——

Cobar。Cobar的核心功能和優(yōu)勢(shì)是MySQL數(shù)據(jù)庫(kù)分片烹植,此產(chǎn)品曾經(jīng)廣為流傳斑鸦,據(jù)說(shuō)最早的發(fā)起者對(duì)Mysql很精通,后來(lái)從阿里

跳槽了草雕,阿里隨后開(kāi)源的Cobar巷屿,并維持到2013年年初,然后墩虹,就沒(méi)有然后了嘱巾。

Mycat就是一個(gè)近似等于MySQL的數(shù)據(jù)庫(kù)服務(wù)器,你可以用連接MySQL的方式去連接Mycat(除了端口不同诫钓,默認(rèn)的Mycat端

口是8066而非MySQL的3306旬昭,因此需要在連接字符串上增加端口信息),大多數(shù)情況下尖坤,可以用你熟悉的對(duì)象映射框架使用

Mycat稳懒,但建議對(duì)于分片表,盡量使用基礎(chǔ)的SQL語(yǔ)句慢味,因?yàn)檫@樣能達(dá)到最佳性能场梆,特別是幾千萬(wàn)甚至幾百億條記錄的情況下。

Mycat是一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)中間件纯路,不僅僅可以用作讀寫(xiě)分離或油、以及分表分庫(kù)、容災(zāi)備份驰唬,而且可以用于多租戶(hù)應(yīng)用開(kāi)發(fā)顶岸、云平

臺(tái)基礎(chǔ)設(shè)施、讓你的架構(gòu)具備很強(qiáng)的適應(yīng)性和靈活性叫编,借助于即將發(fā)布的Mycat智能優(yōu)化模塊辖佣,系統(tǒng)的數(shù)據(jù)訪(fǎng)問(wèn)瓶頸和熱點(diǎn)一目

了然,根據(jù)這些統(tǒng)計(jì)分析數(shù)據(jù)搓逾,你可以自動(dòng)或手工調(diào)整后端存儲(chǔ)卷谈,將不同的表映射到不同存儲(chǔ)引擎上,而整個(gè)應(yīng)用的代碼一行也

不用改變霞篡。

3.1 Mycat原理

Mycat的原理并不復(fù)雜,復(fù)雜的是代碼,如果代碼也不復(fù)雜洗贰,那么早就成為一個(gè)傳說(shuō)了。

Mycat的原理中最重要的一個(gè)動(dòng)詞是“攔截”顶滩,它攔截了用戶(hù)發(fā)送過(guò)來(lái)的SQL語(yǔ)句,首先對(duì)SQL語(yǔ)句做了一些特定的分析:如分

片分析寸爆、路由分析礁鲁、讀寫(xiě)分離分析、緩存分析等而昨,然后將此SQL發(fā)往后端的真實(shí)數(shù)據(jù)庫(kù)救氯,并將返回的結(jié)果做適當(dāng)?shù)奶幚恚罱K再

返回給用戶(hù)歌憨。

3.2 應(yīng)用場(chǎng)景

Mycat發(fā)展到現(xiàn)在着憨,適用的場(chǎng)景已經(jīng)很豐富,而且不斷有新用戶(hù)給出新的創(chuàng)新性的方案务嫡,以下是幾個(gè)典型的應(yīng)用場(chǎng)景:

單純的讀寫(xiě)分離甲抖,此時(shí)配置最為簡(jiǎn)單,支持讀寫(xiě)分離心铃,主從切換

分表分庫(kù)准谚,對(duì)于超過(guò)1000萬(wàn)的表進(jìn)行分片,最大支持1000億的單表分片

多租戶(hù)應(yīng)用去扣,每個(gè)應(yīng)用一個(gè)庫(kù)柱衔,但應(yīng)用程序只連接Mycat,從而不改造程序本身愉棱,實(shí)現(xiàn)多租戶(hù)化

報(bào)表系統(tǒng)唆铐,借助于Mycat的分表能力,處理大規(guī)模報(bào)表的統(tǒng)計(jì)

替代Hbase奔滑,分析大數(shù)據(jù)

作為海量數(shù)據(jù)實(shí)時(shí)查詢(xún)的一種簡(jiǎn)單有效方案艾岂,比如100億條頻繁查詢(xún)的記錄需要在3秒內(nèi)查詢(xún)出來(lái)結(jié)果,除了基于主鍵的查

詢(xún)朋其,還可能存在范圍查詢(xún)或其他屬性查詢(xún)王浴,此時(shí)Mycat可能是最簡(jiǎn)單有效的選擇

四、小結(jié)

這一篇博客主要向大家介紹了一下數(shù)據(jù)庫(kù)分片和mycat的宏觀介紹梅猿。

以上內(nèi)容希望幫助到大家氓辣,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問(wèn)題和瓶頸,業(yè)務(wù)代碼寫(xiě)多了沒(méi)有方向感袱蚓,不知道該從那里入手去提升筛婉,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)、高可擴(kuò)展爽撒、高性能、高并發(fā)响蓉、服務(wù)器性能調(diào)優(yōu)硕勿、TP6,laravel枫甲,YII2源武,Redis,Swoole想幻、Swoft粱栖、Kafka、Mysql優(yōu)化脏毯、shell腳本闹究、Docker、微服務(wù)食店、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家渣淤,需要請(qǐng)戳下面

PHP進(jìn)階架構(gòu)師>>>視頻、面試文檔免費(fèi)獲取?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吉嫩,一起剝皮案震驚了整個(gè)濱河市价认,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌自娩,老刑警劉巖用踩,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異忙迁,居然都是意外死亡脐彩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)动漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丁屎,“玉大人,你說(shuō)我怎么就攤上這事旱眯〕看ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵删豺,是天一觀的道長(zhǎng)共虑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)呀页,這世上最難降的妖魔是什么妈拌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上尘分,老公的妹妹穿的比我還像新娘猜惋。我一直安慰自己,他們只是感情好培愁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布著摔。 她就那樣靜靜地躺著,像睡著了一般定续。 火紅的嫁衣襯著肌膚如雪谍咆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天私股,我揣著相機(jī)與錄音摹察,去河邊找鬼。 笑死倡鲸,一個(gè)胖子當(dāng)著我的面吹牛供嚎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旦签,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼查坪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宁炫?” 一聲冷哼從身側(cè)響起偿曙,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羔巢,沒(méi)想到半個(gè)月后望忆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竿秆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年启摄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幽钢。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歉备,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匪燕,到底是詐尸還是另有隱情蕾羊,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布帽驯,位于F島的核電站龟再,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尼变。R本人自食惡果不足惜利凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哀澈,春花似錦牌借、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至哲虾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間择示,已是汗流浹背束凑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栅盲,地道東北人汪诉。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像谈秫,于是被迫代替她去往敵國(guó)和親扒寄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

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