轉自:學習Java的小姐姐
www.cnblogs.com/chenchen0618/p/11624480.html
1.什么是分庫分表
從字面上簡單理解,就是將原本存盤在一個庫的資料分塊存盤在多個庫上,將原本存盤在一個表的資料分塊存盤在多個表里面,
資料的切分根據其切分規則的型別,可以分為如下兩種切分模式,
垂直(縱向)切分:把單一的表拆分成多個表,并分散到不同的資料庫(主機)上,
比如一個訂單表里面有用戶資訊,商品資訊,識訓地址資訊,促銷資訊,這樣表的欄位太多,顯得特別臃腫,所以我們將他們各自分隔出來,形成多張表存盤資料,
優點:
- 拆分后業務清晰,拆分規則明確,
- 系統之間進行整合或擴展很容易,
- 按照成本、應用的等級、應用的型別等將表放到不同的機器上,便于管理,
- 資料維護簡單,
缺點:
- 業務表多樣,SQL陳述句復雜,
水平(橫向)切分:根據表中資料的邏輯關系,將同一個表中的資料按照某種條件拆分到多臺資料庫(主機)上,與垂直切分對比,水平切分不是將表進行分類,而是將其按照某個欄位的某種規則分散到多個庫中,在每個表中包含一部分資料,所有表加起來就是全量的資料,
比如有一個用戶表,單張表的記錄條數達到1億條,這樣在進行查詢,插入,更新操作的時候,速度將非常慢,那我們可以將這些資料分配到100個表里面,每個表的資料量就下來了,導致單表的容量不會太大,從而保證了單表的查詢等處理能力,
我們通常將資料分配的原則稱為分片規則,常見的分片規則有對用戶的id取模,
注意:一定要好好決定分片規則,盡量選擇不會變動的欄位,如果選擇區域,性別,年齡等欄位,當用戶修改這些資訊的時候又要講資料移動到其他資料庫,這里面的邏輯也很頭疼,
優點:
- 單庫單表的資料保持在一定的量級,有助于性能的提高,
- 切分的表的結構相同,應用層改造較少,只需要增加路由規則即可,
- 提高了系統的穩定性和負載能力,
缺點:
- 切分后,資料是分散的,很難利用資料庫的Join操作,跨庫Join性能較差,
- 拆分規則難以抽象,
- 分片事務的一致性難以解決,
- 資料擴容的難度和維護量極大,
2.為什么要用分庫分表
資料庫負載增大時的處理:隨著我們的應用的用戶量越來越大,訪問量也隨之提升,當他們提升到一定的量級之后,應用也就越來越慢,當然我們可以通過增大前端應用負載的方式來提升速度,但是直到有一天我們發現無論如何增大前端應用負載都不能提升速度,我們就逐步找到原因,是資料庫的問題,因為資料庫是存在性能瓶頸的,這是無法避免的,
3.市面上常用中間件
MyCat
MyCat:是一個中間件的第三方應用,使用MyCat時不需要改代碼,
我們在使用的時候,如果有多個庫,我們在代碼里面就只要寫MyCat對外的一個邏輯庫資訊就行,而資料庫層面的配置,比如總共有多少個庫,每個庫里面的表,每個表的分片規則,這些都是在MyCat里面配置,不需要修改代碼資訊,
具體的邏輯圖如下:

Sharding-JDBC
Sharding-JDBC:是一個jar包,使用Sharding-JDBC時需要修改代碼,
我們在使用的時候,需要引入Sharding-JDBC的jar包,在組態檔里面寫明總共有多少個庫,每個庫里面的表,每個表的分片規則等資訊,
具體的邏輯圖如下:

如何選擇中間件?
Sharding-JDBC和Mycat使用不同的理念,Sharding-JDBC目前是基于JDBC驅動,無需額外的proxy,因此也無需關注proxy本身的高可用,MyCat 是基于 Proxy,它復寫了 MySQL 協議,將 Mycat Server 偽裝成一個 MySQL 資料庫,而 Sharding-JDBC 是基于 JDBC 介面的擴展,是以 jar 包的形式提供輕量級服務的,
其實MyCat很適合中小企業使用的,可以非常容易的實作資料庫的讀寫分離和分庫分表,反而對于大企業來說,都會自己開發適合自己的資料庫中間層應用,比如Sharding-JDBC原來就是當當網內部的資料庫中間件,后來開源出來的,
歡迎關注我的公眾號::一點教程,獲得獨家整理的學習資源和日常干貨推送,
如果您對我的系列教程感興趣,也可以關注我的網站:yiidian.com
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/88181.html
標籤:其他
上一篇:運維筆記(部署篇)
下一篇:Github無法訪問的解決辦法
