大規模IM使用者資料分庫分表之二叉樹分庫分表

2021-07-24 17:59:08 字數 2670 閱讀 1808

網際網路發展帶來來了資料量鉅增,單資料無法解決,導致出現了資料庫分庫和分表,其主要目的是為突破單節點資料庫伺服器的 i/o 能力限制,解決資料庫擴充套件性問題。但是分庫和分表帶來的問題是業務資料的一致性,線性可擴充套件性,管理的複雜性和容錯性帶來了很大的挑戰。

本文討論的資料庫分表是不改變資料庫表結構的水平拆分,不討論業務的按照縱向拆分。水平拆分資料分庫和分表的核心問題是表的id唯一,然後根據唯一的id對映到乙個物理儲存位置,這個對映方案要考慮到滿足資料量暴增線性擴充套件和業務上容易保持一致,本文主要討論分庫分表如何對映的問題。

1、按照時間分表,這種情況尤其對於歷史資料

2、簡單分庫分表,一張表存資料和庫的關係,一張表儲存詳細資訊,舉例:使用者表分庫,可以分為二張表:表1(使用者id,資料庫id),表2(使用者id,使用者基本資訊)。

這二種情況對於小規模的應用能滿足絕大多數的應用。

原理:直接根據主鍵的id通過一次對映到乙個物理儲存位置上。使用者訪問資料庫直接根據對映方法可以訪問,但是如果物理節點有變化,訪問元件也要變化。

按區間分表

比如使用者0--1000w第一張表,1000w到2000w第二張表,…….

優點:按照範圍容易管理,如果主鍵id包括時間資訊,一定程度上可以做區間範圍統計方便

缺點:不能滿足發展初期的資料的均勻分布,小於1000w無法利用物理機器的io和cpu能力(假設每張表都對立於乙個物理db)

取模對映

比如:id%4對映,資料分布到4個節點上,每個節點上可以按照時間來進行重新分表

優點:資料分布比較均勻

缺點:增加節點後,資料的重新分布非常麻煩

原理:主鍵id對映到乙個虛擬空間,虛擬空間再和物理儲存有乙個對映關係。訪問資料分為二個階段,根據id對映獲得對應的虛擬位址,然後根據虛擬位址到實體地址轉換,有點像作業系統訪問虛擬儲存,擴充套件性增大。

一致性hash分表

將id對映到乙個虛擬空間,然後虛擬空間對映到物理節點。一致性hash也可以看做是按區間分表,在0-2^32之間建立幾個節點,節點可以看做是表,同時增加虛擬節點(對0-2^32分成多個區間段,然後多個區間段分別指定到幾個表中)來保證各表的資料基本均衡

優點:資料的均勻性和可擴充套件性較直接對映較大改進

缺點:空間對映的方式維護起來困難,資料遷移麻煩

二叉樹分表:

統一對2取模,left節點庫存放可整除的資料,right存放不可被2整除的資料。如果某個節點壓力較大則對該節點繼續二叉,同時對分庫指標加固定字首或字尾,再hash對2取模。這樣的話就可以避免新增表的時候全部資料要從新分配,也節省了維護成本。

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

缺點:如果設計不合理,同時存在每個節點都需要**的情況下,比較麻煩。另外一開始最好將所有的表都規劃出來,否則的話,**的時候需要dba耗費較多的時間進行資料遷移。

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

虛擬結構:8張物理表,按照二叉樹的排列如下

初期:

a機器有0、1、2、4張表,b機器有5、6、7、8表。1/2,3/4,5/6,7/8都為虛擬節點

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

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

查詢過程:從根節點,查詢到物理節點,確定物理機器;查詢到表節點為表節點,其中忽略虛擬節點;然後訪問物理節點上的表。

擴容:

物理機b(5/8)節點負載大,需要擴容,那麼增加物理機c(7/8),

對映過程:對映過程不變。

資料遷移:將表7和表8遷移到物理機器c上,物理機器b上只保留5/6二張表

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

邏輯庫和物理庫對映:

邏輯庫:綠色的節點

物理庫:紅色的節點

對映過程:業務id--->邏輯庫,邏輯庫--->物理庫

前置條件:當前方案資料id要保證全域性唯一

如果資料庫切分方案發生變化,那麼現網公升級也是乙個麻煩的事情,如何平滑公升級。網路上分庫分表文章很多,但都不是特別好,唯一推薦的文章是蘑菇街九如的文章,見:有很大的參考價值。其實當前分庫分表大體的方法都比較相似。

大規模IM使用者資料分庫分表之二叉樹分庫分表

網際網路發展帶來來了資料量鉅增,單資料無法解決,導致出現了資料庫分庫和分表,其主要目的是為突破單節點資料庫伺服器的 i o 能力限制,解決資料庫擴充套件性問題。但是分庫和分表帶來的問題是業務資料的一致性,線性可擴充套件性,管理的複雜性和容錯性帶來了很大的挑戰。本文討論的資料庫分表是不改變資料庫表結構...

二叉樹之二分搜尋樹

樹的基本知識 節點的度 子節點的個數 葉子結點 終端節點,節點的度為0的結點 節點的高度 節點距離葉子結點的最長路徑 節點的深度 根節點到節點的最長路徑 樹的高度 根節點的高速 節點的層數 深度 1 樹的特性 1.子樹不相交 2.除了根節點之外,每個節點有且只有乙個父節點 3.一棵n個節點的樹有n ...

資料結構 二叉樹的構建 (分冶)

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的後序遍歷和中序遍歷,請你輸出其層序遍歷的序列。這裡假設鍵值都是互不相等的正整數。輸入格式 輸入第一行給出乙個正整數n 30 是二叉樹中結點的個數。第二行給出其後序遍歷...