自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

典型數(shù)據(jù)庫(kù)的架構(gòu)設(shè)計(jì)與實(shí)踐

開(kāi)發(fā) 開(kāi)發(fā)工具
本文,將介紹數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)中的一些基本概念,常見(jiàn)問(wèn)題以及對(duì)應(yīng)解決方案,為了便于讀者理解,將以“用戶中心”數(shù)據(jù)庫(kù)為例,講解數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)的常見(jiàn)玩法。

一、用戶中心

用戶中心是一個(gè)常見(jiàn)業(yè)務(wù),主要提供用戶注冊(cè)、登錄、信息查詢與修改的服務(wù),其核心元數(shù)據(jù)為:

  1. User(uid, uname, passwd, sex, age,nickname, …) 

其中:

  • uid為用戶ID,主鍵
  • uname, passwd, sex, age, nickname, …等為用戶的屬性

數(shù)據(jù)庫(kù)設(shè)計(jì)上,一般來(lái)說(shuō)在業(yè)務(wù)初期,單庫(kù)單表就能夠搞定這個(gè)需求。

二、圖示說(shuō)明

為了方便大家理解,后文圖片說(shuō)明較多,其中:

  • “灰色”方框,表示service,服務(wù)
  • “紫色”圓框,標(biāo)識(shí)master,主庫(kù)
  • “粉色”圓框,表示slave,從庫(kù)

三、單庫(kù)架構(gòu)

單庫(kù)架構(gòu)

最常見(jiàn)的架構(gòu)設(shè)計(jì)如上:

  • user-service:用戶中心服務(wù),對(duì)調(diào)用者提供友好的RPC接口
  • user-db:一個(gè)庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ)

四、分組架構(gòu)

分組架構(gòu)

1. 什么是分組?

答:分組架構(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ù)集群稱為“組”。

2. 分組有什么特點(diǎn)?

答:同一個(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ù)制

3. 分組架構(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)

分片架構(gòu)

1. 什么是分片?

答:分片架構(gòu)是大伙常說(shuō)的水平切分(sharding)數(shù)據(jù)庫(kù)架構(gòu):

  • 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)椋?/p>

  • 分表依然公用一個(gè)數(shù)據(jù)庫(kù)文件,仍然有磁盤(pán)IO的競(jìng)爭(zhēng)
  • 分庫(kù)能夠很容易的將數(shù)據(jù)遷移到不同數(shù)據(jù)庫(kù)實(shí)例,甚至數(shù)據(jù)庫(kù)機(jī)器上,擴(kuò)展性更好

2. 水平切分,用什么算法?

答:常見(jiàn)的水平切分算法有“范圍法”和“哈希法”:

水平切分算法

范圍法如上圖:以用戶中心的業(yè)務(wù)主鍵uid為劃分依據(jù),將數(shù)據(jù)水平切分到兩個(gè)數(shù)據(jù)庫(kù)實(shí)例上去:

  • user-db1:存儲(chǔ)0到1千萬(wàn)的uid數(shù)據(jù)
  • user-db2:存儲(chǔ)0到2千萬(wàn)的uid數(shù)據(jù)

哈希法

哈希法如上圖:也是以用戶中心的業(yè)務(wù)主鍵uid為劃分依據(jù),將數(shù)據(jù)水平切分到兩個(gè)數(shù)據(jù)庫(kù)實(shí)例上去:

  • user-db1:存儲(chǔ)uid取模得1的uid數(shù)據(jù)
  • user-db2:存儲(chǔ)uid取模得0的uid數(shù)據(jù)

這兩種方法在互聯(lián)網(wǎng)都有使用,其中哈希法使用較為廣泛。

3. 分片有什么特點(diǎn)?

答:同一個(gè)分片里的數(shù)據(jù)庫(kù)集群:

  • 多個(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ù)

4. 分片架構(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)

分組+分片架構(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ù)的高可用

七、垂直切分

除了水平切分,垂直切分也是一類常見(jiàn)的數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì),垂直切分一般和業(yè)務(wù)結(jié)合比較緊密。

垂直切分

還是以用戶中心為例,可以這么進(jìn)行垂直切分:

  1. User(uid, uname, passwd, sex, age, …) 
  2. User_EX(uid, intro, sign, …) 
  • 垂直切分開(kāi)的表,主鍵都是uid
  • 登錄名,密碼,性別,年齡等屬性放在一個(gè)垂直表(庫(kù))里
  • 自我介紹,個(gè)人簽名等屬性放在另一個(gè)垂直表(庫(kù))里

1. 如何進(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)椋瑪?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ì)提升。

2. 垂直切分有什么特點(diǎn)?

答:垂直切分和水平切有相似的地方,又不太相同:

  • 多個(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ù)

3. 垂直切分解決什么問(wèn)題?

答:垂直切分即可以降低單庫(kù)的數(shù)據(jù)量,還可以降低磁盤(pán)IO從而提升吞吐量,但它與業(yè)務(wù)結(jié)合比較緊密,并不是所有業(yè)務(wù)都能夠進(jìn)行垂直切分的。

八、總結(jié)

文章較長(zhǎng),希望至少記住這么幾點(diǎn):

  • 業(yè)務(wù)初期用單庫(kù)
  • 讀壓力大,讀高可用,用分組
  • 數(shù)據(jù)量大,寫(xiě)線性擴(kuò)容,用分片
  • 屬性短,訪問(wèn)頻度高的屬性,垂直拆分到一起

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-06-10 11:13:39

數(shù)據(jù)庫(kù)架構(gòu)數(shù)據(jù)庫(kù)集群

2022-11-22 08:42:38

數(shù)據(jù)庫(kù)

2022-09-01 07:23:53

云原生數(shù)據(jù)庫(kù)Aurora

2017-04-24 11:01:59

MySQL數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)

2016-11-29 08:50:17

數(shù)據(jù)庫(kù)軟件架構(gòu)

2023-08-27 16:11:35

數(shù)據(jù)庫(kù)分布式事務(wù)數(shù)據(jù)庫(kù)

2020-07-10 08:50:37

大數(shù)據(jù)銀行技術(shù)

2017-09-20 09:58:21

數(shù)據(jù)庫(kù)“狀態(tài)”字段設(shè)計(jì)

2022-06-20 09:17:02

數(shù)據(jù)查詢請(qǐng)求數(shù)據(jù)庫(kù)

2011-08-05 12:44:57

Oracle數(shù)據(jù)庫(kù)表空間

2023-02-06 18:35:05

架構(gòu)探測(cè)技術(shù)

2020-03-30 20:14:53

ActiveMQ設(shè)計(jì)實(shí)踐

2023-03-09 09:31:58

架構(gòu)設(shè)計(jì)vivo

2022-02-18 11:13:53

監(jiān)控架構(gòu)系統(tǒng)

2010-09-06 09:24:56

網(wǎng)格數(shù)據(jù)庫(kù)

2024-06-18 08:07:50

存儲(chǔ)架構(gòu)設(shè)計(jì)

2009-06-22 14:48:21

DRY架構(gòu)設(shè)計(jì)

2019-11-19 09:00:00

數(shù)據(jù)庫(kù)架構(gòu)設(shè)計(jì)

2011-07-06 10:49:50

MySQL優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)