隨着互聯網的迅速發展,會致使產生海量的數據,在數據量還比較小的時候,傳統的處理方式是將數據存儲在關係或者非關係型數據庫中,可是隨着數據量逐漸增長,單個數據庫的表已經很難容納全部數據,因此業界出現了分庫分表的概念。利用分爲知之的思想,完美的將數據進行了拆分,可是也帶來了許多比較棘手的問題,好比引入了分佈式事務、擴容等。mysql
咱們在應用中使用數據庫主要經歷如下三個階段 web
CREATE TABLE `test_user_hash` (
`user_id` bigint(19) NOT NULL, `user_name` varchar(50) NOT NULL, `ext_int` int(2) NOT NULL, `ts` bigint(19) NOT NULL, PRIMARY KEY (`user_id`,`ext_int`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; //Mysql 分區 ALTER TABLE `test_user_hash` PARTITION BY HASH(ext_int) PARTITIONS 3 ; 複製代碼
mysql數據庫中存儲形式,因爲上述是按3hash求餘,因此會分三個存儲文件 算法
原則上能不分庫儘可能不分庫,沒法避免時或者已經有趨勢顯示須要分庫分表,則使用分庫分表。sql
常見拆分方案有兩種:垂直拆分和水平拆分,分庫分表則是一種對數據庫拆分的常看法決方案。數據庫
垂直拆分是根據業務特色,將某些有關係的表集中存儲在的某個DB中,而且這些表的數據量通常不會過大。好比電商系統中有用戶模塊、訂單模塊 架構
每一個db中存在相同的表結構,根據必定的規則將數據分散在多個DB中 編輯器
主要有如下三種實現方案分佈式
客戶端分片通常有兩種實現方式,一種是應用層直接實現,應用層內包含分片邏輯以及分片算法等,與業務代碼緊耦合 性能
應用層實現了全部邏輯,業務人員須要參與。ui
另一種是實現標準的JDBC協議,對應用提供包裝過的JDBC,對應用使用無感,實現邏輯做爲jar,嵌入在應用中,應用能夠靈活的切換
這種方式是實現標準的JDBC接口,對應用使用原生JDBC無影響,兩者遵循統一規範,相比於第一種方式好處是與業務代碼解耦。提升靈活性。
代理方式實現的方式是在應用和數據庫中間增長代理層,獨立部署,代理充當數據的角色,對應用來講使用代理就等價於數據庫,原則上使用代理與直接使用數據庫是無區別,可是代理畢竟不是真實的數據庫,代理層只是解決如何充分的利用數據庫資源,代理層實現了全部分庫分表邏輯,包括分片規則等,業務人員無需關注,能夠將更多的時間投入到業務實現邏輯中。
通常會在代理層外添加一層負載。
這種方式可讓業務人員更專一於業務,可是複雜度相比第一種要高不少,增長了通信鏈路,涉及到協議轉換,因此會對性能相比於第一種方案有明顯的損耗,同時對人員的要求也比較高,須要技術大牛來支持,不然一旦出現問題很難處理。比較耳熟的有Mycat,因爲本人基於Mycat作過深度二次開發,對源碼有必定的瞭解,缺陷真的很。。。。,但願使用者仔細斟酌,題外話o( ̄︶ ̄)o
耳熟的有TiDB,對外提供可伸縮的架構體系,提供必定的分佈式事務,可伸縮和分佈式事務在內部實現中包裝,對用者無需直接控制這些特性,好比TiDB提供了JDBC接口,應用層使用TiDB和直連MySQL數據庫使用方式沒什麼區別
後續文章會分析爲了解決分庫分錶帶來的問題,業界中有哪些比較成熟的解決方案,敬請期待...