色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是分庫分表?為什么分庫分表?什么情況下會用分庫分表呢?

OSC開源社區 ? 來源:程序員小富 ? 作者:小富 ? 2022-11-30 09:37 ? 次閱讀

什么是分庫分表

分庫分表是在海量數據下,由于單庫、表數據量過大,導致數據庫性能持續下降的問題,演變出的技術方案。

分庫分表是由分庫和分表這兩個獨立概念組成的,只不過通常分庫與分表的操作會同時進行,以至于我們習慣性的將它們合在一起叫做分庫分表。

397c9e16-6fe6-11ed-8abf-dac502259ad0.png

通過一定的規則,將原本數據量大的數據庫拆分成多個單獨的數據庫,將原本數據量大的表拆分成若干個數據表,使得單一的庫、表性能達到最優的效果(響應速度快),以此提升整體數據庫性能。

為什么分庫分表

單機數據庫的存儲能力、連接數是有限的,它自身就很容易會成為系統的瓶頸。當單表數據量在百萬以里時,我們還可以通過添加從庫、優化索引提升性能。

一旦數據量朝著千萬以上趨勢增長,再怎么優化數據庫,很多操作性能仍下降嚴重。為了減少數據庫的負擔,提升數據庫響應速度,縮短查詢時間,這時候就需要進行分庫分表。

為什么需要分庫?

容量

我們給數據庫實例分配的磁盤容量是固定的,數據量持續的大幅增長,用不了多久單機的容量就會承載不了這么多數據,解決辦法簡單粗暴,加容量!

連接數

單機的容量可以隨意擴展,但數據庫的連接數卻是有限的,在高并發場景下多個業務同時對一個數據庫操作,很容易將連接數耗盡導致too many connections報錯,導致后續數據庫無法正常訪問。

可以通過max_connections查看MySQL最大連接數。

showvariableslike'%max_connections%'
3990e16e-6fe6-11ed-8abf-dac502259ad0.png

將原本單數據庫按不同業務拆分成訂單庫、物流庫、積分庫等不僅可以有效分攤數據庫讀寫壓力,也提高了系統容錯性。

為什么需要分表?

做過報表業務的同學應該都體驗過,一條SQL執行時間超過幾十秒的場景。

導致數據庫查詢慢的原因有很多,SQL沒命中索引、like掃全表、用了函數計算,這些都可以通過優化手段解決,可唯獨數據量大是MySQL無法通過自身優化解決的。慢的根本原因是InnoDB存儲引擎,聚簇索引結構的 B+tree 層級變高,磁盤IO變多查詢性能變慢,詳細原理自行查找一下,這里不用過多篇幅說明。

阿里的開發手冊中有條建議,單表行數超500萬行或者單表容量超過2GB,就推薦分庫分表,然而理想和實現總是有差距的,阿里這種體量的公司不差錢當然可以這么用,實際上很多公司單表數據幾千萬、億級別仍然不選擇分庫分表。

39a143f6-6fe6-11ed-8abf-dac502259ad0.png

什么時候分庫分表

技術群里經常會有小伙伴問,到底什么情況下會用分庫分表呢?

分庫分表要解決的是現存海量數據訪問的性能瓶頸,對持續激增的數據量所做出的架構預見性。

是否分庫分表的關鍵指標是數據量,我們以fire100.top這個網站的資源表 t_resource為例,系統在運行初始的時候,每天只有可憐的幾十個資源上傳,這時使用單庫、單表的方式足以支持系統的存儲,數據量小幾乎沒什么數據庫性能瓶頸。

但某天開始一股神秘的流量進入,系統每日產生的資源數據量暴增至十萬甚至上百萬級別,這時資源表數據量到達千萬級,查詢響應變得緩慢,數據庫的性能瓶頸逐漸顯現。

以MySQL數據庫為例,單表的數據量在達到億條級別,通過加索引、SQL調優等傳統優化策略,性能提升依舊微乎其微時,就可以考慮做分庫分表了。

既然MySQL存儲海量數據時會出現性能瓶頸,那么我們是不是可以考慮用其他方案替代它?比如高性能的非關系型數據庫MongoDB?

可以,但要看存儲的數據類型!

現在互聯網上大部分公司的核心數據幾乎是存儲在關系型數據庫(MySQL、Oracle等),因為它們有著NoSQL如法比擬的穩定性和可靠性,產品成熟生態系統完善,還有核心的事務功能特性,也是其他存儲工具不具備的,而評論、點贊這些非核心數據還是可以考慮用MongoDB的。

如何分庫分表

分庫分表的核心就是對數據的分片(Sharding)并相對均勻的路由在不同的庫、表中,以及分片后對數據的快速定位與檢索結果的整合。

分庫與分表可以從:垂直(縱向)和 水平(橫向)兩種緯度進行拆分。下邊我們以經典的訂單業務舉例,看看如何拆分。

39b35f96-6fe6-11ed-8abf-dac502259ad0.png

垂直拆分

1、垂直分庫

垂直分庫一般來說按照業務和功能的維度進行拆分,將不同業務數據分別放到不同的數據庫中,核心理念 專庫專用。

按業務類型對數據分離,剝離為多個數據庫,像訂單、支付、會員、積分相關等表放在對應的訂單庫、支付庫、會員庫、積分庫。不同業務禁止跨庫直連,獲取對方業務數據一律通過API接口交互,這也是微服務拆分的一個重要依據。

39c21c2a-6fe6-11ed-8abf-dac502259ad0.png

垂直分庫

垂直分庫很大程度上取決于業務的劃分,但有時候業務間的劃分并不是那么清晰,比如:電商中訂單數據的拆分,其他很多業務都依賴于訂單數據,有時候界線不是很好劃分。

垂直分庫把一個庫的壓力分攤到多個庫,提升了一些數據庫性能,但并沒有解決由于單表數據量過大導致的性能問題,所以就需要配合后邊的分表來解決。

2、垂直分表

垂直分表針對業務上字段比較多的大表進行的,一般是把業務寬表中比較獨立的字段,或者不常用的字段拆分到單獨的數據表中,是一種大表拆小表的模式。

例如:一張t_order訂單表上有幾十個字段,其中訂單金額相關字段計算頻繁,為了不影響訂單表t_order的性能,就可以把訂單金額相關字段拆出來單獨維護一個t_order_price_expansion擴展表,這樣每張表只存儲原表的一部分字段,通過訂單號order_no做關聯,再將拆分出來的表路由到不同的庫中。

39dce7f8-6fe6-11ed-8abf-dac502259ad0.png

數據庫它是以行為單位將數據加載到內存中,這樣拆分以后核心表大多是訪問頻率較高的字段,而且字段長度也都較短,因而可以加載更多數據到內存中,減少磁盤IO,增加索引查詢的命中率,進一步提升數據庫性能。

水平拆分

上邊垂直分庫、垂直分表后還是會存在單庫、表數據量過大的問題,當我們的應用已經無法在細粒度的垂直切分時,依舊存在單庫讀寫、存儲性能瓶頸,這時就要配合水平分庫、水平分表一起了。

1、水平分庫

水平分庫是把同一個表按一定規則拆分到不同的數據庫中,每個庫可以位于不同的服務器上,以此實現水平擴展,是一種常見的提升數據庫性能的方式。

39ec775e-6fe6-11ed-8abf-dac502259ad0.png

例如:db_orde_1、db_order_2兩個數據庫內有完全相同的t_order表,我們在訪問某一筆訂單時可以通過對訂單的訂單編號取模的方式 訂單編號 mod 2 (數據庫實例數) ,指定該訂單應該在哪個數據庫中操作。

這種方案往往能解決單庫存儲量及性能瓶頸問題,但由于同一個表被分配在不同的數據庫中,數據的訪問需要額外的路由工作,因此系統的復雜度也被提升了。

2、水平分表

水平分表是在同一個數據庫內,把一張大數據量的表按一定規則,切分成多個結構完全相同表,而每個表只存原表的一部分數據。

例如:一張t_order訂單表有900萬數據,經過水平拆分出來三個表,t_order_1、t_order_2、t_order_3,每張表存有數據300萬,以此類推。

3a010dd6-6fe6-11ed-8abf-dac502259ad0.png

水平分表盡管拆分了表,但子表都還是在同一個數據庫實例中,只是解決了單一表數據量過大的問題,并沒有將拆分后的表分散到不同的機器上,還在競爭同一個物理機的CPU、內存、網絡IO等。要想進一步提升性能,就需要將拆分后的表分散到不同的數據庫中,達到分布式的效果。

3a1e478e-6fe6-11ed-8abf-dac502259ad0.png

數據存在哪個庫的表

分庫分表以后會出現一個問題,一張表會出現在多個數據庫里,到底該往哪個庫的哪個表里存呢?

上邊我們多次提到過一定規則 ,其實這個規則它是一種路由算法,決定了一條數據具體應該存在哪個數據庫的哪張表里。

常見的有 取模算法 、范圍限定算法、范圍+取模算法 、預定義算法

1、取模算法

關鍵字段取模(對hash結果取余數 hash(XXX) mod N),N為數據庫實例數或子表數量)是最為常見的一種路由方式。

以t_order訂單表為例,先給數據庫從 0 到 N-1進行編號,對 t_order訂單表中order_no訂單編號字段進行取模hash(order_no) mod N,得到余數i。i=0存第一個庫,i=1存第二個庫,i=2存第三個庫,以此類推。

3a40e442-6fe6-11ed-8abf-dac502259ad0.png

同一筆訂單數據會落在同一個庫、表里,查詢時用相同的規則,用t_order訂單編號作為查詢條件,就能快速的定位到數據。

優點

實現簡單,數據分布相對比較均勻,不易出現請求都打到一個庫上的情況。

缺點

取模算法對集群的伸縮支持不太友好,集群中有N個數據庫實·hash(user_id) mod N,當某一臺機器宕機,本應該落在該數據庫的請求就無法得到處理,這時宕掉的實例會被踢出集群。

此時機器數減少算法發生變化hash(user_id) mod N-1,同一用戶數據落在了在不同數據庫中,等這臺機器恢復,用user_id作為條件查詢用戶數據就會少一部分。

2、范圍限定算法

范圍限定算法以某些范圍字段,如時間或ID區拆分。

用戶表t_user被拆分成t_user_1、t_user_2、t_user_3三張表,后續將user_id范圍為1 ~ 1000w的用戶數據放入t_user_1,1000~ 2000w放入t_user_2,2000~3000w放入t_user_3,以此類推。按日期范圍劃分同理。

3a5ecc96-6fe6-11ed-8abf-dac502259ad0.png

優點

單表數據量是可控的

水平擴展簡單只需增加節點即可,無需對其他分片的數據進行遷移

缺點

由于連續分片可能存在數據熱點,比如按時間字段分片時,如果某一段時間(雙11等大促)訂單驟增,存11月數據的表可能會被頻繁的讀寫,其他分片表存儲的歷史數據則很少被查詢,導致數據傾斜,數據庫壓力分攤不均勻。

3、范圍 + 取模算法

為了避免熱點數據的問題,我們可以對上范圍算法優化一下

這次我們先通過范圍算法定義每個庫的用戶表t_user只存1000w數據,第一個db_order_1庫存放userId從1 ~ 1000w,第二個庫1000~2000w,第三個庫2000~3000w,以此類推。

3a72681e-6fe6-11ed-8abf-dac502259ad0.png

每個庫里再把用戶表t_user拆分成t_user_1、t_user_2、t_user_3等,對userd進行取模路由到對應的表中。

有效的避免數據分布不均勻的問題,數據庫水平擴展也簡單,直接添加實例無需遷移歷史數據。

4、地理位置分片

地理位置分片其實是一個更大的范圍,按城市或者地域劃分,比如華東、華北數據放在不同的分片庫、表。

5、預定義算法

預定義算法是事先已經明確知道分庫和分表的數量,可以直接將某類數據路由到指定庫或表中,查詢的時候亦是如此。

分庫分表出來的問題

了解了上邊分庫分表的拆分方式不難發現,相比于拆分前的單庫單表,系統的數據存儲架構演變到現在已經變得非常復雜。看幾個具有代表性的問題,比如:

分頁、排序、跨節點聯合查詢

分頁、排序、聯合查詢,這些看似普通,開發中使用頻率較高的操作,在分庫分表后卻是讓人非常頭疼的問題。把分散在不同庫中表的數據查詢出來,再將所有結果進行匯總合并整理后提供給用戶。

比如:我們要查詢11、12月的訂單數據,如果兩個月的數據是分散到了不同的數據庫實例,則要查詢兩個數據庫相關的數據,在對數據合并排序、分頁,過程繁瑣復雜。

3a8c86cc-6fe6-11ed-8abf-dac502259ad0.png

事務一致性

分庫分表后由于表分布在不同庫中,不可避免會帶來跨庫事務問題。后續會分別以阿里的Seata和MySQL的XA協議實現分布式事務,用來比較各自的優勢與不足。

全局唯一的主鍵

分庫分表后數據庫表的主鍵ID業務意義就不大了,因為無法在標識唯一一條記錄,例如:多張表t_order_1、t_order_2的主鍵ID全部從1開始會重復,此時我們需要主動為一條記錄分配一個ID,這個全局唯一的ID就叫分布式ID,發放這個ID的系統通常被叫發號器。

多數據庫高效治理

對多個數據庫以及庫內大量分片表的高效治理,是非常有必要,因為像某寶這種大廠一次大促下來,訂單表可能會被拆分成成千上萬個t_order_n表,如果沒有高效的管理方案,手動建表、排查問題是一件很恐怖的事。

歷史數據遷移

分庫分表架構落地以后,首要的問題就是如何平滑的遷移歷史數據,增量數據和全量數據遷移,這又是一個比較麻煩的事情,后邊詳細講。

分庫分表架構模式

分庫分表架構主要有兩種模式:client客戶端模式和proxy代理模式

客戶模式

client模式指分庫分表的邏輯都在你的系統應用內部進行控制,應用會將拆分后的SQL直連多個數據庫進行操作,然后本地進行數據的合并匯總等操作。

3aa639aa-6fe6-11ed-8abf-dac502259ad0.png

代理模式

proxy代理模式將應用程序與MySQL數據庫隔離,業務方的應用不在需要直連數據庫,而是連接proxy代理服務,代理服務實現了MySQL的協議,對業務方來說代理服務就是數據庫,它會將SQL分發到具體的數據庫進行執行,并返回結果。該服務內有分庫分表的配置,根據配置自動創建分片表。

3ab6944e-6fe6-11ed-8abf-dac502259ad0.png

如何抉擇

如何選擇client模式和proxy模式,我們可以從以下幾個方面來簡單做下比較。

1、性能

性能方面client模式表現的稍好一些,它是直接連接MySQL執行命令;proxy代理服務則將整個執行鏈路延長了,應用->代理服務->MySQL,可能導致性能有一些損耗,但兩者差距并不是非常大。

2、復雜度

client模式在開發使用通常引入一個jar可以;proxy代理模式則需要搭建單獨的服務,有一定的維護成本,既然是服務那么就要考慮高可用,畢竟應用的所有SQL都要通過它轉發至MySQL。

3、升級

client模式分庫分表一般是依賴基礎架構團隊的Jar包,一旦有版本升級或者Bug修改,所有應用到的項目都要跟著升級。小規模的團隊服務少升級問題不大,如果是大公司服務規模大,且涉及到跨多部門,那么升級一次成本就比較高;

proxy模式在升級方面優勢很明顯,發布新功能或者修復Bug,只要重新部署代理服務集群即可,業務方是無感知的,但要保證發布過程中服務的可用性。

4、治理、監控

client模式由于是內嵌在應用內,應用集群部署不太方便統一處理;proxy模式在對SQL限流、讀寫權限控制、監控、告警等服務治理方面更優雅一些。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10901

    瀏覽量

    212666
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26674

原文標題:好好的系統,為什么要分庫分表?

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    數據庫分區、分庫

    今天先說說數據庫的數據分區,分庫以及的內容吧! 數據庫分區、分庫 數據庫分區、
    的頭像 發表于 09-30 11:24 ?2902次閱讀

    為什么要分庫?MySQL分庫實踐

    剛開始多數項目用單機數據庫就夠了,隨著服務器流量越來越大,面對的請求也越來越多,我們做了數據庫讀寫分離, 使用多個從庫副本(Slave)負責讀,使用主庫(Master)負責寫,master和slave通過主從復制實現數據同步更新,保持數據一致。
    的頭像 發表于 11-25 17:47 ?1633次閱讀
    為什么要<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>?MySQL<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>實踐

    談分布式數據庫中間件之分庫   

      分庫,顧名思義就是把原本存儲于一個庫的數據分塊存儲到多個庫上,把原本存儲于一個的數據分塊存儲到多個上。那么關于
    發表于 08-02 20:19

    分庫是什么?怎么實現?

    數據庫分庫、讀寫分離的原理實現,使用場景
    發表于 10-25 17:24

    利用Mycat實現MySQL讀寫分離、分庫最佳實踐

    利用Mycat實現MySQL讀寫分離、分庫最佳實踐
    發表于 09-08 10:20 ?14次下載
    利用Mycat實現MySQL讀寫分離、<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>最佳實踐

    結合實踐對水平分庫做一個系統地剖析

    隨著大型互聯網應用的發展,海量數據的存儲和訪問成為系統設計的瓶頸,分布式處理成為不二選擇。數據庫拆分,特別是水平分庫是個高難度的活,涉及一系列技術決策。 本人有幸負責1號店訂單水平分庫的方案設計
    發表于 10-11 17:46 ?0次下載
    結合實踐對水平<b class='flag-5'>分庫</b>做一個系統地剖析

    數據庫分庫基礎和實踐

    問題?  一般情況下,列表分頁時需要按照指定字段進行排序。在單庫單情況下,分頁和排序也是非常容易的。但是,隨著分庫
    發表于 09-05 16:40 ?264次閱讀

    數據庫瓶頸及分庫表示例

    就可以想象了吧(并發量、吞吐量、崩潰)。 1、IO瓶頸 第一種:磁盤讀IO瓶頸,熱點數據太多,數據庫緩存放不下,每次查詢時會產生大量的IO,降低查詢速度 -分庫和垂直。 第二種:網絡IO瓶頸,請求的數據太多,網絡帶寬不夠 -
    的頭像 發表于 09-24 15:52 ?1961次閱讀
    數據庫瓶頸及<b class='flag-5'>分庫</b><b class='flag-5'>分</b>表示例

    你們知道為什么要分庫

    在文章開頭先拋幾個問題: (1)什么時候才需要分庫?我們的評判標準是什么? (2)一張存儲了多少數據的時候,才需要考慮
    的頭像 發表于 08-16 10:37 ?1551次閱讀

    優化MySQL數據庫中樸實無華的和花里胡哨的分庫

    blog.csdn.net/qq_39390545/article/details/116248222 一、樸實無華的 - 1、垂直 2、水平分
    的頭像 發表于 08-26 16:33 ?1280次閱讀

    你是否知道分庫需要哪些要素?

    分庫會重新影響數據的分布,無論是全量還是增量,都會涉及到數據遷移,所以Databus是必要的。
    的頭像 發表于 10-12 10:39 ?806次閱讀

    分庫的21條法則速來碼住(上)

    還是不著急實戰,咱們先介紹下在分庫架構實施過程中,會接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫表工具,盡管它們的實
    的頭像 發表于 05-26 17:33 ?582次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來碼住(上)

    分庫的21條法則速來碼住(

    還是不著急實戰,咱們先介紹下在分庫架構實施過程中,會接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫表工具,盡管它們的實
    的頭像 發表于 05-26 17:33 ?660次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來碼住(<b class='flag-5'>下</b>)

    分庫后復雜查詢的應對之道:基于DTS實時性ES寬構建技術實踐

    ,通過分庫應對存系統讀寫性能瓶頸和存儲瓶頸;分庫
    的頭像 發表于 06-25 18:30 ?902次閱讀
    <b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復雜查詢的應對之道:基于DTS實時性ES寬<b class='flag-5'>表</b>構建技術實踐

    軟件系統數據庫的分庫設計

    軟件系統數據庫的分庫設計 系統讀寫分離、分庫技術實現采用MyCat中間件,MyCat 是
    的頭像 發表于 08-22 11:39 ?356次閱讀
    軟件系統數據庫的<b class='flag-5'>分庫</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設計
    主站蜘蛛池模板: 健身房被教练啪到腿软H | 国产精品久久久久久久久齐齐 | 黑人寄宿羽月希产后奶水 | 日产精品久久久久久久蜜殿 | 国产精品日本一区二区在线播放 | 亚洲精品久久区二区三区蜜桃臀 | 交换邻居波多野结衣中文字幕 | 特黄AAAAAAA片免费视频 | 久久久精品3d动漫一区二区三区 | SM调教贱屁股眼哭叫求饶H | 国产成人女人在线视频观看 | 亚洲精品乱码一区二区三区 | 黄色网址在线看 | 76人遣返航班上71人呈阳性 | poronovideos动物狗猪 | 久草在线福利视频在线播放 | 伊人AV一区二区三区夜色撩人 | 亚洲色 图 | 国产精品乱码一区二区三 | 国内精品一级毛片免费看 | 中文字幕一区二区视频 | 上课失禁丨vk | 少男同志freedeos | 国内精品视频一区二区在线观看 | beeg日本老妇人 | 欧美黑人巨大videos免费 | 小护士大pp | 色偷拍自怕亚洲在线 | 伊人久久影院大香线蕉 | 国产香蕉视频在线播放 | 娇小萝被两个黑人用半米长 | 99久久久免费精品国产 | av在线观看地址 | 午夜日本大胆裸艺术 | 制服的微热 | 欲乱艳荡少寡妇全文免费 | 浴室里强摁做开腿呻吟的漫画男男 | 超碰在线视频人人AV | 男女交性视频无遮挡全过程 | 国产福利一区二区精品 | 久久免费精品视频 |