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張物理表,按照二叉樹的排列如下
初期: 初期規(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é)點上的表。
擴容: 物理機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
邏輯庫和物理庫映射: 邏輯庫:綠色的節(jié)點 物理庫:紅色的節(jié)點 映射過程:業(yè)務ID--->邏輯庫,邏輯庫--->物理庫
前置條件:當前方案數(shù)據(jù)ID要保證全局唯一
4、總結(jié)如果數(shù)據(jù)庫切分方案發(fā)生變化,那么現(xiàn)網(wǎng)升級也是一個麻煩的事情,如何平滑升級。網(wǎng)絡上分庫分表文章很多,但都不是特別好,唯一推薦的文章是蘑菇街九如的文章,見:http://sanwen8.cn/p/3334qPr.html,有很大的參考價值。其實當前分庫分表大體的方法都比較相似。 |
|
|