日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
1對(duì)多業(yè)務(wù),數(shù)據(jù)庫(kù)水平切分架構(gòu)一次搞定

本文將以“帖子中心”為例,介紹“1對(duì)多”類業(yè)務(wù),隨著數(shù)據(jù)量的逐步增大,數(shù)據(jù)庫(kù)性能顯著降低,數(shù)據(jù)庫(kù)水平切分相關(guān)的架構(gòu)實(shí)踐:

成都創(chuàng)新互聯(lián)公司作為成都網(wǎng)站建設(shè)公司,專注成都網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計(jì),有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問(wèn)題,行業(yè)涉及成都主動(dòng)防護(hù)網(wǎng)等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

  • 如何來(lái)實(shí)施水平切分
  • 水平切分后常見(jiàn)的問(wèn)題
  • 典型問(wèn)題的優(yōu)化思路及實(shí)踐

一、什么是1對(duì)多關(guān)系

所謂的“1對(duì)1”,“1對(duì)多”,“多對(duì)多”,來(lái)自數(shù)據(jù)庫(kù)設(shè)計(jì)中的“實(shí)體-關(guān)系”ER模型,用來(lái)描述實(shí)體之間的映射關(guān)系。

1對(duì)1

  • 一個(gè)用戶只有一個(gè)登錄名,一個(gè)登錄名只對(duì)應(yīng)一個(gè)用戶
  • 一個(gè)uid對(duì)應(yīng)一個(gè)login_name,一個(gè)login_name只對(duì)應(yīng)一個(gè)uid

這是一個(gè)1對(duì)1的關(guān)系。

1對(duì)多

  • 一個(gè)用戶可以發(fā)多條微博,一條微博只有一個(gè)發(fā)送者
  • 一個(gè)uid對(duì)應(yīng)多個(gè)msg_id,一個(gè)msg_id只對(duì)應(yīng)一個(gè)uid

這是一個(gè)1對(duì)多的關(guān)系。

多對(duì)多

  • 一個(gè)用戶可以關(guān)注多個(gè)用戶
  • 一個(gè)用戶也可以被多個(gè)粉絲關(guān)注

這是一個(gè)多對(duì)多的關(guān)系。

二、帖子中心業(yè)務(wù)分析

帖子中心是一個(gè)典型的1對(duì)多業(yè)務(wù)。

一個(gè)用戶可以發(fā)布多個(gè)帖子,一個(gè)帖子只對(duì)應(yīng)一個(gè)發(fā)布者。

任何脫離業(yè)務(wù)的架構(gòu)設(shè)計(jì)都是耍流氓,先來(lái)看看帖子中心對(duì)應(yīng)的業(yè)務(wù)需求。

帖子中心,是一個(gè)提供帖子發(fā)布/修改/刪除/查看/搜索的服務(wù)。

寫操作:

  • 發(fā)布(insert)帖子
  • 修改(update)帖子
  • 刪除(delete)帖子

讀操作:

  • 通過(guò)tid查詢(select)帖子實(shí)體,單行查詢
  • 通過(guò)uid查詢(select)用戶發(fā)布過(guò)的帖子,列表查詢
  • 帖子檢索(search),例如通過(guò)時(shí)間、標(biāo)題、內(nèi)容搜索符合條件的帖子

在數(shù)據(jù)量較大,并發(fā)量較大的時(shí)候,通常通過(guò)元數(shù)據(jù)與索引數(shù)據(jù)分離的架構(gòu)來(lái)滿足不同類型的需求:

架構(gòu)中的幾個(gè)關(guān)鍵點(diǎn):

  • tiezi-center:帖子服務(wù)
  • tiezi-db:提供元數(shù)據(jù)存儲(chǔ)
  • tiezi-search:帖子搜索服務(wù)
  • tiezi-index:提供索引數(shù)據(jù)存儲(chǔ)
  • MQ:tiezi-center與tiezi-search通訊媒介,一般不直接使用RPC調(diào)用,而是通過(guò)MQ對(duì)兩個(gè)子系統(tǒng)解耦(為何這么解耦,請(qǐng)參見(jiàn)《到底什么時(shí)候該使用MQ?》)

其中,tiezi-center和tiezi-search分別滿足兩類不同的讀需求:

如上圖所示:

  • tid和uid上的查詢需求,可以由tiezi-center從元數(shù)據(jù)讀取并返回
  • 其他類檢索需求,可以由tiezi-search從索引數(shù)據(jù)檢索并返回

對(duì)于寫需求:

如上圖所示:

  • 增加,修改,刪除的操作都會(huì)從tiezi-center發(fā)起
  • tiezi-center修改元數(shù)據(jù)
  • tiezi-center將信息修改通知發(fā)送給MQ
  • tiezi-search從MQ接受修改信息
  • tiezi-search修改索引數(shù)據(jù)

tiezi-search,搜索架構(gòu)不是本文的重點(diǎn)(外置索引架構(gòu)設(shè)計(jì),請(qǐng)參見(jiàn)《100億數(shù)據(jù)1萬(wàn)屬性數(shù)據(jù)架構(gòu)設(shè)計(jì)》),后文將重點(diǎn)描述帖子中心元數(shù)據(jù)這一塊的水平切分設(shè)計(jì)。

三、帖子中心元數(shù)據(jù)設(shè)計(jì)

通過(guò)帖子中心業(yè)務(wù)分析,很容易了解到,其核心元數(shù)據(jù)為:

 
 
 
 
  1. Tiezi(tid, uid, time, title, content, …); 

其中:

  • tid為帖子ID,主鍵
  • uid為用戶ID,發(fā)帖人
  • time, title, content …等為帖子屬性

數(shù)據(jù)庫(kù)設(shè)計(jì)上,在業(yè)務(wù)初期,單庫(kù)就能滿足元數(shù)據(jù)存儲(chǔ)要求,其典型的架構(gòu)設(shè)計(jì)為:

  • tiezi-center:帖子中心服務(wù),對(duì)調(diào)用者提供友好的RPC接口
  • tiezi-db:對(duì)帖子數(shù)據(jù)進(jìn)行存儲(chǔ)

在相關(guān)字段上建立索引,就能滿足相關(guān)業(yè)務(wù)需求:

  • 帖子記錄查詢,通過(guò)tid查詢,約占讀請(qǐng)求量90%
  •   
      
      
      
    1. select * from t_tiezi where tid=$tid 
  • 帖子列表查詢,通過(guò)uid查詢其發(fā)布的所有帖子,約占讀請(qǐng)求量10%
  •   
      
      
      
    1. select * from t_tiezi where uid=$uid 

四、帖子中心水平切分-tid切分法

當(dāng)數(shù)據(jù)量越來(lái)越大時(shí),需要對(duì)帖子數(shù)據(jù)的存儲(chǔ)進(jìn)行線性擴(kuò)展。

既然是帖子中心,并且帖子記錄查詢量占了總請(qǐng)求的90%,很容易想到通過(guò)tid字段取模來(lái)進(jìn)行水平切分:

這個(gè)方法簡(jiǎn)單直接,優(yōu)點(diǎn):

  • 100%寫請(qǐng)求可以直接定位到庫(kù)
  • 90%的讀請(qǐng)求可以直接定位到庫(kù)

缺點(diǎn):

  • 一個(gè)用戶發(fā)布的所有帖子可能會(huì)落到不同的庫(kù)上,10%的請(qǐng)求通過(guò)uid來(lái)查詢會(huì)比較麻煩

如上圖,一個(gè)uid訪問(wèn)需要遍歷所有庫(kù)。

五、帖子中心水平切分-uid切分法

有沒(méi)有一種切分方法,確保同一個(gè)用戶發(fā)布的所有帖子都落在同一個(gè)庫(kù)上,而在查詢一個(gè)用戶發(fā)布的所有帖子時(shí),不需要去遍歷所有的庫(kù)呢?

答:使用uid來(lái)分庫(kù)可以解決這個(gè)問(wèn)題。

新出現(xiàn)的問(wèn)題:如果使用uid來(lái)分庫(kù),確保了一個(gè)用戶的帖子數(shù)據(jù)落在同一個(gè)庫(kù)上,那通過(guò)tid來(lái)查詢,就不知道這個(gè)帖子落在哪個(gè)庫(kù)上了,豈不是還需要遍歷全庫(kù),需要怎么優(yōu)化呢?

答:tid的查詢是單行記錄查詢,只要在數(shù)據(jù)庫(kù)(或者緩存)記錄tid到uid的映射關(guān)系,就能解決這個(gè)問(wèn)題。

新增一個(gè)索引庫(kù):

 
 
 
 
  1. t_mapping(tid, uid); 
  • 這個(gè)庫(kù)只有兩列,可以承載很多數(shù)據(jù)
  • 即使數(shù)據(jù)量過(guò)大,索引庫(kù)可以利用tid水平切分
  • 這類kv形式的索引結(jié)構(gòu),可以很好的利用cache優(yōu)化查詢性能
  • 一旦帖子發(fā)布,tid和uid的映射關(guān)系就不會(huì)發(fā)生變化,cache的***率會(huì)非常高

使用uid分庫(kù),并增加索引庫(kù)記錄tid到uid的映射關(guān)系之后,每當(dāng)有uid上的查詢:

可以通過(guò)uid直接定位到庫(kù)。

每當(dāng)有tid上的查詢:

  • 先查詢索引表,通過(guò)tid查詢到對(duì)應(yīng)的uid
  • 再通過(guò)uid定位到庫(kù)

這個(gè)方法的優(yōu)點(diǎn):

  • 一個(gè)用戶發(fā)布的所以帖子落在同一個(gè)庫(kù)上
  • 10%的請(qǐng)求過(guò)過(guò)uid來(lái)查詢列表,可以直接定位到庫(kù)
  • 索引表cache***率非常高,因?yàn)閠id與uid的映射關(guān)系不會(huì)變

缺點(diǎn):

  • 90%的tid請(qǐng)求,以及100%的修改請(qǐng)求,不能直接定位到庫(kù),需要先進(jìn)行一次索引表的查詢,當(dāng)然這個(gè)查詢非常塊,通常在5ms內(nèi)可以返回
  • 數(shù)據(jù)插入時(shí)需要操作元數(shù)據(jù)與索引表,可能引發(fā)潛在的一致性問(wèn)題

六、帖子中心水平切分-基因法

有沒(méi)有一種方法,既能夠通過(guò)uid定位到庫(kù),又不需要建立索引表來(lái)進(jìn)行二次查詢呢,這就是本文要敘述的“1對(duì)多”業(yè)務(wù)分庫(kù)***實(shí)踐,基因法。

什么是分庫(kù)基因?

通過(guò)uid分庫(kù),假設(shè)分為16個(gè)庫(kù),采用uid%16的方式來(lái)進(jìn)行數(shù)據(jù)庫(kù)路由,這里的uid%16,其本質(zhì)是uid的***4個(gè)bit決定這行數(shù)據(jù)落在哪個(gè)庫(kù)上,這4個(gè)bit,就是分庫(kù)基因。

什么是基因法分庫(kù)?

在“1對(duì)多”的業(yè)務(wù)場(chǎng)景,使用“1”分庫(kù),在“多”的數(shù)據(jù)id生成時(shí),id末端加入分庫(kù)基因,就能同時(shí)滿足“1”和“多”的分庫(kù)查詢需求。

如上圖所示,uid=666的用戶發(fā)布了一條帖子(666的二進(jìn)制表示為:1010011010):

  • 使用uid%16分庫(kù),決定這行數(shù)據(jù)要插入到哪個(gè)庫(kù)中
  • 分庫(kù)基因是uid的***4個(gè)bit,即1010
  • 在生成tid時(shí),先使用一種分布式ID生成算法生成前60bit(上圖中綠色部分)
  • 將分庫(kù)基因加入到tid的***4個(gè)bit(上圖中粉色部分)
  • 拼裝成最終的64bit帖子tid(上圖中藍(lán)色部分)

(怎么生成60bit分布式唯一ID,請(qǐng)參見(jiàn)《分布式ID生成算法》)

這般,保證了同一個(gè)用戶發(fā)布的所有帖子的tid,都落在同一個(gè)庫(kù)上,tid的***4個(gè)bit都相同,于是:

  • 通過(guò)uid%16能夠定位到庫(kù)
  • 通過(guò)tid%16也能定位到庫(kù)

潛在問(wèn)題一:同一個(gè)uid發(fā)布的tid落在同一個(gè)庫(kù)上,會(huì)不會(huì)出現(xiàn)數(shù)據(jù)不均衡?

答:只要uid是均衡的,每個(gè)用戶發(fā)布的平均帖子數(shù)是均衡的,每個(gè)庫(kù)的數(shù)據(jù)就是均衡的。

潛在問(wèn)題二:最開(kāi)始分16庫(kù),分庫(kù)基因是4bit,未來(lái)要擴(kuò)充成32庫(kù),分庫(kù)基因變成了5bit,那怎么辦?

答:需要提前做好容量預(yù)估,例如事先規(guī)劃好5年內(nèi)數(shù)據(jù)增長(zhǎng)256庫(kù)足夠,就提前預(yù)留8bit基因。

七、總結(jié)

將以“帖子中心”為典型的“1對(duì)多”類業(yè)務(wù),在架構(gòu)上,采用元數(shù)據(jù)與索引數(shù)據(jù)分離的架構(gòu)設(shè)計(jì)方法:

  • 帖子服務(wù),元數(shù)據(jù)滿足uid和tid的查詢需求
  • 搜索服務(wù),索引數(shù)據(jù)滿足復(fù)雜搜索尋求

對(duì)于元數(shù)據(jù)的存儲(chǔ),在數(shù)據(jù)量較大的情況下,有三種常見(jiàn)的切分方法:

  • tid切分法,按照tid分庫(kù),同一個(gè)用戶發(fā)布的帖子落在不同的庫(kù)上,通過(guò)uid來(lái)查詢要遍歷所有庫(kù)
  • uid切分法,按照uid分庫(kù),同一個(gè)用戶發(fā)布的帖子落在同一個(gè)庫(kù)上,需要通過(guò)索引表或者緩存來(lái)記錄tid與uid的映射關(guān)系,通過(guò)tid來(lái)查詢時(shí),先查到uid,再通過(guò)uid定位庫(kù)
  • 基因法,按照uid分庫(kù),在生成tid里加入uid上的分庫(kù)基因,保證通過(guò)uid和tid都能直接定位到庫(kù)

對(duì)于1對(duì)多的業(yè)務(wù)場(chǎng)景,分庫(kù)架構(gòu)不再是瓶頸。

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


當(dāng)前標(biāo)題:1對(duì)多業(yè)務(wù),數(shù)據(jù)庫(kù)水平切分架構(gòu)一次搞定
分享路徑:http://www.dlmjj.cn/article/dpdhioc.html