本文主要介紹如何實現(xiàn)子庫和子表(子庫和子表的連接),下面一起看看如何實現(xiàn)子庫和子表(子庫和子表的連接)相關(guān)資訊。
轉(zhuǎn)載:
每個優(yōu)秀的程序員和架構(gòu)師都應(yīng)該掌握子庫表,這是我的看法。
在移動互聯(lián)網(wǎng)時代,海量的用戶每天都會產(chǎn)生海量的數(shù)據(jù),比如:
用戶表、訂單表、交易流水表,以支付寶用戶為例,8億;用戶甚至超過10億。訂單單更夸張,比如美團外賣,每天都是幾千萬單。淘寶 的歷史訂單總量應(yīng)該是數(shù)百億,甚至數(shù)千億。這些海量數(shù)據(jù)遠不是一張表就能容納的。實際上mysql單個表可以存儲10億條數(shù)據(jù),但此時性能相對較差。mysql單表容量在1kw以下是業(yè)界公認的,因為它的btree索引樹在3-5之間。
因為一張桌子可以 t不固定,那就盡量把數(shù)據(jù)放在多個地方。目前,有三種常見的方案:
分區(qū);子庫和子表;nosql/newsql;注意:只有子庫,或只有子表,或子庫與子表的集成方案都被認為是子庫與子表方案,因為子庫或子表只是一種特殊的子庫與子表。nosql更能代表mongodb和es。tidb是newsql的代表。
為什么不是nosql/紐什爾?首先,為什么不選擇第三方案nosql/newsql?我認為rdbms有以下優(yōu)點:-rdbms有完善的生態(tài);-rdbms絕對穩(wěn)定;-關(guān)系數(shù)據(jù)庫管理系統(tǒng)的交易特征;
作為一個新生兒,nosql/newsql可以 當我們把可靠性作為主要研究對象時,它是無法與rdbms相比的。rdbms發(fā)展了幾十年,凡是有軟件的地方都是核心存儲的首選。
目前大部分公司的核心數(shù)據(jù)都是以rdbms存儲為主,nosql/newsql存儲為輔!互聯(lián)網(wǎng)公司以mysql為主,國有銀行等有錢的企業(yè)以oracle/db2為主!無論nosql/newsql宣傳的多么,現(xiàn)在都被各大公司定位為rdbms的補充,而不是替代品!
為什么不分區(qū)?讓 讓我們再來看看分區(qū)表方案。在理解這個方案之前,先理解它的原理:
分區(qū)表是由幾個相關(guān)的底層表實現(xiàn)的,底層表也是用handle對象表示的,所以我們也可以直接訪問所有分區(qū)。存儲引擎和普通表一樣管理分區(qū)的所有底層表(所有底層表必須使用同一個存儲引擎),分區(qū)表的索引只是給每個底層表增加相同的索引。從存儲引擎 的角度來看,底層表與普通的表沒有什么不同,存儲引擎不需要知道是這樣的。普通表也是分區(qū)表的一部分。其實這個方案也不錯,對用戶屏蔽了harding的細節(jié),即使查詢條件沒有sharding列也能正常工作(只是此時性能一般)。但是它的缺點也是顯而易見的:很多資源都受到了單機的限制,比如連接數(shù)、網(wǎng)絡(luò)吞吐量等等!雖然每個分區(qū)都可以獨立存儲,但是分區(qū)表的總條目還是mysql的例子。結(jié)果它的并發(fā)能力很一般,遠遠達不到互聯(lián)網(wǎng)高并發(fā)的要求!
至于網(wǎng)上提到的其他一些缺點,比如:無法使用外鍵,不支持全文索引。我不 我不認為這是一個缺點。如果21世紀的項目仍然使用數(shù)據(jù)庫的外鍵和全文索引,我贏了 不要抱怨了!
因此,如果您使用分區(qū)表,您的業(yè)務(wù)應(yīng)該具有以下兩個特征:
數(shù)據(jù)不海量(分區(qū)數(shù)量有限,存儲容量有限);對并發(fā)能力要求不高;為什么要分庫分表?最后,我想介紹一下互聯(lián)網(wǎng)行業(yè)處理海量數(shù)據(jù)的通用方法:子數(shù)據(jù)庫和子表。
雖然大家都用分庫分表的方案來處理海量的核心數(shù)據(jù),但是沒有一個中間件來統(tǒng)一江湖。作者在這里列舉了一些知名的子數(shù)據(jù)庫和子表中間件:
阿里的tddl、drds和科巴爾,開源社區(qū)的哈丁-jdbc(3 . x已經(jīng)改名為哈丁-球體);mycat非組織;圖集;360的;斑馬;美團的;備注:sharding-jdbc的作者sean原來在當當,現(xiàn)在在京東金融。但是sharding-jdbc的版權(quán)屬于開源社區(qū),而不是公司 s或肖恩 s!其他公司,如網(wǎng)易、58和jd.com,都有自己的中間件。總之,各自為戰(zhàn),也可以說是百花齊放。
然而,如此多的子數(shù)據(jù)庫和子表中間件都可以歸為兩種類型:
客戶端模式;代理模式;客戶端模式以阿里 開源社區(qū)的tddl和哈丁-jdbc(sharding-sphere,哈丁-jdbc的3.x版本,已經(jīng)支持代理模式)。其結(jié)構(gòu)如下:
代理模式以阿里的cobar和非組織的mycat為代表。其結(jié)構(gòu)如下:
但是,無論是客戶端模式還是代理模式。幾個核心步驟是相同的:sql解析、重寫、路由、執(zhí)行和結(jié)果合并。
筆者更傾向于客戶端模式,架構(gòu)簡單,性能損失少,運維成本低。接下來以幾個常見的大表為案例來說明子數(shù)據(jù)庫和子表如何落地!更多首發(fā)文章,請關(guān)注官方賬號:【阿飛 的博客]
劃分實戰(zhàn)案例數(shù)據(jù)庫和表格的第一步,也是最重要的一步,就是分片列的選擇,分片。ing列的選擇將直接決定整個子數(shù)據(jù)庫和子表方案最終能否成功。哈丁專欄的選擇與商業(yè)密切相關(guān)。筆者認為選擇harding列的方法主要是分析你的api流量,優(yōu)先選擇流量大的api,提取流量大的api對應(yīng)的sql,將這些sql公共條件作為harding列。比如一般的oltp系統(tǒng)為用戶提供服務(wù),這些api對應(yīng)的sql都有條件用戶id,所以用戶id是一個非常好的分片列。
下面是子數(shù)據(jù)庫和子表的幾種主要處理思路:
子庫和子表只選擇了一個分片列;多個分片列、多個子庫和子表;分片列子庫子表《企業(yè)it架構(gòu)轉(zhuǎn)型之道:阿里巴巴中臺戰(zhàn)略思想與架構(gòu)實現(xiàn)》)。它選擇三列作為三個獨立的分片列,即order_id、user_id和merchant_code。user_id和merchant_code是買家id和賣家id,因為在阿里 的訂單系統(tǒng)中,買賣雙方的查詢流量都很大,并且查詢要求實時性很高。而且根據(jù)order_id,應(yīng)該會有更多基于order_id的查詢。
這里還有一點需要提一下。多分片列的子數(shù)據(jù)庫表是冗余的還是只有冗余的關(guān)系索引表需要我們自己權(quán)衡。
冗余總量的情況如下——每個sharing-column對應(yīng)的表的數(shù)據(jù)為總量,優(yōu)點是不需要二次查詢,性能更好,缺點是浪費存儲空間(淺綠色字段為harding-column):
冗余關(guān)系索引表的情況如下——只有一個harding列 的子數(shù)據(jù)庫表有完整的數(shù)據(jù),其他子數(shù)據(jù)庫表只有這個harding列的關(guān)系表。這樣做的好處是節(jié)省空間,但缺點是除了第一個以外,所有其他harding列查詢都需要二次查詢。這三個表之間的關(guān)系如下圖所示(淺綠色字段為harding列):
冗余滿量程主鍵。冗余關(guān)系表
速度對比:冗余全尺度更快,冗余關(guān)系表需要二次查詢,即使引入緩存,仍然多耗費一個網(wǎng)絡(luò);存儲成本:冗余滿刻度的存儲成本是冗余關(guān)系表的幾倍;維護成本:冗余滿量程維護成本更高。當涉及數(shù)據(jù)變更時,需要修改多個表??偨Y(jié):選擇冗余的全刻度或索引關(guān)系表,這是一種架構(gòu)上的權(quán)衡。兩者的優(yōu)缺點都很明顯。阿里 的順序表是多余的滿刻度。用戶表用戶表的幾個核心字段一般如下:
一般用戶登錄場景可以通過mobile_no、email、username登錄。但是,一些用戶相關(guān)的api都包含user_id,所以可能需要根據(jù)所有四列來劃分數(shù)據(jù)庫和表,即所有四列都是sharding-column。
科目表科目表的幾個核心字段一般如下:
一般與account表相關(guān)的api都有account_no,所以account_no可以作為sharing-column。
上面提到的復(fù)雜查詢是條件中帶有分片列的sql執(zhí)行。但是,總有一些查詢條件不包含分片列,同時,對于這些請求較低的查詢,我們不可能無限制地劃分數(shù)據(jù)庫和表。那么在這種情況下,沒有分片列的sql會怎么樣呢?以sharding-jdbc為例,有多少個子庫和子表,就要路由到多少個子庫和子表執(zhí)行,然后合并結(jié)果。具體如何合并,可以看作者sharding-jdbc系列文章,用分析源代碼來解釋合并的原理。
與使用分片列的條件查詢相比,這種條件查詢的性能明顯會下降很多。如果有幾十個甚至上百個子數(shù)據(jù)庫、子表,只要一個表的執(zhí)行因為某些因素變慢,整個sql的執(zhí)行響應(yīng)就會變慢,這非常符合木桶理論。
什么?;s更多的是操作系統(tǒng)中那些模糊的條件查詢,或者是十個條件的篩選。在這種情況下,即使是單個表也不容易創(chuàng)建索引,更不用說子數(shù)據(jù)庫和子表了。那么我們該怎么辦呢?這時候著名的elasticsearch,也就是es就派上用場了。將子數(shù)據(jù)庫和子表中的所有數(shù)據(jù)冗余給es,將那些復(fù)雜的查詢交給es處理。
淘寶我的所有訂單頁面如下,多重過濾條件,產(chǎn)品標題模糊匹配,可以 即使是一張表也無法解決(索引可以 t遇到這種情況),更不用說按子數(shù)據(jù)庫和子表了:
所以,以訂單表為例,整個結(jié)構(gòu)如下:
具體情況具體分析:除非絕對必要,最好不要使用多分片柱,成本高。上面提到的用戶表不是作者推薦的。因為用戶表有一個很大的特點就是它的上限是肯定的,即使全世界70億人都是你的用戶,數(shù)據(jù)量也不大,所以作者推薦使用single harding c。專欄 spm = 5176.124785 . con 1 . 2c 0 cz 7 bj 2 .
es hbase的原理剛才已經(jīng)討論了以mysql為核心的上述方案,數(shù)據(jù)庫和表es是分開的。隨著數(shù)據(jù)量越來越大,雖然數(shù)據(jù)庫和表還能繼續(xù)指數(shù)級膨脹,但這時候壓力就落到es身上了,這種架構(gòu)會慢慢暴露問題!
一般順序表、整數(shù)表等需要分庫分表的核心表會有幾十列甚至上百列(假設(shè)有50列),但整個表可能真的需要參與條件索引(假設(shè)有10列)。此時將50列和所有字段的數(shù)據(jù)索引到es中,會對es集群造成很大的壓力,而且需要很長時間才能從es分片失敗中恢復(fù)過來。
這時可以考慮降低es的壓力,讓es集群有限的資源盡可能的保存條件檢索所需的最有價值的數(shù)據(jù),即只將可能參與條件檢索的字段索引到es中,這樣整個es集群的壓力降低到原來的1/5(核心表有50個字段,只有10個字段參與條件),50個字段的完整數(shù)據(jù)保存在hbase中。這是es hbase經(jīng)典的組合方案,也就是將索引與數(shù)據(jù)存儲分離的方案。
我們都知道hbase在hadoop系統(tǒng)下的存儲容量是海量的,按照它的rowkey查詢性能來說,堪稱快如閃電。專家系統(tǒng)的多條件檢索能力非常強大。該方案充分發(fā)揮了es和hbase的優(yōu)點,同時避免了它們的缺點,可以說是揚長避短的最佳方案。很好的練習(xí)。
它們之間的交互大概是這樣的:先根據(jù)用戶輸入的條件去es查詢得到符合過濾條件的rowkey值,再用rowkey值去hbase查詢。后一個查詢步驟的時間幾乎可以忽略,因為這是hbase最擅長的場景,交互示意圖如下:
hbase檢索能力擴展圖來自hbase技術(shù)社區(qū)-hbase應(yīng)用實踐專場-hbase for solr總結(jié)。最后總結(jié)了幾個方案如下(分片列縮寫為sc):
-單個sc,多個scsc ssc,h bas:,官方賬號】和lufax hbas:,官方賬號】為本文提出寶貴意見。
寫完這篇文章,作者第一時間把初稿發(fā)給了右軍。大禹耐心的看完,和我溝通,當天下午給了我一些有價值的改進建議,才有了這個修訂版。
風(fēng)神對hbase有很深的了解,維護著hbase技術(shù)社區(qū),為無數(shù)hbase學(xué)者提供了很好的學(xué)習(xí)平臺。修改這篇文章的時候,我和沈峰討論了很多。另外,還有一個在*1信用卡待過的朋友,他們的hbase出了問題,運維沒做多久。最后,咨詢沈峰,簡單一碰就搞定了!對hbase感興趣的同學(xué)可以去社區(qū)學(xué)習(xí)交流,不會讓你失望的!
標簽:
冗余是關(guān)于
了解更多如何實現(xiàn)子庫和子表(子庫和子表的連接)相關(guān)內(nèi)容請關(guān)注本站點。