淺談MySQL資料庫 Sharding分片技術

淺談MySQL Sharding分片技術

 

一個生產系統總會經歷一個業務量由小變大的過程,可擴展性成為瞭考量系統高可用性的一個重要衡量指標。試想一下,一個記事本應用程式,在存儲的很少字節時,能夠快速的打開和訪問,但是如果硬要讓記事本存儲百萬、千萬字節,那麼這個記事本估計就歇菜瞭!同樣,系統剛開始的時候,用戶數量不多,所有的數據都放在瞭同一個資料庫中,此時因為用戶少壓力小,一個資料庫完全可以應付的瞭。但是隨著用戶數量不斷增加,資料庫壓力也與日俱增,如果沒有妥善的擴容機制,那麼再強勁的硬件和商業資料庫也會歇菜。 

  www.aiwalls.com  

“Shard”字面意思為碎片,Sharding可以譯為分片。MySQL5以後提供瞭Sharding的能力,其目的就是為突破單節點數據伺服器I/O能力限制,解決資料庫Scale Out水平擴展的問題。通過Sharding可以將數據按照物理位置貼合用戶分佈,得到更加快速的響應;操作龐然大物總是讓人頭疼,Sharding將數據分塊,更小的數據集操作匯總能夠得到更加的體驗;分片使得數據分攤在各個數據節點,對其操作實現負載均衡,眾多屌絲的匯聚戰勝瞭一個高富帥! 

 

ü  Sharding按方向可以分為兩類。垂直分區:以表為單位,把不同的表分散到不同的資料庫或主機上。特點是規則簡單,實施方便,適合業務之間耦合度低的系統。水平分區:以行為單位,將同一個表中的數據按照某種條件拆分到不同的資料庫或主機上。特點是相對復雜,適合單表巨大的系統。 

  www.aiwalls.com  

ü  Sharding按模式可以分為兩大模式。靜態分片模式,即分區鍵是靜態分配的,一般使用范圍或哈希函數,例如深圳團隊放到一個分片,北京團隊放到另外一個分片;或者編號為0096開頭的員工放到一個分片,而0199開頭的員工放到另外一個分片。這種模式雖然實現簡單,但明顯的缺陷便是存在數據不均勻的情況。動態分片模式,即分區函數將從字典中查找分區鍵,然後定位具體哪個分片存儲瞭數據。這種模式比靜態模式更加靈活,但是需要一個集中存儲來存放字典,每次查找數據都需要執行2次查詢,並且集中存儲本身還可能存在單點故障。 

 

ü  Sharding按分區類型分為: 

 

1)        RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。 

 

2)        LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。 

 

3)        HASH分區:基於用戶設定的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。 

 

4)        KEY 分區:類似於按HASH分區,區別在於KEY分區隻支持計算一列或多列,且MySQL 伺服器提供其自身的哈希函數。必須有一列或多列包含整數值。 

 

在經過周密的設計和反復的測試後發現,所做的一切的努力都是值得的,MySQL的Sharding技術讓一群低廉的PC伺服器構成瞭一個可以媲美昂貴的小型機+商業資料庫的性能,以低成本的方式構建瞭強大的數據中心。難怪淘寶這個巨人在很早的時候就一直推行“走你IOE”! 

 

因此,學習MySQL Sharding百益而無一害!最早的先驅者估計可以是Google捐贈給開源社區的Hibernate shards瞭,這是一個Hibernate應用橫向分割的分佈式資料庫解決方案的框架。它可以讓一個Hibernate應用比較簡單地加入橫向分割的資料庫分佈式功能。另外,還有HiveDB。其底層也是基於Hibernate shards實現,目前版本相對穩定,其亮點是具有類似mysql proxy之類多伺服器容錯功能,單獨伺服器發生故障不影響系統正常運行,通過類似ha-jdbc思想實現。最後,不得不提的就是淘寶貢獻的TDDL,使用過淘寶的同學應該都深有體會,其可靠性、可用性、穩定性、可擴展性均領跑業界很多同類產品。TDDL最大的兩個亮點是動態數據源管理和分庫分表。建議抽出遊戲時間,向淘寶好好學習,天天向上! 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *