数据库架构中的基本概念
一、單庫(kù)架構(gòu)
單庫(kù)架構(gòu),是業(yè)務(wù)初期最常見(jiàn)的數(shù)據(jù)庫(kù)架構(gòu)。
-
user-service:用戶中心服務(wù),對(duì)調(diào)用者提供友好的RPC接口
-
user-db:一個(gè)庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ)
?
二、分組架構(gòu)
數(shù)據(jù)庫(kù)分組架構(gòu),即最常見(jiàn)的一主多從,主從同步,讀寫(xiě)分離數(shù)據(jù)庫(kù)架構(gòu):
-
user-service:依舊是用戶中心服務(wù)
-
user-db-M(master):主庫(kù),提供數(shù)據(jù)庫(kù)寫(xiě)服務(wù)
-
user-db-S(slave):從庫(kù),提供數(shù)據(jù)庫(kù)讀服務(wù)
主和從構(gòu)成的數(shù)據(jù)庫(kù)集群稱為“一組”。
?
同一個(gè)組里的數(shù)據(jù)庫(kù)集群:
-
主從之間通過(guò)binlog進(jìn)行數(shù)據(jù)同步
-
多個(gè)實(shí)例數(shù)據(jù)庫(kù)結(jié)構(gòu)完全相同
-
多個(gè)實(shí)例存儲(chǔ)的數(shù)據(jù)也完全相同,本質(zhì)上是將數(shù)據(jù)進(jìn)行復(fù)制
?
數(shù)據(jù)庫(kù)分組架構(gòu)究竟解決什么問(wèn)題?
大部分互聯(lián)網(wǎng)業(yè)務(wù)讀多寫(xiě)少,數(shù)據(jù)庫(kù)的讀往往最先成為性能瓶頸,如果希望:
-
線性提升數(shù)據(jù)庫(kù)讀性能
-
通過(guò)消除讀寫(xiě)鎖沖突提升數(shù)據(jù)庫(kù)寫(xiě)性能
-
通過(guò)冗余從庫(kù)實(shí)現(xiàn)數(shù)據(jù)的“讀高可用”
此時(shí)可以使用分組架構(gòu),需要注意的是,分組架構(gòu)中,數(shù)據(jù)庫(kù)的主庫(kù)依然是寫(xiě)單點(diǎn)。
?
一句話總結(jié),分組解決的是“數(shù)據(jù)庫(kù)讀寫(xiě)高并發(fā)量高”問(wèn)題,常實(shí)施的架構(gòu)設(shè)計(jì)。
?
三、分片架構(gòu)
數(shù)據(jù)庫(kù)分片架構(gòu),是大伙最常說(shuō)的水平切分(sharding):
-
user-service:依舊是用戶中心服務(wù)
-
user-db1:水平切分成2份中的第一份
-
user-db2:水平切分成2份中的第二份
分片后,多個(gè)數(shù)據(jù)庫(kù)實(shí)例也會(huì)構(gòu)成一個(gè)數(shù)據(jù)庫(kù)集群。
?
水平切分,到底是分庫(kù)還是分表?
強(qiáng)烈建議分庫(kù),因?yàn)?#xff1a;
-
分表依然公用一個(gè)數(shù)據(jù)庫(kù)文件,仍然有磁盤(pán)IO的競(jìng)爭(zhēng)
-
分庫(kù)能夠很容易的將數(shù)據(jù)遷移到不同數(shù)據(jù)庫(kù)實(shí)例,甚至數(shù)據(jù)庫(kù)機(jī)器上,擴(kuò)展性更好
畫(huà)外音:當(dāng)然,分庫(kù)后,數(shù)據(jù)庫(kù)連接數(shù)會(huì)更多。
如何進(jìn)行水平切分?
常見(jiàn)的方法是“范圍法”和“哈希法”:
范圍法如上,以用戶中心的業(yè)務(wù)主鍵uid為劃分依據(jù),將數(shù)據(jù)水平切分到兩個(gè)數(shù)據(jù)庫(kù)實(shí)例上去。
?
哈希法如,也是以用戶中心的業(yè)務(wù)主鍵uid為劃分依據(jù),將數(shù)據(jù)水平切分到兩個(gè)數(shù)據(jù)庫(kù)實(shí)例上去。
畫(huà)外音:本例中哈希算法是“取模”。
哈希法在互聯(lián)網(wǎng)數(shù)據(jù)庫(kù)架構(gòu)中,使用較為廣泛。
?
分片架構(gòu),同一個(gè)集群里的各個(gè)分片:
-
多個(gè)實(shí)例之間本身不直接產(chǎn)生聯(lián)系,不像主從間有binlog同步
-
多個(gè)實(shí)例數(shù)據(jù)庫(kù)結(jié)構(gòu),也完全相同
-
多個(gè)實(shí)例存儲(chǔ)的數(shù)據(jù)之間沒(méi)有交集,所有實(shí)例間數(shù)據(jù)并集構(gòu)成全局?jǐn)?shù)據(jù)
?
分片架構(gòu)究竟解決什么問(wèn)題?
大部分互聯(lián)網(wǎng)業(yè)務(wù)數(shù)據(jù)量很大,單庫(kù)容量容易成為瓶頸,此時(shí)通過(guò)分片可以:
-
線性提升數(shù)據(jù)庫(kù)寫(xiě)性能,需要注意的是,分組架構(gòu)是不能線性提升數(shù)據(jù)庫(kù)寫(xiě)性能的
-
降低單庫(kù)數(shù)據(jù)容量
?
一句話總結(jié),分片解決的是“數(shù)據(jù)庫(kù)數(shù)據(jù)量大”問(wèn)題,常實(shí)施的架構(gòu)設(shè)計(jì)。
?
四、分組+分片架構(gòu)
如果業(yè)務(wù)讀寫(xiě)并發(fā)量很高,數(shù)據(jù)量也很大,通常需要實(shí)施分組+分片的數(shù)據(jù)庫(kù)架構(gòu):
-
通過(guò)分片來(lái)降低單庫(kù)的數(shù)據(jù)量,線性提升數(shù)據(jù)庫(kù)的寫(xiě)性能
-
通過(guò)分組來(lái)線性提升數(shù)據(jù)庫(kù)的讀性能,保證讀庫(kù)的高可用
畫(huà)外音:大部分線上的真實(shí)架構(gòu),是這樣子的。
五、垂直切分
數(shù)據(jù)庫(kù)垂直切分,也是一類常見(jiàn)的數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì),垂直切分一般和業(yè)務(wù)結(jié)合比較緊密。
還是以用戶中心為例,可以這么進(jìn)行垂直切分:
User_Base(uid, uname, passwd, sex, age, …)
User_EX(uid, intro, sign, …)
-
垂直切分開(kāi)的表,主鍵都是uid
-
登錄名,密碼,性別,年齡等屬性放在一個(gè)垂直表(庫(kù))里
-
自我介紹,個(gè)人簽名等屬性放在另一個(gè)垂直表(庫(kù))里
?
如何進(jìn)行垂直切分?
根據(jù)業(yè)務(wù)對(duì)數(shù)據(jù)進(jìn)行垂直切分時(shí),一般要考慮屬性的“長(zhǎng)度”和“訪問(wèn)頻度”兩個(gè)因素:
-
長(zhǎng)度較短,訪問(wèn)頻率較高的放在一起
-
長(zhǎng)度較長(zhǎng),訪問(wèn)頻度較低的放在一起
這是因?yàn)?#xff0c;數(shù)據(jù)庫(kù)會(huì)以行(row)為單位,將數(shù)load到內(nèi)存(buffer)里,在內(nèi)存容量有限的情況下,長(zhǎng)度短且訪問(wèn)頻度高的屬性,內(nèi)存能夠load更多的數(shù)據(jù),命中率會(huì)更高,磁盤(pán)IO會(huì)減少,數(shù)據(jù)庫(kù)的性能會(huì)提升。
?
垂直切分和水平切有相似的地方,又不太相同:
-
多個(gè)實(shí)例之間也不直接產(chǎn)生聯(lián)系,即沒(méi)有binlog同步
-
多個(gè)實(shí)例數(shù)據(jù)庫(kù)結(jié)構(gòu),都不一樣
-
多個(gè)實(shí)例存儲(chǔ)的數(shù)據(jù)之間至少有一列交集,一般來(lái)說(shuō)是業(yè)務(wù)主鍵,所有實(shí)例間數(shù)據(jù)并集構(gòu)成全局?jǐn)?shù)據(jù)
?
垂直切分解決什么問(wèn)題?
垂直切分即可以降低單庫(kù)的數(shù)據(jù)量,還可以降低磁盤(pán)IO從而提升吞吐量,但它與業(yè)務(wù)結(jié)合比較緊密,并不是所有業(yè)務(wù)都能夠進(jìn)行垂直切分的。
?
文章較長(zhǎng),簡(jiǎn)單總結(jié):
-
業(yè)務(wù)初期用單庫(kù)
-
讀壓力大,讀高可用,用分組
-
數(shù)據(jù)量大,寫(xiě)線性擴(kuò)容,用分片
-
屬性短,訪問(wèn)頻度高的屬性,垂直拆分到一起
總結(jié)
以上是生活随笔為你收集整理的数据库架构中的基本概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [源码和文档分享]基于Power Bul
- 下一篇: js时间戳转换日期,日期转换时间戳