1. 程式人生 > >數據切分——原理

數據切分——原理

color 條件 程序 類型 一個 一段時間 新的 國外 時有

聲明:本系列教程參考資料《Mysql性能調優與架構設計》


Why Mysql?


大家可能懷疑。數據庫有好多種,為什麽選擇Mysql作為數據切分的案例,為什麽不選擇Oracle、MS SqlServer或者DB2等等。

原因是大家都知道,淘寶網最開始選擇LAMP的架構設計。即Linux+Apache+Mysql+PHP,最開始系統遇到的瓶頸是當時PHP不支持數據庫連接池,國外當時有一個支持連接池的PHP技術。可是價格很昂貴,後來不得不將核心業務用Java改寫,經過一段時間的發展,淘寶的架構變成

Java+ibatis+Oracle,可是Oracle須要跑到IBM的微型機上。成本相當高。這時淘寶又選擇了Mysql,由於Mysql是第一個在Linux下執行的數據庫,集群性能和穩定性特別好,對server的性能要求也不高,所以淘寶最新的系統很多其它的是用Mysql來承擔的。


拋開淘寶,京東、新浪等等都是選擇Mysql,他們在大數據的處理上面都選擇Mysql。證明應用Mysql數據庫是一個不錯的選擇。


什麽是數據切分?


數據切分(Sharding)是指通過某種特定的條件。將我們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上面。以達到分散單臺設備負載的效果。

數據的切分同一時候還能夠提高系統的整體可用性,由於單臺設備Crash之後,僅僅有整體數據的某部分不可用,而不是全部的數據。


數據的切分(Sharding)依據其切分規則的類型,能夠分為兩種切分模式。一種是依照不同的表(或者Schema)來切分到不同的數據庫(主機)之上。這樣的切能夠稱之為數據的垂直(縱向)切分。第二種則是依據表中的數據的邏輯關系,將同一個表中的數據依照某種條件拆分到多臺數據庫(主機)上面,這樣的切分稱之為數據的水平(橫向)切分。


垂直切分還是水平切分?


垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低。相互影響非常小,業務邏輯非常清晰的系統。在這樣的系統中。能夠非常easy做到將不同業務模塊所使用的表分拆到不同的數據庫中。依據不同的表來進行拆分,相應用程序的影響也更小,拆分規則也會比較簡單清晰。


水平切分於垂直切分相比,相對來說略微復雜一些。由於要將同一個表中的不同數據拆分到不同的數據庫中,對於應用程序來說,拆分規則本身就較依據表名來拆分更為復雜,後期的數據維護也會更為復雜一些。


在我們的系統中,假設用垂直切分足夠解決這個問題,那麽我們首選垂直切分,垂直切分帶來的優點是不言而喻的,假如垂直切分仍然不能滿足要求的時候,那麽我們就不得不垂直切分和水平切分聯合使用了,可是進行水平切分的時候一定要細致斟酌切分規則,不同的切分規則會帶來截然不同的維護成本。盡量做到符合業務需求。



Why Sharding?


理由一般是這種。要麽數據量非常大。要麽並發非常大,總之,由於數據庫不能非常好的為他的client服務了。


大家有沒有想過,騰訊的QQ號是放在一個數據庫了嗎?新浪的微博信息是存放在一張表裏了嗎?還有微信的聊天記錄是放在一個數據庫的一張表了嗎?答案當然是否定的。

幾個億的QQ號、海量的微博信息和聊天記錄放在一個數據庫的一張表裏無疑是一場災難。如此大的數據量就要用到數據的切分技術。


數據的切分不光是解決大數據的問題。同一時候也會給高並發提供了一定的幫助。對於聊天記錄,我們能夠利用數據的垂直切分。將聊天記錄業務與其它業務分離開來。這樣client訪問數據庫的時候能夠有更理想的性能。同一時候,我們能夠利用水平切分,每一個人一張表,這樣能夠保證每一個人讀取自己的聊天記錄的時候也會有更理想的效果,當然,即使你這樣做了。數據量還是非常大,你也能夠依據業務進行更大力度的切分,一般垂直切分和水平切分聯合使用能夠解決大部分問題。


數據切分——原理