小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

大規(guī)模IM用戶數(shù)據(jù)分庫分表之二叉樹分庫分表

 WindySky 2017-11-23

1、起因

        互聯(lián)網(wǎng)發(fā)展帶來來了數(shù)據(jù)量巨增,單數(shù)據(jù)無法解決,導致出現(xiàn)了數(shù)據(jù)庫分庫和分表,其主要目的是為突破單節(jié)點數(shù)據(jù)庫服務器的 I/O 能力限制,解決數(shù)據(jù)庫擴展性問題。但是分庫和分表帶來的問題是業(yè)務數(shù)據(jù)的一致性,線性可擴展性,管理的復雜性和容錯性帶來了很大的挑戰(zhàn)。

       本文討論的數(shù)據(jù)庫分表是不改變數(shù)據(jù)庫表結(jié)構(gòu)的水平拆分,不討論業(yè)務的按照縱向拆分。水平拆分數(shù)據(jù)分庫和分表的核心問題是表的ID唯一,然后根據(jù)唯一的ID映射到一個物理存儲位置,這個映射方案要考慮到滿足數(shù)據(jù)量暴增線性擴展和業(yè)務上容易保持一致,本文主要討論分庫分表如何映射的問題。

2、分庫分表常見方式分析

2.1最簡單方法

1、按照時間分表,這種情況尤其對于歷史數(shù)據(jù)

2、簡單分庫分表,一張表存數(shù)據(jù)和庫的關(guān)系,一張表保存詳細信息,舉例:用戶表分庫,可以分為二張表:表1(用戶ID,數(shù)據(jù)庫ID),表2(用戶ID,用戶基本信息)。

這二種情況對于小規(guī)模的應用能滿足絕大多數(shù)的應用。

2.2直接映射

原理:直接根據(jù)主鍵的ID通過一次映射到一個物理存儲位置上。用戶訪問數(shù)據(jù)庫直接根據(jù)映射方法可以訪問,但是如果物理節(jié)點有變化,訪問組件也要變化。

按區(qū)間分表

比如用戶0--1000W第一張表,1000W到2000W第二張表,…….

優(yōu)點:按照范圍容易管理,如果主鍵ID包括時間信息,一定程度上可以做區(qū)間范圍統(tǒng)計方便

缺點:不能滿足發(fā)展初期的數(shù)據(jù)的均勻分布,小于1000W無法利用物理機器的IO和CPU能力(假設每張表都對立于一個物理db)

 

取模映射

比如:ID%4映射,數(shù)據(jù)分布到4個節(jié)點上,每個節(jié)點上可以按照時間來進行重新分表

優(yōu)點:數(shù)據(jù)分布比較均勻

缺點:增加節(jié)點后,數(shù)據(jù)的重新分布非常麻煩

 

2.3空間映射

原理:主鍵ID映射到一個虛擬空間,虛擬空間再和物理存儲有一個映射關(guān)系。訪問數(shù)據(jù)分為二個階段,根據(jù)ID映射獲得對應的虛擬地址,然后根據(jù)虛擬地址到物理地址轉(zhuǎn)換,有點像操作系統(tǒng)訪問虛擬存儲,擴展性增大。

 

一致性hash分表

將ID映射到一個虛擬空間,然后虛擬空間映射到物理節(jié)點。一致性hash也可以看做是按區(qū)間分表,在0-2^32之間創(chuàng)建幾個節(jié)點,節(jié)點可以看做是表,同時增加虛擬節(jié)點(對0-2^32分成多個區(qū)間段,然后多個區(qū)間段分別指定到幾個表中)來保證各表的數(shù)據(jù)基本均衡

優(yōu)點:數(shù)據(jù)的均勻性和可擴展性較直接映射較大改進

缺點:空間映射的方式維護起來困難,數(shù)據(jù)遷移麻煩

 

二叉樹分表:

統(tǒng)一對2取模,left節(jié)點庫存放可整除的數(shù)據(jù),right存放不可被2整除的數(shù)據(jù)。如果某個節(jié)點壓力較大則對該節(jié)點繼續(xù)二叉,同時對分庫指標加固定前綴或后綴,再hash對2取模。這樣的話就可以避免添加表的時候全部數(shù)據(jù)要從新分配,也節(jié)省了維護成本。

優(yōu)點:樹節(jié)點可以是物理節(jié)點,也可以是表,初期可以可以考慮少量的物理庫,每個庫上和多表,當物理能力受限后,將對應的表遷移出去

缺點:如果設計不合理,同時存在每個節(jié)點都需要分裂的情況下,比較麻煩。另外一開始最好將所有的表都規(guī)劃出來,否則的話,分裂的時候需要dba耗費較多的時間進行數(shù)據(jù)遷移。

 

3、二叉樹分庫分表舉例

這種方式是現(xiàn)在常見通用的方式,下面詳細舉例:

虛擬結(jié)構(gòu):8張物理表,按照二叉樹的排列如下

image


初期:

初期規(guī)劃:2臺物理機器,0/4相關(guān)的節(jié)點在機器A上,5/8相關(guān)的數(shù)據(jù)在物理機器B上,

A機器有0、1、2、4張表,B機器有5、6、7、8表。1/2,3/4,5/6,7/8都為虛擬節(jié)點


映射:ID通過%2映射到物理機器上,然后剩下的部分%4映射到對應的表上。

比如:(18%4)/2=0,選擇物理機為A,(18%4)=2,選擇表為2,實際存儲的位置為物理機A的表2


查找過程:從根節(jié)點,查找到物理節(jié)點,確定物理機器;查找到表節(jié)點為表節(jié)點,其中忽略虛擬節(jié)點;然后訪問物理節(jié)點上的表。


image


擴容:

物理機B(5/8)節(jié)點負載大,需要擴容,那么增加物理機C(7/8),

映射過程:映射過程不變。

數(shù)據(jù)遷移:將表7和表8遷移到物理機器C上,物理機器B上只保留5/6二張表

查找過程:舉例(查找表7),訪問路徑1/8---->5/8--->7/8(節(jié)點C),最終在節(jié)點C上找到表7

image

 

邏輯庫和物理庫映射:

邏輯庫:綠色的節(jié)點

物理庫:紅色的節(jié)點

映射過程:業(yè)務ID--->邏輯庫,邏輯庫--->物理庫

 

前置條件:當前方案數(shù)據(jù)ID要保證全局唯一

 

4、總結(jié)

如果數(shù)據(jù)庫切分方案發(fā)生變化,那么現(xiàn)網(wǎng)升級也是一個麻煩的事情,如何平滑升級。網(wǎng)絡上分庫分表文章很多,但都不是特別好,唯一推薦的文章是蘑菇街九如的文章,見:http://sanwen8.cn/p/3334qPr.html,有很大的參考價值。其實當前分庫分表大體的方法都比較相似。  

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多