引言
從字面上簡單了解,就是把原本存儲于一個庫的資料分塊存儲到多個庫上,把原本存儲于一個表的資料分塊存儲到多個表上。
資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,随着時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來越大,相應地,資料操作,增删改查的開銷也會越來越大;另外,由于無法進行分布式式部署,而一台伺服器的資源(CPU、磁盤、記憶體、IO等)是有限的,最終資料庫所能承載的資料量、資料處理能力都将遭遇瓶頸。
分庫分表的必要性
首先我們來了解一下為什麼要做分庫分表。在我們的業務(web應用)中,關系型資料庫本身比較容易成為系統性能瓶頸,單機存儲容量、連接配接數、處理能力等都很有限,資料庫本身的“有狀态性”導緻了它并不像Web和應用伺服器那麼容易擴充。那麼在我們的業務中,是否真的有必要進行分庫分表,就可以從上面幾個條件來考慮。
單機儲存容量。您的資料量是否在單機儲存中碰到瓶頸。比如餓了麼一天産生的使用者行為資料就有24T,那麼在傳統的單機儲存中肯定是不夠的。
連接配接數、處理能力。在我們的使用者量達到一定程度時,特定時間的并發量又成了一個大問題,在一個高并發的網站中秒級數十萬的并發量都是很正常的。在普通的單機資料庫中秒級千次的操作問題都很大。
是以在我們進行分庫分表之前我們最好考慮一下,我們的資料量是不是夠大,并發量是不是夠大。如果您的回答是肯定的,那我們就開始做吧。
事務問題
解決事務問題目前有兩種可行的方案:分布式事務和通過應用程式與資料庫共同控制實作事務下面對兩套方案進行一個簡單的對比。
方案一:使用分布式事務
優點:交由資料庫管理,簡單有效
缺點:性能代價高,特别是shard越來越多時
方案二:由應用程式和資料庫共同控制
原理:将一個跨多個資料庫的分布式事務分拆成多個僅處 于單個資料庫上面的小事務,并通過應用程式來總控 各個小事務。
優點:性能上有優勢
缺點:需要應用程式在事務控制上做靈活設計。如果使用 了spring的事務管理,改動起來會面臨一定的困難。
分庫分表的實施政策。
分庫分表有垂直切分和水準切分兩種。
3.1 何謂垂直切分,即将表按照功能子產品、關系密切程度劃分出來,部署到不同的庫上。例如,我們會建立定義資料庫workDB、商品資料庫payDB、使用者資料庫userDB、日志資料庫logDB等,分别用于存儲項目資料定義表、商品定義表、使用者資料表、日志資料表等。
3.2 何謂水準切分,當一個表中的資料量過大時,我們可以把該表的資料按照某種規則,例如userID散列,進行劃分,然後存儲到多個結構相同的表,和不同的庫上。例如,我們的userDB中的使用者資料表中,每一個表的資料量都很大,就可以把userDB切分為結構相同的多個userDB:part0DB、part1DB等,再将userDB上的使用者資料表userTable,切分為很多userTable:userTable0、userTable1等,然後将這些表按照一定的規則存儲到多個userDB上。
3.3 應該使用哪一種方式來實施資料庫分庫分表,這要看資料庫中資料量的瓶頸所在,并綜合項目的業務類型進行考慮。
如果資料庫是因為表太多而造成海量資料,并且項目的各項業務邏輯劃厘清晰、低耦合,那麼規則簡單明了、容易實施的垂直切分必是首選。
而如果資料庫中的表并不多,但單表的資料量很大、或資料熱度很高,這種情況之下就應該選擇水準切分,水準切分比垂直切分要複雜一些,它将原本邏輯上屬于一體的資料進行了實體分割,除了在分割時要對分割的粒度做好評估,考慮資料平均和負載平均,後期也将對項目人員及應用程式産生額外的資料管理負擔。
在現實項目中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水準切分。我們的遊戲項目便綜合使用了垂直與水準切分,我們首先對資料庫進行垂直切分,然後,再針對一部分表,通常是使用者資料表,進行水準切分。
mycat是怎樣實作分庫分表的?mycat裡面通過定義路由規則來實作分片表(路由規則裡面會定義分片字段,以及分片算法)。分片算法有多種,你所說的hash是其中一種,還有取模、按範圍分片等等。在mycat裡面,會對所有傳遞的sql語句做路由處理(路由處理的依據就是表是否分片,如果分片,那麼需要依據分片字段和對應的分片算法來判斷sql應該傳遞到哪一個、或者哪幾個、又或者全部節點去執行)
總結
以 上就是我對Java開發分庫分表需要解決的問題及mycat是怎樣實作分庫分表的 問題及其優化總結,分享給大家,覺得收獲的話可以點個關注收藏轉發一波喔,謝謝大佬們支援!
最後,每一位讀到這裡的網友,感謝你們能耐心地看完。希望在成為一名更優秀的Java程式員的道路上,我們可以一起學習、一起進步!都能赢取白富美,走向架構師的人生巅峰!
想了解學習Java方面的技術内容以及Java技術視訊的内容可加群:722040762 驗證碼:頭條(06 必過)歡迎大家的加入喲!
