天天看點

資料切分——原理

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

        Why Mysql?

        大家可能懷疑,資料庫有好多種,為什麼選擇Mysql作為資料切分的案例,為什麼不選擇Oracle、MS SqlServer或者DB2等等。原因是大家都知道,淘寶網最開始選擇LAMP的架構設計,即Linux+Apache+Mysql+PHP,最開始系統遇到的瓶頸是當時PHP不支援資料庫連接配接池,國外當時有一個支援連接配接池的PHP技術,但是價格非常昂貴,後來不得不将核心業務用Java改寫,經過一段時間的發展,淘寶的架構變成

Java+ibatis+Oracle,但是Oracle需要跑到IBM的微型機上,成本相當高,這時淘寶又選擇了Mysql,因為Mysql是第一個在Linux下運作的資料庫,叢集性能和穩定性特别好,對伺服器的性能要求也不高,是以淘寶最新的系統更多的是用Mysql來承擔的。

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

       什麼是資料切分?

        資料切分(Sharding)是指通過某種特定的條件,将我們存放在同一個資料庫中的資料分散存放到多個資料庫(主機)上面,以達到分散單台裝置負載的效果。資料的切分同時還可以提高系統的總體可用性,因為單台裝置Crash之後,隻有總體資料的某部分不可用,而不是所有的資料。

        資料的切分(Sharding)根據其切分規則的類型,可以分為兩種切分模式。一種是按照不同的表(或者Schema)來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一種則是根據表中的資料的邏輯關系,将同一個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種切分稱之為資料的水準(橫向)切分。

        垂直切分還是水準切分?

       垂直切分的最大特點就是規則簡單,實施也更為友善,尤其适合各業務之間的耦合度非常低,互相影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到将不同業務子產品所使用的表分拆到不同的資料庫中。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。

       水準切分于垂直切分相比,相對來說稍微複雜一些。因為要将同一個表中的不同資料拆分到不同的資料庫中,對于應用程式來說,拆分規則本身就較根據表名來拆分更為複雜,後期的資料維護也會更為複雜一些。

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

         Why Sharding?

       理由通常是這樣的,要麼資料量很大,要麼并發很大,總之,因為資料庫不能很好的為他的用戶端服務了。

       大家有沒有想過,騰訊的QQ号是放在一個資料庫了嗎?新浪的微網誌資訊是存放在一張表裡了嗎?還有微信的聊天記錄是放在一個資料庫的一張表了嗎?答案當然是否定的。幾個億的QQ号、海量的微網誌資訊和聊天記錄放在一個資料庫的一張表裡無疑是一場災難,如此大的資料量就要用到資料的切分技術。

       資料的切分不光是解決大資料的問題,同時也會給高并發提供了一定的幫助。對于聊天記錄,我們可以利用資料的垂直切分,将聊天記錄業務與其他業務分離開來,這樣用戶端通路資料庫的時候可以有更理想的性能,同時,我們可以利用水準切分,每個人一張表,這樣可以保證每個人讀取自己的聊天記錄的時候也會有更理想的效果,當然,即使你這樣做了,資料量還是很大,你也可以根據業務進行更大力度的切分,一般垂直切分和水準切分聯合使用可以解決大部分問題。