免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
分庫分表之第一篇

1.概述

1.1.分庫分表是什么

小明是一家初創(chuàng)電商平臺的開發(fā)人員,他負責賣家模塊的功能開發(fā),其中涉及了店鋪、商品的相關(guān)業(yè)務,設(shè)計如下數(shù)據(jù)庫 :


通過以下SQL能夠獲取到商品相關(guān)的店鋪信息、地理區(qū)域信息 :

SELECT p.*,r.[地理區(qū)域名稱],s.[店鋪名稱],s.[信譽] FROM [商品信息] p
LEFT JOIN [地理區(qū)域] r ON p.[產(chǎn)地] = r.[地理區(qū)域編碼] LEFT JOIN [店鋪信息] s ON p.id = s.[所屬店鋪]
WHERE p.id = ?

形成類似以下列表展示 :


隨著公司業(yè)務快速發(fā)展,數(shù)據(jù)庫中的數(shù)據(jù)量猛增,訪問性能也變慢了,優(yōu)化迫在眉睫。分析一下問題出現(xiàn)在哪兒 呢? 關(guān)系型數(shù)據(jù)庫本身比較容易成為系統(tǒng)瓶頸,單機存儲容量、連接數(shù)、處理能力都有限。當單表的數(shù)據(jù)量達到 1000W或100G以后,由于查詢維度較多,即使添加從庫、優(yōu)化索引,做很多操作時性能仍下降嚴重。
方案1:
通過提升服務器硬件能力來提高數(shù)據(jù)處理能力,比如增加存儲容量 、CPU等,這種方案成本很高,并且如果瓶頸在
MySQL本身那么提高硬件也是有很的。
方案2:
把數(shù)據(jù)分散在不同的數(shù)據(jù)庫中,使得單一數(shù)據(jù)庫的數(shù)據(jù)量變小來緩解單一數(shù)據(jù)庫的性能問題,從而達到提升數(shù)據(jù)庫 性能的目的,如下圖:將電商數(shù)據(jù)庫拆分為若干獨立的數(shù)據(jù)庫,并且對于大表也拆分為若干小表,通過這種數(shù)據(jù)庫 拆分的方法來解決數(shù)據(jù)庫的性能問題。

分庫分表就是為了解決由于數(shù)據(jù)量過大而導致數(shù)據(jù)庫性能降低的問題,將原來獨立的數(shù)據(jù)庫拆分成若干數(shù)據(jù)庫組成,將數(shù)據(jù)大表分成若干數(shù)據(jù)表組成,使得單一數(shù)據(jù)庫、單一數(shù)據(jù)表的數(shù)據(jù)量變小,從而達到提升數(shù)據(jù)庫性能的目的。

1.2.分庫分表的方式

分庫分表包括分庫和分表兩個部分,在生產(chǎn)中通常包括 :垂直分庫、水平分庫、垂直分表、水平分表四種方式。

1.2.1.垂直分表

下邊通過一個商品查詢的案例來垂直分表 :
通常在商品列表中是不是顯示商品詳情信息的,如下圖 :


用戶在瀏覽商品列表時,只有對某商品感興趣時才會查看商品的詳細描述。因此,商品信息中商品描述字段訪問頻次較低,且該字段存儲占用空間較大,訪問單個數(shù)據(jù)IO時間較長;商品信息中商品名稱、商品圖片、商品價格等其他字段數(shù)據(jù)訪問頻次較高。
由于這兩種數(shù)據(jù)的特性不一樣,因此他考慮將商品信息表拆分如下 :
將訪問頻次低的商品描述信息單獨存放在一張表中,訪問頻次較高的商品基本信息單獨放在一張表中。

商品列表可采用以下sql :

SELECT p.*,r.[地理區(qū)域名稱],s.[店鋪名稱],s.[信譽] FROM [商品信息] p
LEFT JOIN [地理區(qū)域] r ON p.[產(chǎn)地] = r.[地理區(qū)域編碼] LEFT JOIN [店鋪信息] s ON p.id = s.[所屬店鋪] WHERE...ORDER BY...LIMIT...

需要獲取商品描述時,再通過以下sql獲取 :

SELECT *
FROM [商品描述] WHERE [商品ID] = ?

小明進行的這一步優(yōu)化,就叫垂直分表。
垂直分表定義 :將一個表按照字段分成多表,每個表存儲其中一部分字段。
它帶來的提升是 :
1.為了避免IO爭搶并減少鎖表的幾率,查看詳情的用戶與商品信息瀏覽互不影響。
2.充分發(fā)揮熱門數(shù)據(jù)的操作效率,商品信息的操作的高效率不會被商品描述的低效率所拖累。
注意 :
為什么大字段IO效率低 :
第一是由于數(shù)據(jù)量本身大,需要更長的讀取時間;
第二是跨頁,頁是數(shù)據(jù)庫存儲單位,很多查找及定位操作都是以頁為單位,單頁內(nèi)的數(shù)據(jù)行越多數(shù)據(jù)庫整體性能越好,而大字段占用空間大,單頁內(nèi)存儲行數(shù)少,因此IO效率較低。
第三,數(shù)據(jù)庫以行為單位將數(shù)據(jù)加載到內(nèi)存中,這樣表中字段長度較短且訪問頻率較高,內(nèi)存能加載更多的數(shù)據(jù),命中率更高,減少來磁盤IO,從而提升來數(shù)據(jù)庫性能。
一般來說,某業(yè)務實體中的各個數(shù)據(jù)項的訪問頻次是不一樣的,部分數(shù)據(jù)項可能是占用存儲空間比較大的BLOB或是TEXT。例如上例中的商品描述。所以,當表數(shù)據(jù)量很大時,可以將表按字段切開,將熱門字段、冷門字段分開放置在不同庫中,這些庫可以放在不同的存儲設(shè)置上,避免IO爭搶。垂直切分帶來的性能提升主要集中在熱門數(shù)據(jù)的操作效率上,而且磁盤爭用情況減少。
通常我們按以下原則進行垂直拆分 :
1、把不常用的字段單獨放在一張表;
2、把text,blob等大字段拆分出來放在附表中;
3、經(jīng)常組合查詢的列放在一張表中;

1.2.2.垂直分庫

通過垂直分表能得到來一定程度的提升,但是還沒有達到要求,并且磁盤空間也快不夠來,因為數(shù)據(jù)還是始終限制在一臺服務器,庫內(nèi)垂直分表只解決來單一表數(shù)據(jù)量過大的問題,但沒有將表分布到不同的服務器上,因此每個表還是競爭同一個物理機的CPU、內(nèi)存、網(wǎng)絡IO
、磁盤。
經(jīng)過思考,他把原來的SELLER_DB(賣家?guī)欤譃閬鞵RODUCT_DB (商品庫)和STORE_DB(店鋪庫),并把這兩個庫分散到不同服務器,如下圖 :


由于商品信息與商品描述業(yè)務耦合度較高,因此一起被存放在PRODUCT_DB(商品庫);而店鋪信息相對獨立,因此單獨被存放在STORE_DB(店鋪庫)。
小明進行的這一步優(yōu)化,就叫垂直分庫。
垂直分庫是指按照業(yè)務將表進行分類,分布到不同的數(shù)據(jù)庫上面,每個庫可以放不同的服務器上,它的核心理念是專庫專用。
它帶來的提升是 :

  • 解決業(yè)務層面的耦合,業(yè)務清晰

  • 能對不同業(yè)務的數(shù)據(jù)進行分級管理、維護、監(jiān)控、擴展等

  • 高并發(fā)場景下,垂直分庫一定程度的提升IO、數(shù)據(jù)庫連接數(shù)、降低單機硬件資源的瓶頸
    垂直分庫通過將表按業(yè)務分類,然后分庫在不同數(shù)據(jù)庫,并且可以將這些數(shù)據(jù)庫部署在不同服務器上,從而達到多個服務器共同分攤壓力的效果,但是依然沒有解決單表數(shù)據(jù)量過大的問題。

1.2.3.水平分庫

經(jīng)過垂直分庫后,數(shù)據(jù)庫性能問題得到一定程度的解決,但是隨著業(yè)務量的增長,PRODUCT_DB(商品庫)單庫存儲數(shù)據(jù)已經(jīng)超出預估。粗糧統(tǒng)計,目前有8W店鋪,每個店鋪平均150個不同規(guī)格的商品,再算增長,那商品數(shù)量的往1500w+上預估,并且PRODUCT_DB(商品庫)屬于訪問非常頻繁的資源,單臺服務器已經(jīng)無法支撐。此時該如何優(yōu)化?
再次分庫?但是從業(yè)務角度分析,目前情況已經(jīng)無法再次垂直分庫??梢試L試水平分庫,將店鋪ID為單數(shù)的和店鋪ID為雙數(shù)的商品信息分別放在兩個庫中。


也就是說,要操作其某條數(shù)據(jù),先分析這條數(shù)據(jù)所屬的店鋪ID。如果店鋪ID為雙數(shù),將此操作映射至PRODUCT_DB1(商品庫1);如果ID為單數(shù),將操作映射至RRODUCT_DB2(商品庫2)。此操作要訪問數(shù)據(jù)庫名稱的表達式為RRODUCT_DB【店鋪ID%2 + 1】.
小明進行的這一步優(yōu)化,就叫水平分庫。
水平分庫是把同一個表的數(shù)據(jù)按一定規(guī)則拆分到不同的數(shù)據(jù)庫中,每個庫可以放不同的服務器上。
對比 :垂直分庫是把不同表拆到不同數(shù)據(jù)庫中,它是對數(shù)據(jù)行的拆分,不影響表結(jié)構(gòu)。
它帶來的提升是 :

  • 解決來單庫大數(shù)據(jù),高并發(fā)的性能瓶頸。

  • 提高來系統(tǒng)的穩(wěn)定性及可用性。
    穩(wěn)定性體現(xiàn)在IO沖突減少,鎖定減少,可用性指某個庫出問題,部分可用。
    當一個應用難以再細粒度的垂直切分,或切分后數(shù)據(jù)量行巨大,存在單庫讀寫、存儲性能瓶頸,這時候就需要進行水平分庫了,經(jīng)過水平切分的優(yōu)化,往往能解決單庫存儲量及性能瓶頸。但由于同一個表被分配在不同的數(shù)據(jù)庫,需要額外進行數(shù)據(jù)操作的路由工作,因此大大提升了系統(tǒng)復雜度。

1.2.4.水平分表

按照水平分庫的思路對他把PRODUCT_DB_X(商品庫)內(nèi)的表也可以進行水平拆分,其目的也是為解決單表數(shù)據(jù)量大的問題,如下圖 :


與水平分庫的思路類似,不過這次操作的目標是表,商品信息及商品描述被分成了兩套表。如果商品ID為雙數(shù),將此操作映射至商品信息1表;如果商品ID為單數(shù),將操作映射至商品信息2表。此操作要訪問表名稱的表達式為商品信息【商品ID%2 + 1】。
小明進行的這一步優(yōu)化,就叫水平分表。
水平分表是在同一個數(shù)據(jù)庫內(nèi),把同一個表的數(shù)據(jù)按一定規(guī)則拆到多個表中。
它帶來的提升是 :

  • 優(yōu)化單一表數(shù)據(jù)量過大而產(chǎn)生的性能問題

  • 避免IO爭搶并減少鎖表的幾率
    庫內(nèi)的水平分表,解決來單一表數(shù)據(jù)量過大的問題,分出來的小表中只包含一部分數(shù)據(jù),從而使得單個表的數(shù)據(jù)量變小,提高檢索性能。

1.2.5 小結(jié)

介紹來分庫分表的幾種方式,它們分別是垂直分表、垂直分庫、水平分庫和水平分表 :
垂直分表 :可以把一個寬表的字段按訪問頻次,是否是大字段的原則拆分為多個表,這樣既能使業(yè)務清晰,還能提升部分性能。拆分后,盡量從業(yè)務角度避免聯(lián)查,否則性能方面將得不償失。
垂直分庫 :可以把多個表按業(yè)務耦合松緊歸類,分別存放在不同的庫,這些庫可以分布在不同服務器,從而使訪問壓力被能服務器負載,大大提升性能,同時能提高整體架構(gòu)的業(yè)務清晰度,不同的業(yè)務庫可根據(jù)自身情況定制優(yōu)化方案。但是它需要解決跨庫帶來的所有復雜問題。
水平分庫 :可以把一個表的數(shù)據(jù)(按數(shù)據(jù)行)分到多個不同的庫,每個庫只有這個表的部分數(shù)據(jù),這些庫可以分布在不同服務器,從而使訪問壓力被多服務器負載,大大提升性能。它不僅需要解決跨庫帶來的所有復雜問題,還要解決數(shù)據(jù)路由的問題(數(shù)據(jù)路由問題后邊介紹)。
水平分表 :可以把一個表的數(shù)據(jù)(按數(shù)據(jù)行)分到多個同一個數(shù)據(jù)庫的多張表中,每個表只有這個表的部分數(shù)據(jù),這樣做能小幅提升性能,它僅僅作為水平分庫的一個補充優(yōu)化。
一般來說,在系統(tǒng)設(shè)計階段就應該根據(jù)業(yè)務耦合松緊來確定垂直分庫,垂直分表方案,在數(shù)據(jù)量及訪問壓力不是特別大的情況,首先考慮緩沖、讀寫分離、索引技術(shù)等方案。若數(shù)據(jù)量極大,且持續(xù)增長,再考慮水平分庫水平分表方案。

1.3.分庫分表帶來的問題

分庫分表能有效的緩解來單機和單庫帶來的性能瓶頸和壓力,突破網(wǎng)絡IO、硬件資源、連接數(shù)的瓶頸,同時也帶來了一些問題。

1.3.1.事務一致性問題

由于分庫分表把數(shù)據(jù)分布在不同庫甚至不同服務器,不可避免會帶來分布式事務問題。

1.3.2.跨節(jié)點關(guān)聯(lián)查詢

在沒有分庫前,我們檢索商品時可以通過以下SQL對店鋪信息進行關(guān)聯(lián)查詢 :

SELECT p.*,r.[地理區(qū)域名稱],s.[店鋪名稱],s.[信譽] FROM [商品信息] p
LEFT JOIN [地理區(qū)域] r ON p.[產(chǎn)地] = r.[地理區(qū)域編碼] LEFT JOIN [店鋪信息] s ON p.id = s.[所屬店鋪] WHERE...ORDER BY...LIMIT...

但垂直分庫后【商品信息】和【店鋪信息】不在一個數(shù)據(jù)庫,甚至不在一臺服務器,無法進行關(guān)聯(lián)查詢。
可將原關(guān)聯(lián)查詢分為兩次查詢,第一次查詢的結(jié)果集中找出關(guān)聯(lián)數(shù)據(jù)id,然后根據(jù)id發(fā)起第二次請求得到關(guān)聯(lián)數(shù)據(jù),最后將獲得到的數(shù)據(jù)進行拼裝。

1.3.3.跨節(jié)點分頁、排序函數(shù)

跨節(jié)點多庫進行查詢時,limit分頁、order by排序等問題,就變得比較復雜了。需要先在不同的分片節(jié)點中將數(shù)據(jù)進行排序并返回,然后將不同分片返回的結(jié)果集進行匯總和再次排序。
如,進行水平分庫后的商品庫,按ID倒序排序分頁,取第一頁 :


以上流程是取第一頁的數(shù)據(jù),性能影響不大,但由于商品信息的分布在各數(shù)據(jù)庫的數(shù)據(jù)可能是隨機的,如果是取第N頁,需要將所有節(jié)點前N頁數(shù)據(jù)都取出來合并,再進行整體的排序,操作效率可想而知。所以請求頁數(shù)越大,系統(tǒng)的性能也會越差。在使用Max、Min、Sum、Count之類的函數(shù)進行計算的時候,與排序分頁同理,也需要先在每個分片上執(zhí)行相應的函數(shù),然后將各個分片的結(jié)果集進行匯總和再次計算,最終將結(jié)果返回。

1.3.4.主鍵避重

在分庫分表環(huán)境中,由于表中數(shù)據(jù)同時存在不同數(shù)據(jù)庫中,主鍵值平時使用的自增長將無用武之地,某個分區(qū)數(shù)據(jù)庫生成的ID無法保證全局唯一。因此需要單獨設(shè)計全局主鍵,比避免跨庫主鍵重復問題。

1.3.5.公共表

實際的應用場景中,參數(shù)表、數(shù)據(jù)字典表等都是數(shù)據(jù)量較小,變動少,而且屬于高頻聯(lián)合查詢的依賴表。例子中地理區(qū)域表也屬于此類型。
可以將這類表在每個數(shù)據(jù)庫都保存一份,所有對公共表的更新操作都同時發(fā)送到分庫執(zhí)行。
由于分庫分表之后,數(shù)據(jù)被分散在不同的數(shù)據(jù)庫、服務器。因此,對數(shù)據(jù)的操作也就無法通過常規(guī)方式完成,并且它還帶來了一系列的問題。好在,這些問題不是所有都需要我們在應用層面上解決,其中Sharding-JDBC中間件可供選擇。

1.4 Sharding-JDBC介紹

1.4.1 Sharding-JDBC介紹

Sharding-JDBC是當當網(wǎng)研發(fā)的開源分布式數(shù)據(jù)庫中間件,從 3.0 開始Sharding-JDBC被包含在 Sharding-Sphere 中,之后該項目進入進入Apache孵化器,4.0版本之后的版本為Apache版本。
ShardingSphere是一套開源的分布式數(shù)據(jù)庫中間件解決方案組成的生態(tài)圈,它由Sharding-JDBC、Sharding- Proxy和Sharding-Sidecar(計劃中)這3款相互獨立的產(chǎn)品組成。 他們均提供標準化的數(shù)據(jù)分片、分布式事務和 數(shù)據(jù)庫治理功能,可適用于如Java同構(gòu)、異構(gòu)語言、容器、云原生等各種多樣化的應用場景。
官方地址:https://shardingsphere.apache.org/document/current/cn/overview/
咱們目前只需關(guān)注Sharding-JDBC,它定位為輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端 直連數(shù)據(jù)庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅(qū)動,完全兼容JDBC和各種 ORM框架。
Sharding-JDBC的核心功能為數(shù)據(jù)分片和讀寫分離,通過Sharding-JDBC,應用可以透明的使用jdbc訪問已經(jīng)分庫 分表、讀寫分離的多個數(shù)據(jù)源,而不用關(guān)心數(shù)據(jù)源的數(shù)量以及數(shù)據(jù)如何分布。

  • 適用于任何基于Java的ORM框架,如: Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。

  • 基于任何第三方的數(shù)據(jù)庫連接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。

  • 支持任意實現(xiàn)JDBC規(guī)范的數(shù)據(jù)庫。目前支持MySQL,Oracle,SQLServer和PostgreSQL。


    上圖展示了Sharding-Jdbc的工作方式,使用Sharding-Jdbc前需要人工對數(shù)據(jù)庫進行分庫分表,在應用程序中加入 Sharding-Jdbc的Jar包,應用程序通過Sharding-Jdbc操作分庫分表后的數(shù)據(jù)庫和數(shù)據(jù)表,由于Sharding-Jdbc是對 Jdbc驅(qū)動的增強,使用Sharding-Jdbc就像使用Jdbc驅(qū)動一樣,在應用程序中是無需指定具體要操作的分庫和分表 的。

1.4.2 與jdbc性能對比

    1. 性能損耗測試 :服務器資源充足、并發(fā)數(shù)相同,比較JDBC和Sharding-JDBC性能損耗,Sharding-JDBC相對JDBC損耗不超過7%。
      基準測試性能對比

    2. 性能對比測試:服務器資源使用到極限,相同的場景JDBC與Sharding-JDBC的吞吐量相當。

    3. 性能對比測試:服務器資源使用到極限,Sharding-JDBC采用分庫分表后,Sharding-JDBC吞吐量較JDBC不分表有接近2倍的提升。

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ShardingJdbc分庫分表實戰(zhàn)案例解析(下)
Sharding-JDBC—分庫分表實例【面試+工作】
訂單中心架構(gòu)設(shè)計與實踐
記錄一次經(jīng)歷的數(shù)據(jù)庫從單庫到分庫分表的過程
筆者帶你剖析輕量級Sharding中間件——Kratos1.x
解讀分庫分表中間件Sharding-JDBC
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服