為何分表
當(dāng)一張表的數(shù)據(jù)達(dá)到千萬(wàn)級(jí)時(shí)甚至億級(jí)時(shí)伦乔,查詢一次所花的時(shí)間會(huì)變多芦缰,如果有聯(lián)合查詢的話可能會(huì)死在那兒了。分表的目的就在于此价捧,減小數(shù)據(jù)庫(kù)的負(fù)擔(dān)丑念,縮短查詢時(shí)間。
大數(shù)據(jù)量并且訪問(wèn)頻繁的表结蟋,將其分為若干個(gè)表:
? ? ? ?比如對(duì)于某些網(wǎng)站平臺(tái)的數(shù)據(jù)庫(kù)表脯倚,數(shù)據(jù)量很大,這種能預(yù)估出來(lái)的大數(shù)據(jù)量表嵌屎,我們就事先分出個(gè)N個(gè)表推正,這個(gè)N是多少,根據(jù)實(shí)際情況而定宝惰。
??某網(wǎng)站現(xiàn)在的數(shù)據(jù)量假設(shè)是5000萬(wàn)條植榕,可以設(shè)計(jì)每張表容納的數(shù)據(jù)量是500萬(wàn)條,也就是拆分成10張表尼夺。
? ? ? ?那么如何判斷某張表的數(shù)據(jù)是否容量已滿呢?可以在程序段對(duì)于要新增數(shù)據(jù)的表尊残,在插入前先做統(tǒng)計(jì)表記錄數(shù)量的操作炒瘸,當(dāng)<500萬(wàn)條數(shù)據(jù),就直接插入寝衫,當(dāng)已經(jīng)到達(dá)閥值顷扩,可以在程序段新創(chuàng)建數(shù)據(jù)庫(kù)表(自動(dòng)擴(kuò)容),再執(zhí)行插入操作慰毅。
數(shù)據(jù)庫(kù)架構(gòu)
1.簡(jiǎn)單的數(shù)據(jù)庫(kù)(PG/MySQL)主從復(fù)制:
數(shù)據(jù)庫(kù)的主從復(fù)制解決了數(shù)據(jù)庫(kù)的讀寫(xiě)分離屎即,(一主多備)能很好的提升讀的性能,其圖如下:
但是事富,主從復(fù)制也帶來(lái)其他一系列性能瓶頸問(wèn)題:
:---------:1.寫(xiě)入無(wú)法擴(kuò)展
:---------:2.寫(xiě)入無(wú)法緩存
:---------:3.復(fù)制延時(shí)
:---------:4.鎖表率上升
:---------:5.表變大技俐,緩存率下降
那問(wèn)題產(chǎn)生總得解決的,這就產(chǎn)生下面的優(yōu)化方案统台,一起來(lái)看看雕擂。
1、垂直分區(qū)
如果把業(yè)務(wù)切割得足夠獨(dú)立贱勃,那把不同業(yè)務(wù)的數(shù)據(jù)放到不同的數(shù)據(jù)庫(kù)服務(wù)器將是一個(gè)不錯(cuò)的方案井赌,而且萬(wàn)一其中一個(gè)業(yè)務(wù)崩潰了也不會(huì)影響其他業(yè)務(wù)的正常進(jìn)行,并且也起到了負(fù)載分流的作用贵扰,大大提升了數(shù)據(jù)庫(kù)的吞吐能力仇穗。經(jīng)過(guò)垂直分區(qū)后的數(shù)據(jù)庫(kù)架構(gòu)圖如下:
已經(jīng)足夠獨(dú)立了,但是有些業(yè)務(wù)之間或多或少總會(huì)有點(diǎn)聯(lián)系戚绕,如用戶纹坐,基本上都會(huì)和每個(gè)業(yè)務(wù)存在關(guān)聯(lián),況且這種分區(qū)方式舞丛,也不能解決單張表數(shù)據(jù)量暴漲的問(wèn)題耘子。
2、水平分區(qū)(Sharding)
將用戶按一定規(guī)則(按id哈希)分組球切,并把該組用戶的數(shù)據(jù)存儲(chǔ)到一個(gè)數(shù)據(jù)庫(kù)分片中谷誓,即一個(gè)sharding,這樣隨著用戶數(shù)量的增加吨凑,只要簡(jiǎn)單地配置一臺(tái)服務(wù)器即可捍歪,原理圖如下:
如何來(lái)確定某個(gè)用戶所在的shard呢,這個(gè)時(shí)候我們可以建一張用戶和shard對(duì)應(yīng)的數(shù)據(jù)表鸵钝,每次請(qǐng)求先從這張表找用戶的shard id糙臼,再?gòu)膶?duì)應(yīng)shard中查詢相關(guān)數(shù)據(jù),如下圖所示:
單庫(kù)單表
單庫(kù)單表是最常見(jiàn)的數(shù)據(jù)庫(kù)設(shè)計(jì)蒋伦,例如弓摘,有一張用戶(user)表放在數(shù)據(jù)庫(kù)db中,所有的用戶都可以在db庫(kù)中的user表中查到
單庫(kù)多表
??隨著用戶數(shù)量的增加痕届,user表的數(shù)據(jù)量會(huì)越來(lái)越大韧献,當(dāng)數(shù)據(jù)量達(dá)到一定程度的時(shí)候?qū)ser表的查詢會(huì)漸漸的變慢,從而影響整個(gè)DB的性能研叫。還有一個(gè)更嚴(yán)重的問(wèn)題是锤窑,事務(wù)提交會(huì)鎖表,期間所有的讀寫(xiě)操作只能等待嚷炉。
一主多備
??在實(shí)際的應(yīng)用中渊啰,大部分情況都是讀遠(yuǎn)大于寫(xiě)。DB提供了讀寫(xiě)分離的機(jī)制申屹,所有的寫(xiě)操作都必須對(duì)應(yīng)到Master绘证,讀操作可以在 Master和Slave機(jī)器上進(jìn)行,Slave與Master的結(jié)構(gòu)完全一樣哗讥,一個(gè)Master可以有多個(gè)Slave,甚至Slave下還可以掛 Slave,通過(guò)此方式可以有效的提高DB集群的 QPS.
??所有的寫(xiě)操作都是先在Master上操作嚷那,然后同步更新到Slave上,所以從Master同步到Slave機(jī)器有一定的延遲杆煞,當(dāng)系統(tǒng)很繁忙的時(shí)候魏宽,延遲問(wèn)題會(huì)更加嚴(yán)重,Slave機(jī)器數(shù)量的增加也會(huì)使這個(gè)問(wèn)題更加嚴(yán)重决乎。
此外队询,可以看出Master是集群的瓶頸,當(dāng)寫(xiě)操作過(guò)多构诚,會(huì)嚴(yán)重影響到Master的穩(wěn)定性蚌斩,如果Master掛掉,整個(gè)集群都將不能正常工作范嘱。