隨著互聯網的迅速發展,會導致產生海量的數據,在數據量還比較小的時候,傳統的處理方式是將數據存儲在關系或者非關系型數據庫中,但是隨著數據量逐漸增加,單個數據庫的表已經很難容納所有數據,所以業界出現了分庫分表的概念。利用分為知之的思想,完美的將數據進行了拆分,但是也帶來了許多比較棘手的問題,比如引入了分布式事務、擴容等。
數據庫使用演變史
我們在應用中使用數據庫主要經歷以下三個階段
- 單庫單表,應用初始階段,此階段由于數據量小于數據庫承受閾值,對應用性能上基本沒有影響。
- 單庫分表,由于數據庫中的某張表數據庫量過大,對應用的性能有了一定的影響,比如查詢等,對某個表會分為table_1,table_2,table_N,將一張表拆分N張小表。注意此階段磁盤容量充足。但是更多的是使用的數據庫的分區,分區原理和分表原理很相似,比如MySQL hash的分區
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求余,所以會分三個存儲文件
- 分庫分表,上述兩種都無法解決時,出現分庫分表方案,即將單數據庫數據分散在多個數據庫中。
什么情況下需要分庫分表
? 原則上能不分庫盡量不分庫,無法避免時或者已經有趨勢顯示需要分庫分表,則使用分庫分表。
- 數據庫的吞吐量達到瓶頸,需要擴多個數據庫實例來提高;
- 數據表的數據達到一定的量級,對應用查詢等性能有了明顯的影響,可以通過分庫分表來提升性能,有資料顯示Mysql數據庫單表數據量超過5000w后對查詢性能有影響
- 為了避免后期復雜的擴容,提前根據數據增長的趨勢預估N年后的數據量 count,count / 單庫容量 =所需 數據庫實例,屬于提前規劃,防范于未然。
常見拆分方案
常見拆分方案有兩種:垂直拆分和水平拆分,分庫分表則是一種對數據庫拆分的常見解決方案。
- 垂直拆分
垂直拆分是根據業務特點,將某些有關系的表集中存儲在的某個DB中,并且這些表的數據量一般不會過大。比如電商系統中有用戶模塊、訂單模塊
- 水平拆分
每個db中存在相同的表結構,根據一定的規則將數據分散在多個DB中
分庫分表實現方案
主要有以下三種實現方案
- 客戶端分片
- 代理實現分片
- 分布式數據庫
客戶端分片
客戶端分片一般有兩種實現方式,一種是應用層直接實現,應用層內包含分片邏輯以及分片算法等,與業務代碼緊耦合
應用層實現了所有邏輯,業務人員需要參與。
另外一種是實現標準的JDBC協議,對應用提供包裝過的JDBC,對應用使用無感,實現邏輯作為jar,嵌入在應用中,應用可以靈活的切換
這種方式是實現標準的JDBC接口,對應用使用原生JDBC無影響,二者遵循統一規范,相比于第一種方式好處是與業務代碼解耦。提高靈活性。
代理分片
代理方式實現的方式是在應用和數據庫中間增加代理層,獨立部署,代理充當數據的角色,對應用來說使用代理就等價于數據庫,原則上使用代理與直接使用數據庫是無區別,但是代理畢竟不是真實的數據庫,代理層只是解決如何充分的利用數據庫資源,代理層實現了所有分庫分表邏輯,包括分片規則等,業務人員無需關注,可以將更多的時間投入到業務實現邏輯中。
一般會在代理層外添加一層負載。
這種方式可以讓業務人員更專注于業務,但是復雜度相比第一種要高很多,增加了通訊鏈路,涉及到協議轉換,所以會對性能相比于第一種方案有明顯的損耗,同時對人員的要求也比較高,需要技術大牛來支持,否則一旦出現問題很難處理。比較耳熟的有Mycat,由于本人基于Mycat做過深度二次開發,對源碼有一定的了解,缺陷真的很。。。。,希望使用者仔細斟酌,題外話o( ̄︶ ̄)o
分布式數據庫
耳熟的有TiDB,對外提供可伸縮的架構體系,提供一定的分布式事務,可伸縮和分布式事務在內部實現中包裝,對用者無需直接控制這些特性,比如TiDB提供了JDBC接口,應用層使用TiDB和直連MySQL數據庫使用方式沒什么區別
分庫分表帶來的問題
- 數據切分后,分散在不同的DB中,在使用數據庫原生的Join操作時,存在跨庫Join,性能較差。
- 引入分布式事務,分布式事務的一致性很難解決。
- 分頁,越往后翻頁,查詢越慢,比如 查詢100w后的10條數據,limit 1000000,10。
- 不停機擴容難度增大
后續文章會分析為了解決分庫分表帶來的問題,業界中有哪些比較成熟的解決方案,敬請期待...
作者:掘金小勇士
鏈接:
https://juejin.im/post/5edb0d1c6fb9a047ed240e36