1.為什么要分庫分表
①分庫分表說白了,就是因?yàn)閿?shù)據(jù)量太大了草姻,如果你的單表數(shù)據(jù)量都到了千萬級(jí)別溪椎,那么你的數(shù)據(jù)庫就無法承受高并發(fā)的要求,數(shù)據(jù)庫操作性能就會(huì)出現(xiàn)極大的下降誊锭。
②數(shù)據(jù)庫并發(fā)量太大了表悬,一般而言,一個(gè)數(shù)據(jù)庫最多支撐并發(fā)到2000丧靡,這時(shí)候一定要進(jìn)行擴(kuò)容蟆沫,不然性能會(huì)出現(xiàn)嚴(yán)重下降籽暇。而且一個(gè)健康的單庫并發(fā)值你最好保持在每秒1000左右,不要太大饭庞。那么你可以將一個(gè)庫的數(shù)據(jù)拆分到多個(gè)庫中戒悠,訪問的時(shí)候就訪問一個(gè)庫好了。
2.有哪些分庫分布中間件
比較常見的中間件有cobar但绕、TDDL救崔、atlas、sharding-jdbc捏顺、mycat六孵。
①cobar :阿里b2b團(tuán)隊(duì)開發(fā)和開源的,屬于proxy層方案幅骄。已經(jīng)好幾年沒有進(jìn)行更新了劫窒,基本沒啥人用。而且不支持讀寫分離拆座、存儲(chǔ)過程主巍、跨庫join和分頁等操作。
②TDDL :淘寶團(tuán)隊(duì)開發(fā)的挪凑,屬于client層方案孕索,不支持join,但是支持讀寫分離躏碳。目前使用的也不多搞旭,因?yàn)檫€依賴淘寶的diamond配置管理系統(tǒng)。
③atlas :360開源的菇绵,屬于proxy層方案肄渗,以前有一些公司在用,但是已經(jīng)好幾年沒有更新了咬最,所以現(xiàn)在用的也不多翎嫡。
④sharding-jdbc :當(dāng)當(dāng)開源的,屬于client層方案永乌。SQL語法支持多惑申,沒有太多的限制,從2.0版本開始支持分庫分表翅雏、讀寫分離圈驼、分布式id生成、柔性事務(wù)(最大努力送達(dá)型事務(wù)枚荣、TCC事務(wù))。而且現(xiàn)在使用較多啼肩。
⑤myCat :基于cobar改造橄妆,屬于proxy層方案衙伶,支持的功能完善,而且目前應(yīng)該是非澈δ耄火的而且不斷流行的數(shù)據(jù)庫中間件矢劲,社區(qū)很活躍,也有一些公司開始在用了慌随。
3.分布式中間件類型
①proxy類型
proxy類型的中間件就是一個(gè)客戶端芬沉,需要直接部署一個(gè)中間件,去進(jìn)行分庫分表阁猜。服務(wù)端將sql發(fā)送到中間件客戶端去進(jìn)行不同表庫的操作丸逸。如果中間件客戶端不可用將直接導(dǎo)致無法進(jìn)行分庫分表,而且要走網(wǎng)絡(luò)耗時(shí)剃袍。
②client
client不需要單獨(dú)部署中間件客戶端黄刚,運(yùn)維成本低,中間件就是一個(gè)jar包民效,直接在項(xiàng)目中導(dǎo)入憔维、配置就可以完成分庫分表,而且不需要代理層的二次轉(zhuǎn)發(fā)畏邢,性能高點(diǎn)业扒,但是遇到升級(jí)等操作需要重新發(fā)布版本,各個(gè)系統(tǒng)都需要耦合sharding-jbdc的依賴舒萎。
4.垂直拆分與水平拆分
①垂直拆分
垂直拆分的意思程储,就是把一個(gè)有很多字段的表給拆分成多個(gè)表,或者是多個(gè)庫上去逆甜。每個(gè)庫表的結(jié)構(gòu)都不一樣虱肄,每個(gè)庫表都包含部分字段。一般來說交煞,會(huì)將較少的訪問頻率很高的字段放到一個(gè)表里去咏窿,然后將較多的訪問頻率很低的字段放到另外一個(gè)表里去。因?yàn)閿?shù)據(jù)庫是有緩存的素征,你訪問頻率高的行字段越少集嵌,就可以在緩存里緩存更多的行,性能就越好御毅。這個(gè)一般在表層面做的較多一些根欧。
這個(gè)其實(shí)挺常見的,不一定我說端蛆,大家很多同學(xué)可能自己都做過凤粗,把一個(gè)大表拆開,訂單表今豆、訂單支付表嫌拣、訂單商品表柔袁。
②水平拆分
水平拆分的意思,就是把一個(gè)表的數(shù)據(jù)給弄到多個(gè)庫的多個(gè)表里去异逐,但是每個(gè)庫的表結(jié)構(gòu)都一樣捶索,只不過每個(gè)庫表放的數(shù)據(jù)是不同的,所有庫表的數(shù)據(jù)加起來就是全部數(shù)據(jù)灰瞻。水平拆分的意義腥例,就是將數(shù)據(jù)均勻放更多的庫里,然后用多個(gè)庫來抗更高的并發(fā)酝润,還有就是用多個(gè)庫的存儲(chǔ)容量來進(jìn)行擴(kuò)容燎竖。
③表的拆分
還有表層面的拆分,就是分表袍祖,將一個(gè)表變成N個(gè)表底瓣,就是讓每個(gè)表的數(shù)據(jù)量控制在一定范圍內(nèi),保證SQL的性能蕉陋。否則單表數(shù)據(jù)量越大捐凭,SQL性能就越差。一般是200萬行左右凳鬓,不要太多茁肠,但是也得看具體你怎么操作,也可能是500萬缩举,或者是100萬垦梆。你的SQL越復(fù)雜,就最好讓單表行數(shù)越少仅孩。
一般來說托猩,垂直拆分,你可以在表層面來做辽慕,對(duì)一些字段特別多的表做一下拆分京腥;水平拆分,是并發(fā)承載不了溅蛉,或者是數(shù)據(jù)量太大公浪,容量承載不了,你給拆了船侧,按什么字段來拆欠气,你自己想好;分表镜撩,你考慮一下预柒,你如果哪怕是拆到每個(gè)庫里去,并發(fā)和容量都o(jì)k了,但是每個(gè)庫的表還是太大了宜鸯,那么你就分表人灼,將這個(gè)表分開,保證每個(gè)表的數(shù)據(jù)量并不是很大顾翼。
5.兩種分庫分表方式
①range方式
就是每個(gè)庫一段連續(xù)的數(shù)據(jù),這個(gè)一般是按比如時(shí)間范圍來的奈泪,但是這種一般較少用适贸,因?yàn)楹苋菀桩a(chǎn)生熱點(diǎn)問題,大量的流量都打在最新的數(shù)據(jù)上了涝桅。
range來分拜姿,好處在于說,后面擴(kuò)容的時(shí)候冯遂,就很容易蕊肥,因?yàn)槟阒灰A(yù)備好,給每個(gè)月都準(zhǔn)備一個(gè)庫就可以了蛤肌,到了一個(gè)新的月份的時(shí)候壁却,自然而然,就會(huì)寫新的庫了裸准;缺點(diǎn)展东,但是大部分的請(qǐng)求,都是訪問最新的數(shù)據(jù)炒俱。實(shí)際生產(chǎn)用range盐肃,要看場景,你的用戶不是僅僅訪問最新的數(shù)據(jù)权悟,而是均勻的訪問現(xiàn)在的數(shù)據(jù)以及歷史的數(shù)據(jù)
②hash方式
按照某個(gè)字段hash一下均勻分散砸王,這個(gè)較為常用。
hash分法峦阁,好處在于說谦铃,可以平均分配沒給庫的數(shù)據(jù)量和請(qǐng)求壓力;壞處在于說擴(kuò)容起來比較麻煩拇派,會(huì)有一個(gè)數(shù)據(jù)遷移的這么一個(gè)過程