一、前言
數(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)戳下面