- Why Not NoSQL/NewSQL?
- Why Not 分區?
- Why 分庫分表?
- 實戰案例
- 訂單表
- 用戶表
- 賬戶表
- 複雜查詢
- es+HBase簡要
- 延伸閱讀
- es+HBase原理
- HBase檢索能力擴展
- 總結
- 鳴謝
- 《Netty 實現原理與源碼解析 —— 精品合集》
- 《Spring 實現原理與源碼解析 —— 精品合集》
- 《MyBatis 實現原理與源碼解析 —— 精品合集》
- 《Spring MVC 實現原理與源碼解析 —— 精品合集》
- 《Spring Boot 實現原理與源碼解析 —— 精品合集》
- 《資料庫實體設計合集》
- 《Java 面試題 —— 精品合集》
- 《Java 學習指南 —— 精品合集》
每個優秀的程序員和架構師都應該掌握分庫分表,這是我的觀點。
移動互聯網時代,海量的用戶每天產生海量的數量,比如:
以支付寶用戶為例,8億;微信用戶更是10億。訂單表更誇張,比如美團外賣,每天都是幾千萬的訂單。淘寶的歷史訂單總量應該百億,甚至千億級別,這些海量數據遠不是一張表能Hold住的。事實上MySQL單表可以存儲10億級數據,只是這時候性能比較差,業界公認MySQL單表容量在1KW以下是最佳狀態,因為這時它的BTREE索引樹高在3~5之間。
既然一張表無法搞定,那麼就想辦法將數據放到多個地方,目前比較普遍的方案有3個:
- 分區;
- 分庫分表;
- NoSQL/NewSQL;
說明:只分庫,或者只分表,或者分庫分表融合方案都統一認為是分庫分表方案,因為分庫,或者分表只是一種特殊的分庫分表而已。NoSQL比較具有代表性的是MongoDB,es。NewSQL比較具有代表性的是TiDB。
Why Not NoSQL/NewSQL?
首先,為什麼不選擇第三種方案NoSQL/NewSQL,我認為主要是RDBMS有以下幾個優點:
- RDBMS生態完善;- RDBMS絕對穩定;- RDBMS的事務特性;
NoSQL/NewSQL作為新生兒,在我們把可靠性當做首要考察對象時,它是無法與RDBMS相提並論的。RDBMS發展幾十年,只要有軟體的地方,它都是核心存儲的首選。
目前絕大部分公司的核心數據都是:以RDBMS存儲為主,NoSQL/NewSQL存儲為輔!互聯網公司又以MySQL為主,國企&銀行等不差錢的企業以Oracle/DB2為主!NoSQL/NewSQL宣傳的無論多牛逼,就現在各大公司對它的定位,都是RDBMS的補充,而不是取而代之!
Why Not 分區?
我們再看分區表方案。了解這個方案之前,先了解它的原理:
分區表是由多個相關的底層表實現,這些底層表也是由句柄對象表示,所以我們也可以直接訪問各個分區,存儲引擎管理分區的各個底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲引擎),分區表的索引只是在各個底層表上各自加上一個相同的索引,從存儲引擎的角度來看,底層表和一個普通表沒有任何不同,存儲引擎也無須知道這是一個普通表還是一個分區表的一部分。
事實上,這個方案也不錯,它對用戶屏蔽了sharding的細節,即使查詢條件沒有sharding column,它也能正常工作(只是這時候性能一般)。不過它的缺點很明顯:很多的資源都受到單機的限制,例如連接數,網路吞吐等!雖然每個分區可以獨立存儲,但是分區表的總入口還是一個MySQL示例。從而導致它的並發能力非常一般,遠遠達不到互聯網高並發的要求!
至於網上提到的一些其他缺點比如:無法使用外鍵,不支持全文索引。我認為這都不算缺點,21世紀的項目如果還是使用外鍵和資料庫的全文索引,我都懶得吐槽了!
所以,如果使用分區表,你的業務應該具備如下兩個特點:
- 數據不是海量(分區數有限,存儲能力就有限);
- 並發能力要求不高;
Why 分庫分表?
最後要介紹的就是目前互聯網行業處理海量數據的通用方法:分庫分表。
雖然大家都是採用分庫分表方案來處理海量核心數據,但是還沒有一個一統江湖的中間件,筆者這裡列舉一些有一定知名度的分庫分表中間件:
- 阿里的TDDL,DRDS和cobar,
- 開源社區的sharding-jdbc(3.x已經更名為sharding-sphere);
- 民間組織的MyCAT;
- 360的Atlas;
- 美團的zebra;
備註:sharding-jdbc的作者張亮大神原來在噹噹,現在在京東金融。但是sharding-jdbc的版權屬於開源社區,不是公司的,也不是張亮個人的!
其他比如網易,58,京東等公司都有自研的中間件。總之各自為戰,也可以說是百花齊放。
但是這麼多的分庫分表中間件全部可以歸結為兩大類型:
CLIENT模式代表有阿里的TDDL,開源社區的sharding-jdbc(sharding-jdbc的3.x版本即sharding-sphere已經支持了proxy模式)。架構如下: