日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

隨著互聯網的迅速發展,會導致產生海量的數據,在數據量還比較小的時候,傳統的處理方式是將數據存儲在關系或者非關系型數據庫中,但是隨著數據量逐漸增加,單個數據庫的表已經很難容納所有數據,所以業界出現了分庫分表的概念。利用分為知之的思想,完美的將數據進行了拆分,但是也帶來了許多比較棘手的問題,比如引入了分布式事務、擴容等。

數據庫使用演變史

我們在應用中使用數據庫主要經歷以下三個階段

恕我直言,我懷疑你并不會“分庫分表”

 

  • 單庫單表,應用初始階段,此階段由于數據量小于數據庫承受閾值,對應用性能上基本沒有影響。
  • 單庫分表,由于數據庫中的某張表數據庫量過大,對應用的性能有了一定的影響,比如查詢等,對某個表會分為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

分享到:
標簽:分庫分表
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定