對於大型的互聯網應用來講,數據庫單表的記錄行數可能達到千萬級甚至是億級,而且數據庫面臨着極高的併發訪問。採用Master-Slave複製模式的MySQL架構,只可以對數據庫的讀進行擴展,而對數據庫的寫入操做仍是集中在Master上,而且單個Master掛載的Slave也不可能無限制多,Slave的數量受到Master能力和負載的限制。所以,須要對數據庫的吞吐能力進行進一步的擴展,以知足高併發訪問與海量數據存儲的須要!html
對於訪問極爲頻繁且數據量巨大的單表來講,咱們首先要作的就是減小單表的記錄條數,以便減小數據查詢所須要的時間,提升數據庫的吞吐,這就是所謂的分表!java
分表又分爲垂直分表和水平分表
垂直分表:表的記錄並很少,可是字段卻很長,表佔用空間很大,檢索表的時候須要執行大量的IO,嚴重下降了性能。這時須要把大的字段拆分到另外一個表,而且該表與原表是一對一的關係。
水平分表:表的記錄不少,嚴重影響了查詢速度。這時須要把一張表拆分紅多張字段相同的表,將記錄分攤到各個表中,以減小單表的記錄數mysql
分表可以解決單表數據量過大帶來的查詢效率降低的問題,可是,卻沒法給數據庫的併發處理能力帶來質的提高。面對高併發的讀寫訪問,當數據庫master服務器沒法承載寫操做壓力時,無論如何擴展slave服務器,此時都沒有意義了。所以,咱們必須換一種思路,對數據庫進行拆分,從而提升數據庫寫入能力,這就是所謂的分庫!git
有時數據庫可能既面臨着高併發訪問的壓力,又須要面對海量數據的存儲問題,這時須要對數據庫既採用分表策略,又採用分庫策略,以便同時擴展系統的併發處理能力,以及提高單表的查詢性能,這就是所謂的分庫分表。github
1. proxy sharding,目前由cobar,mycat,drds,atlas修改,這幾個產品的起源通常是mysqlproxy 或 ameoba,特色是mysql協議基本兼容,業務不須要作太多修改,缺點是分庫分表的算法很爛,業務要本身作大堆配置
2. jdbc中間件sharding,這個和協議差很少,就是把服務實現爲了一箇中間件,好處是協議損失時間能夠補回來,壞處是隻有java可使用,開源的有當當的 sharding-jdbc
3.mysql的ndbcluster和fabric,這是mysql 引擎層面作的sharding,直接用mysql的協議層和計劃生成,這個作的好處是原生的協議層都是百分百支持,事務用mysql xa支持也算馬馬虎虎,壞處是單機引擎,不能支持大數據的sql算法
詳細 http://www.javashuo.com/article/p-cjrmdgdw-bg.htmlsql
sharding-jdbc是噹噹的一個開源的項目,屬於輕量級Java框架,使用客戶端直連數據庫,以jar包形式提供服務,未使用中間層,無需額外部署,無其餘依賴。數據庫
github地址:https://github.com/shardingjdbc/sharding-jdbc服務器
文檔:http://shardingjdbc.io/docs/00-overview架構
官網提供的功能列表 :)
1. 分庫分表 SQL解析功能完善,支持聚合,分組,排序,LIMIT,TOP等查詢,而且支持級聯表以及笛卡爾積的表查詢 支持內、外鏈接查詢 分片策略靈活,可支持=,BETWEEN,IN等多維度分片,也可支持多分片鍵共用,以及自定義分片策略 基於Hint的強制分庫分表路由 2. 讀寫分離 獨立使用讀寫分離支持SQL透傳 一主多從的讀寫分離配置,可配合分庫分表使用 基於Hint的強制主庫路由 3. 柔性事務 最大努力送達型事務 TCC型事務(TBD) 4. 分佈式主鍵 統一的分佈式基於時間序列的ID生成器 5. 兼容性 可適用於任何基於java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC 可基於任何第三方的數據庫鏈接池,如:DBCP, C3P0, BoneCP, Druid等 理論上可支持任意實現JDBC規範的數據庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL 6. 靈活多樣的配置 Java YAML Inline表達式 Spring命名空間 Spring boot starter 7. 分佈式治理能力 (2.0新功能) 配置集中化與動態化,可支持數據源、表與分片策略的動態切換(2.0.0.M1) 客戶端的數據庫治理,數據源失效自動切換(2.0.0.M2) 基於Open Tracing協議的APM信息輸出(2.0.0.M3)
總體架構圖