Mysql千萬資料級分表設計及實現方案(2)附一致性雜湊原理解析
首先,接著上篇博文:Mysql千萬資料級分表設計及實現方案已經分析了自增id作分表key和全域性服務id(16位)作分表key進行分表的兩種設計方案。自增id優勢在於簡單,直接雜湊取模即可分表完成。根據全域性服務生成的16位使用者id(或訂單id)則需關注分表鍵生成策略,根據生成策略確定取模演算法,保證資料儘量均勻分佈。另外採取uid還得關注熱點使用者導致的資料熱點問題,若出現熱點問題,可針對熱點資料做快取處理,減少某幾張表的資料存取壓力。
下面根據專案實踐來進一步總結分析分庫分表設計及落地方案。
一、根據資料年增長量及業務增長量預估,確定分表數
以庫中最大資料量作考量,分析如下:
1、交易賬單表當前資料量:8kw
2、2017年增長:8kw
根據dba建議考慮分表後單表資料量不超過1kw估算,8kw/16=0.5kw *2年=1kw,若分成16張表可基本滿足兩年的資料增長。
二、結合業務,每張表對應crud操作,確定分表key
在選擇分表鍵,有兩個點需要重點關注:
1、採用外部鍵作為分表鍵
因為一般查詢業務都是根據訂單id,使用者id等具備業務屬性key呼叫交易,選擇這些key的好處在於業務線直接傳入分表鍵,無需二次對映操作,直接路由即可。而劣勢在於,鍵的生成策略外部控制,與業務線強耦合,且型別等受制。
對於公司如果提供全域性的id生成,且各系統均採取該方式維護,則可以採取外部鍵。
2、選擇自身生成id(pay_id)為分表鍵
業務線查詢業務key(b_U_id|order_id),此時業務線對pay_id是無感知的,與交易互動僅通過業務線id或訂單id,則需要:
方案1:考慮先查出分表key後路由(方案:查取快取、或建立bid-pay_id的對映表)
方案2:根據業務線傳入id做一次查詢。每次操作多餘一次查詢,且查詢分表在無分表key情況下,依次查。存在效率問題
最終選取2中方案1,建立業務表與分表鍵的對映表,且對映表同樣進行分表,一次業務互動兩次路由。
三、根據業務背景,確定分表方式
垂直拆分
1、常見拆分場景
a). 大欄位的垂直切分。單獨將大欄位建在另外的表中,提高基礎表的訪問效能,原則上在效能關鍵的應用中應當避免資料庫的大欄位
b). 按照使用用途垂直切分。例如企業物料屬性,可以按照基本屬性、銷售屬性、採購屬性、生產製造屬性、財務會計屬性等用途垂直切分
c). 按照訪問頻率垂直切分。例如電子商務、Web 2.0系統中,如果使用者屬性設定非常多,可以將基本、使用頻繁的屬性和不常用的屬性垂直切分開
2、拆分原則
一般講長度短、訪問率高的欄位,拆分進入base表。其他欄位放入extend表中。因為mysql通過行進行buffer快取,長度短意味著能一次性儲存更多行數的記錄,最大量減少磁碟訪問。
水平拆分
1、常見拆分場景
a). 比如線上電子商務網站,訂單表資料量過大,按照年度、月度水平切分(時間維度range)
b). Web 2.0網站註冊使用者、線上活躍使用者過多,按照使用者ID範圍等方式,將相關使用者以及該使用者緊密關聯的表做水平切分(使用者id range)
c). 例如論壇的置頂帖子,因為涉及到分頁問題,每頁都需要顯示置頂貼,這種情況可以把置頂貼水平切分開來,避免取置頂帖子時從所有帖子的表中讀取
3、兩種方式的常見拆分方案:
1、hash取模:簡單,路由方便;擴容不方便,進行rehash 二次擴容。
一致性雜湊:普通雜湊優化-->一致性雜湊
普通雜湊case:
1、10個id,分2張表資料分佈如下:
node1 |
0 |
2 |
4 |
6 |
8 |
node2 |
1 |
3 |
5 |
7 |
9 |
2、資料擴容,分成4張表資料分佈如下(rehash操作):
node1 |
0 |
4 |
8 |
node2 |
1 |
5 |
9 |
node3 |
2 |
6 |
|
node4 |
3 |
7 |
資料遷移量:2、3、6、7 共4各節點資料需進行遷移,40%(其實這種計算方式不恰當,因為隨著資料量增加,同樣由2擴容到4,遷移量肯定小於40%)
3、不進行double擴容,而是採取增加或減少某個節點(仍然需要rehash)。例如增加1各節點後,資料分佈:
node1 |
0 |
3 |
6 |
9 |
node2 |
1 |
4 |
7 |
|
node3 |
2 |
5 |
8 |
資料遷移量:2,3,4,5,8,9 共6各節點資料需進行遷移,60%
一致性雜湊case:
先簡單介紹原理:
1、將node節點數和id按照相同雜湊演算法(如md5、ascii)先計算出一個雜湊值,則計算後的node值則可以看做分佈在一個環上的節點。
2、將每個id計算的雜湊值與node雜湊值做對比,小於某node的,均分佈在node後。
3、則此時進行節點新增時,再將需新增的節點按照同樣的演算法計算出雜湊,按大小與原node雜湊進行對比確定在環中的分佈位置。再重複2中操作,確定需要遷移的資料。
同樣10個id,先分2張表,採用一致性雜湊演算法操作如下:
1)計算分表鍵id及分表table(node)對應雜湊值
id |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
雜湊值 |
192 |
196 |
200 |
204 |
208 |
212 |
216 |
220 |
224 |
22 |
node |
a |
g |
z |
node雜湊值 |
203 |
209 |
228 |
2)按照大小對比,進行分表操作
node a(203)所有id雜湊值小於203的存放在203後 |
同理 node g(209) |
同理 node z(228) |
新增 node y(216) |
0:192 1:196 2:200 |
4:208 |
5:212 6:216 7:220 8:224 9:228 |
3)此時再增加節點node 3,算出雜湊值為216,則只需要將大於228的資料而小於216的部分,遷移到216上,即只需要遷移5、6
node a(203)所有id雜湊值小於203的存放在203後 |
同理 node g(209) |
同理 node z(228) |
新增 node y(216) |
不變 |
不變 |
7:220 8:224 9:228 |
5:212 6:216 |
總結
節點和分表key按照統一規則計算出一個雜湊值(虛擬值),以相同的對比規則按照大小方式進行排列,增加刪除節點總是在某一個範圍內進行小部分遷移,從而達到減少資料遷移量的目的。
2、除雜湊取模外,還可通過range進行計算
range: 0-1億 table0 ;1億到2億 table1; 擴容方便;問題:id必須自增,新使用者活躍度高,資料熱點問題,新增資料表,資料分佈不均。
相關推薦
Mysql千萬資料級分表設計及實現方案(2)附一致性雜湊原理解析
首先,接著上篇博文:Mysql千萬資料級分表設計及實現方案已經分析了自增id作分表key和全域性服務id(16位)作分表key進行分表的兩種設計方案。自增id優勢在於簡單,直接雜湊取模即可分表完成。根據
mysql千萬資料級分表設計及實現方案
針對系統資料表日漸增長的資料量,分庫分表是減少資料庫壓力,增加db操作效率的常見解決方案。就目前專案系統而言,資料量級基本多張表已達3kw至6kw的量級。下面對筆者針對系統db結構,結合O2O業務特性整理的分表設計思路及實踐方案的討論。 設計思路: 1、首先確
關於以太坊智慧合約在專案實戰過程中的設計及經驗總結(2)
此文已由作者蘇州授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗 7.智慧合約經驗分享 1)智慧合約開發的工具的問題 古人云“工欲善其事必先利其器”,同意良好的智慧合約的開發工具對智慧合約的開發效率有極大的提升。以下是一些比較好的智慧合約的開發組合: &nb
單表五千萬資料行分資料庫設計查詢
server1db1rowcount = 10,000,010; server2db2rowcount = 10,000,020; server3db3rowcount = 10,000,030; server4db4rowcount = 10,000,040; server5db5ro
MySQL實現計數器的表設計及實現
如果是在非常高的併發之下,還是建議用記憶體資料庫redis去實現計數的功能。如果不是那麼高的併發,用表實現就可以。 DROP TABLE access_counter; CREATE TABLE access_counter( cnt INT UNSIGNED N
PHP 無限級分類資料庫設計及實現
♖背景 最近複習演算法,在此對無限級分類的實現方法稍作整理,當然也是參考了道友的經驗,目測適合實際的專案應用,當然,也有不少公司的筆試題還會涉及到呢,有何問題,歡迎各位道友指摘 … 操作環境:Wi
《JavaScript 高級程序設計》總計四(2)
占用 strong 結果 scrip 垃圾收集器 全局環境 代碼 垃圾回收 返回 引言:這一節我們對執行環境及作用域以及JavaScript的內存、垃圾機制等進行總結。 執行環境:執行環境(或者直接稱:環境)是JavaScript 中最為重要的一個概念,執行環境定義
關於以太坊智慧合約在專案實戰過程中的設計及經驗總結(1)
此文已由作者蘇州授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗 1.智慧合約的概述 近幾年,區塊鏈概念的大風吹遍了全球各地,有的人覺得這是一個大風口,有的人覺得他是個泡沫。眾所周知,比特幣是區塊鏈1.0,而以太坊被稱為了區塊鏈2.0,而區塊鏈1.0和2.0最主要的差別就在於以太坊擁有
詳解MYSQL資料庫密碼的加密方式及破解方法(2)
2.將MySQL使用者密碼字串加入到Cain破解列表 本文使用Cain & Abel 來破解MYSQL資料庫使用者密碼,Cain & Abel是一個可以破解屏保、PWL密碼、共享密碼、快取口令、遠端共享口令、SMB口令、支援VNC口令解碼、C
學習dangdang的分庫分表擴充套件框架sharding-jdbc(一)
噹噹開源的sharding-jdbc,官方網址:https://github.com/dangdangdotcom/sharding-jdbc 一、簡介 好了,看了這麼多的介紹,感覺還是很高大上的,注意點有: ①對JDBC API進行了原生態的分裝,這是與cobar-c
線性表資料結構解讀(六)鏈式雜湊表結構-LinkedHashMap
上一篇文章我和大家一起解讀了HashMap的原理原始碼,各位童鞋可以點選連結檢視線性表資料結構解讀(五)雜湊表結構-HashMap 這次我們一起來看一下LinkedHashMap,它保
一文快速入門分庫分表中介軟體 Sharding-JDBC (必修課)
書接上文 [《一文快速入門分庫分表(必修課)》](https://mp.weixin.qq.com/s/rYG58KS9kHDDOMajKT9y5Q),這篇拖了好長的時間,本來計劃在一週前就該寫完的,結果家庭內部突然人事調整,領導層進行權利交接,隨之宣佈我正式當爹,緊接著家庭地位滑落至第三名,還給我分配了一個
企業級自定義表單引擎解決方案(三)--實體物件模型設計
自定義表單設計的目標是不編寫程式碼,由設計人員在介面設計表單配置,使用者就能使用具體的功能模組了,對於這個目標,首先要解決的就是資料儲存以及資料庫與表單之間的對映問題。 平時如果使用過程式碼生成工具,應該對大體的過程有些認識。要麼從資料庫讀取已經定義好的表結構,工具生成實體部分程式碼,或者是與框架強相
Uber使用Swift重寫APP的踩坑經歷及解決方案(轉載)
result 框架 退出 帶來 hole 懶漢 將在 例子 穩定 本文出自Uber移動架構和框架組負責人托馬斯·阿特曼於2016年在灣區Swift峰會上的演講,分享了使用Swfit重寫Uber的好與壞。以下為譯文: 我是托馬斯·阿特曼,目前是Uber移動架構和框架組負責人。
8/11 TF聽力及閱讀訓練(2)
以及 練習 原理 最好的 什麽是 視頻 密度 並且 能夠 什麽是聽力訓練,什麽是訓練。 有一篇知乎的回答非常好,我很喜歡。 作者:梁躍鏈接:https://www.zhihu.com/question/20407472/answer/83390431來源:知乎著作權歸作者所
設計模式六大原則(2):裏氏替換原則
tr1 裏氏替換原則 style tar 裏氏替換 href target 替換 設計模式 XN潮寺贛3PF鋁73瓷Hhttp://weibo.com/p/1005056364252732 壇2偈6v實8uka誆敲wmhttp://weibo.com/p/10050563
ceph分布式存儲實戰(2)——從0開始創建第一個ceph集群
moni name exceptio swap nor 都是 -c 監視 defined 一、在每臺節點的/etc/hosts文件中增加如下內容 192.168.89.101 ceph-node1 192.168.89.102 ceph-node2 192.168.89.1
python:爬蟲爬取資料的處理之Json字串的處理(2)
#Json字串的處理 Json字串轉化為Python資料型別 import json JsonStr ='{"name":"sunck","age":"18","hobby":["money","power","English"],"parames":{"a":1,"b":2}}' Js
組合語言實現功能(2)資料複製的實現
問題1:將記憶體ffff:0~ffff:b單元中的資料複製到0:200~0:20b單元中 分析 1、0:200~0:20b單元如何表示 0020:0~0020:b可以等同於以上單元,而且單元的偏移地址是從0開始,和需要複製的單元相同 2、單元中的資料能直接進行復制轉移嗎
設計模式學習總結(2)單例模式、建造者模式、原型模式
單例模式(Singleton Pattern) 這種模式涉及到一個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 單例模式有以下三點注意: 1、單例類只能有一個例項。 2、單