程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 一個基於MySQL的Key-List存儲方案

一個基於MySQL的Key-List存儲方案

編輯:MySQL綜合教程

目標:

Key-List模型、千億萬億級別、分布式、可擴展、確保一定的性能、高可用

 

基本思想:

1、 同一個key對應的list盡量集中化

2、 通過表升級、表分裂限制表的大小

3、 參考HBase的方案管理表

 

表升級、分裂方案:

以典型數據<uid,mid>(聯合主鍵)為例,假設每條記錄40字節

確保每個表最大條數1千萬(每個數據文件不要超過400M,或者可以限制最大條數1百萬,最多40M),設置mysql每張表一個表空間

通過兩個條件來限制:uid個數、uid中最多的mid個數 相乘小於1kw

 

四個級別的表:

1級:十萬用戶 100條記錄,如果用戶數超過十萬則分裂為兩個或多個1級表;如果有用戶記錄數大於100則移動到最小的2級表中。(分裂或升級均凌晨閒時執行,升級優先)

2級:一萬用戶 1000條記錄,同上

3級:一千用戶 10000條記錄,同上

4級:一百用戶以下 100000條記錄以上

 

結構圖和各部分的功能

\

 

master職責(有備份、保證一主):

1、維護key(即uid)所在的庫、表分布,在內存中構建hash索引

2、協調數據容量負載均衡,寫表盡量分散在各zone中

3、感知節點,如果有節點增刪,做相應的操作

 

zone職責:

負責監控表,實施表的分裂,分裂在本zone完成,期間需要和mater進行通信,完成之後其他zone進行備份

 

分裂操作(太復雜,沒想太清楚):

分裂點界定:對uid按照mid從多到少排序,當相加個數大於總個數一半時為拆分點

拆分時選擇某一個從表,通知master對此表加讀鎖並記錄同步日志點p,拆分過程不能分配讀寫操作,拆分完畢後將日志點p後的數據同步至兩個新表,同步完畢通知master將寫全部映射到新表,其他的備份通過主從方式自動更新為兩個表,或者使用緩沖表or緩沖隊列來實現

分裂之後的數據副本:由master決定放在比較空閒的zone中

 

升級操作:

由master協調,具體升級在各zone內部進行,不涉及表數量的修改,相對分裂簡單許多,但是涉及key的分布修改

 

讀寫操作:

先從master中獲取對應表位置

讀數據:就近讀,優先讀取本機房的主表所在節點,不成功則取其他

寫數據:只寫主表,可能不是最近的機房,有單點問題,如果掛掉,通知master更換主,此過程過長則通過緩沖隊列解決

 

加入新機器:

計算各節點的表個數,數據最大的M個節點各分一部分表給新加機器,完畢後通知master

 

某一機器掛掉:

找到表最小的幾個機器,對掛掉節點的表數據按照一定規則復制過去

或者等待DBA處理,不需要立即處理

通知master

 

難點(不過解決起來有參照,例如HBase):

自動化的表分裂、升級過程復雜

表管理復雜

如何保證讀寫服務正常、數據一致性

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved