0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么要分庫(kù)分表?MySQL分庫(kù)分表實(shí)踐

馬哥Linux運(yùn)維 ? 來(lái)源:稀土掘金 ? 2023-11-25 17:47 ? 次閱讀

一、為什么要分庫(kù)分表

數(shù)據(jù)庫(kù)架構(gòu)演變

剛開(kāi)始多數(shù)項(xiàng)目用單機(jī)數(shù)據(jù)庫(kù)就夠了,隨著服務(wù)器流量越來(lái)越大,面對(duì)的請(qǐng)求也越來(lái)越多,我們做了數(shù)據(jù)庫(kù)讀寫分離, 使用多個(gè)從庫(kù)副本(Slave)負(fù)責(zé)讀,使用主庫(kù)(Master)負(fù)責(zé)寫,master和slave通過(guò)主從復(fù)制實(shí)現(xiàn)數(shù)據(jù)同步更新,保持?jǐn)?shù)據(jù)一致。slave 從庫(kù)可以水平擴(kuò)展,所以更多的讀請(qǐng)求不成問(wèn)題

但是當(dāng)用戶量級(jí)上升,寫請(qǐng)求越來(lái)越多,怎么保證數(shù)據(jù)庫(kù)的負(fù)載足夠?增加一個(gè)Master是不能解決問(wèn)題的, 因?yàn)閿?shù)據(jù)要保存一致性,寫操作需要2個(gè)master之間同步,相當(dāng)于是重復(fù)了,而且架構(gòu)設(shè)計(jì)更加復(fù)雜

這時(shí)需要用到分庫(kù)分表(sharding),把庫(kù)和表存放在不同的MySQL Server上,每臺(tái)服務(wù)器可以均衡寫請(qǐng)求的次數(shù)

二、庫(kù)表太大產(chǎn)生的問(wèn)題

單庫(kù)太大:?jiǎn)螏?kù)處理能力有限、所在服務(wù)器上的磁盤空間不足、遇到IO瓶頸,需要把單庫(kù)切分成更多更小的庫(kù)

單表太大:CRUD效率都很低,數(shù)據(jù)量太大導(dǎo)致索引文件過(guò)大,磁盤IO加載索引花費(fèi)時(shí)間,導(dǎo)致查詢超時(shí)。所以只用索引還是不行的,需要把單表切分成多個(gè)數(shù)據(jù)集更小的表。MyCat提供的分表算法都在rule.xml,可以根據(jù)不同的分表算法進(jìn)行拆分,比如根據(jù)時(shí)間拆分、一致性哈希、直接用主鍵對(duì)分表的個(gè)數(shù)取模等

拆分策略

單個(gè)庫(kù)太大,先考慮是表多還是數(shù)據(jù)多:

如果因?yàn)楸矶喽斐蓴?shù)據(jù)過(guò)多,則使用垂直拆分,即根據(jù)業(yè)務(wù)拆分成不同的庫(kù)

如果因?yàn)閱螐埍淼臄?shù)據(jù)量太大,則使用水平拆分,即把表的數(shù)據(jù)按照某種規(guī)則(mycat/conf/rule.xml定義的分表算法)拆分成多張表

分庫(kù)分表的原則應(yīng)該是先考慮垂直拆分,再考慮水平拆分

三、垂直拆分

分庫(kù)分表和讀寫分離可以共同進(jìn)行

1. 垂直分庫(kù)

server.xml



123456
USERDB1,USERDB2

配置了USERDB1、USERDB2這兩個(gè)邏輯庫(kù)

schema.xml





  
   
  
  
    
    
  
  
    select user()
    
  
  
  
    select user()
    
  

兩個(gè)邏輯庫(kù)對(duì)應(yīng)兩個(gè)不同的數(shù)據(jù)節(jié)點(diǎn),兩個(gè)數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng)兩個(gè)不同的物理機(jī)器

d78658b6-8b76-11ee-939d-92fbcf53809c.jpg

mytest1和mytest2分成了不同機(jī)器上的不同的庫(kù),各包含一部分表,它們?cè)瓉?lái)是合在一塊的,在一臺(tái)機(jī)器上,現(xiàn)在做了垂直的拆分。

客戶端就需要去連接不同的邏輯庫(kù)了,根據(jù)業(yè)務(wù)操作不同的邏輯庫(kù)

d79f1cf2-8b76-11ee-939d-92fbcf53809c.jpg

然后配置了兩個(gè)寫庫(kù),兩臺(tái)機(jī)器把庫(kù)平分了,分擔(dān)了原來(lái)單機(jī)的壓力。分庫(kù)伴隨著分表,從業(yè)務(wù)上對(duì)表拆分

2. 垂直分表

垂直分表,基于列字段進(jìn)行。一般是針對(duì)幾百列的這種大表,也避免查詢時(shí),數(shù)據(jù)量太大造成的“跨頁(yè)”問(wèn)題。

一般是表中的字段較多,將不常用的, 數(shù)據(jù)較大,長(zhǎng)度較長(zhǎng)(比如text類型字段)的拆分到擴(kuò)展表。訪問(wèn)頻率較高的字段單獨(dú)放在一張表

四、水平分表

針對(duì)數(shù)據(jù)量巨大的單張表(比如訂單表),按照某種規(guī)則(RANGE、HASH取模等),切分到多張表里面去。但是這些表還是在同一個(gè)庫(kù)中,所以庫(kù)級(jí)別的數(shù)據(jù)庫(kù)操作還是有IO瓶頸,不建議采用

將單張表的數(shù)據(jù)切分到多個(gè)服務(wù)器上去,每個(gè)服務(wù)器具有一部分庫(kù)與表,只是表中數(shù)據(jù)集合不同。水平分庫(kù)分表能夠有效的緩解單機(jī)和單庫(kù)的性能瓶頸和壓力,突破IO、連接數(shù)、硬件資源等的瓶頸

分庫(kù)分表可以和主從復(fù)制同時(shí)進(jìn)行,但不基于主從復(fù)制;讀寫分離才基于主從復(fù)制

1. 配置水平分表

server.xml



  123456
  USERDB

schema.xml





  
  
    
select user() select user()

d7b7cdec-8b76-11ee-939d-92fbcf53809c.jpg

user表示一個(gè)普通的表,直接放在數(shù)據(jù)節(jié)點(diǎn)dn1上,放在一臺(tái)機(jī)器上,這張表不用進(jìn)行拆分

student表的primaryKey是id,根據(jù)id拆分,放在dn1和dn2上,最終這個(gè)表要分在兩臺(tái)機(jī)器上,在物理上分開(kāi)了,但是在邏輯上還是一個(gè),往哪張表里增加,在2臺(tái)機(jī)器上查詢?nèi)缓笕绾魏喜⑦@些操作都是由mycat完成的

拆分的規(guī)則是取模(mod - long),每次插入用id模上存在的機(jī)器數(shù)(2)

此外還需要在rule.xml中配置以下拆分算法

找到算法mod-long,因?yàn)槲覀儗⑦壿嫳韘tudent分開(kāi)映射到兩臺(tái)主機(jī)上,所以修改數(shù)據(jù)節(jié)點(diǎn)的數(shù)量為2

d7c959cc-8b76-11ee-939d-92fbcf53809c.jpg

2. 測(cè)試水平分表

Linux主機(jī)

d7d92852-8b76-11ee-939d-92fbcf53809c.jpg

Windows主機(jī)

d7ed7e2e-8b76-11ee-939d-92fbcf53809c.jpg

登錄到mycat的8066端口

d80afac6-8b76-11ee-939d-92fbcf53809c.jpg

使用MyCat給user表插入兩條數(shù)據(jù)

d818fff4-8b76-11ee-939d-92fbcf53809c.jpg

由于schema.xml配置文件中,邏輯表user只在Linux主機(jī)的mytest1庫(kù)中存在,mycat操作的邏輯表user會(huì)影響Linux主機(jī)上的物理表,而不會(huì)影響Windows主機(jī)上的表。我們分別查看一下Linux和Windows主機(jī)的user表:

d82fc40a-8b76-11ee-939d-92fbcf53809c.jpg

d83f9de4-8b76-11ee-939d-92fbcf53809c.jpg

我們?cè)偻ㄟ^(guò)MyCat給student表插入兩條數(shù)據(jù)

d848736a-8b76-11ee-939d-92fbcf53809c.jpg

我們知道schema.xml配置文件中,邏輯表student對(duì)應(yīng)兩臺(tái)主機(jī)上的兩個(gè)庫(kù)mytest1、mytest2中的兩張表,所以對(duì)邏輯表插入的兩條數(shù)據(jù),會(huì)實(shí)際影響到兩張物理表(用id%機(jī)器數(shù),決定插入到哪張物理表)。我們分別查看一下Linux和Windows主機(jī)的student表:

d85938b2-8b76-11ee-939d-92fbcf53809c.jpg

再通過(guò)MyCat插入id=3和id=4的數(shù)據(jù),應(yīng)該插入不同主機(jī)上的不同物理表

d87106e0-8b76-11ee-939d-92fbcf53809c.jpg

d88a09ce-8b76-11ee-939d-92fbcf53809c.jpg

這就相當(dāng)于把student表進(jìn)行水平拆分了

通過(guò)MyCat查詢的時(shí)候只需要正常輸入就行,我們配置的是表拆分后放在這2個(gè)數(shù)據(jù)節(jié)點(diǎn)上,MyCat會(huì)根據(jù)配置在兩個(gè)庫(kù)上查詢并進(jìn)行數(shù)據(jù)合并

d8a37742-8b76-11ee-939d-92fbcf53809c.jpg






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11213

    瀏覽量

    208736
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    798

    瀏覽量

    26403

原文標(biāo)題:MySQL 分庫(kù)分表實(shí)踐

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)庫(kù)分區(qū)、分庫(kù)

    今天先說(shuō)說(shuō)數(shù)據(jù)庫(kù)的數(shù)據(jù)分區(qū),分庫(kù)以及的內(nèi)容吧! 數(shù)據(jù)庫(kù)分區(qū)、分庫(kù) 數(shù)據(jù)庫(kù)分區(qū)、
    的頭像 發(fā)表于 09-30 11:24 ?2605次閱讀

    談分布式數(shù)據(jù)庫(kù)中間件之分庫(kù)   

      分庫(kù),顧名思義就是把原本存儲(chǔ)于一個(gè)庫(kù)的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)庫(kù)上,把原本存儲(chǔ)于一個(gè)的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)上。那么關(guān)于
    發(fā)表于 08-02 20:19

    關(guān)于MySQL分區(qū)和的詳細(xì)介紹

    MySQL分區(qū)和
    發(fā)表于 07-10 07:40

    分庫(kù)是什么?怎么實(shí)現(xiàn)?

    數(shù)據(jù)庫(kù)分庫(kù)、讀寫分離的原理實(shí)現(xiàn),使用場(chǎng)景
    發(fā)表于 10-25 17:24

    利用Mycat實(shí)現(xiàn)MySQL讀寫分離、分庫(kù)最佳實(shí)踐

    利用Mycat實(shí)現(xiàn)MySQL讀寫分離、分庫(kù)最佳實(shí)踐
    發(fā)表于 09-08 10:20 ?14次下載
    利用Mycat實(shí)現(xiàn)<b class='flag-5'>MySQL</b>讀寫分離、<b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>最佳<b class='flag-5'>實(shí)踐</b>

    結(jié)合實(shí)踐對(duì)水平分庫(kù)做一個(gè)系統(tǒng)地剖析

    及實(shí)施落地,這里結(jié)合項(xiàng)目實(shí)踐,對(duì)水平分庫(kù)做一個(gè)系統(tǒng)地剖析,希望為大家水平分庫(kù)(包括去IOE)改造提供思路,主要內(nèi)容包括: 水平分庫(kù)說(shuō)明分庫(kù)
    發(fā)表于 10-11 17:46 ?0次下載
    結(jié)合<b class='flag-5'>實(shí)踐</b>對(duì)水平<b class='flag-5'>分庫(kù)</b>做一個(gè)系統(tǒng)地剖析

    數(shù)據(jù)庫(kù)分庫(kù)基礎(chǔ)和實(shí)踐

    決上述問(wèn)題?如果僅僅通過(guò)增加一個(gè)主實(shí)例來(lái)分擔(dān)寫請(qǐng)求,寫操作如何在兩個(gè)主實(shí)例之間同步來(lái)保證數(shù)據(jù)一致性,如何避免雙寫,問(wèn)題會(huì)變的更加復(fù)雜。這時(shí)就需要用到分庫(kù)(sharding),對(duì)寫操作進(jìn)行切分
    發(fā)表于 09-05 16:40 ?243次閱讀

    你們知道為什么分庫(kù)

    ? 這些問(wèn)題你都搞清楚了嗎?相信看完這篇文章會(huì)有答案。 為什么分庫(kù)? 首先回答一下為什么
    的頭像 發(fā)表于 08-16 10:37 ?1502次閱讀

    優(yōu)化MySQL數(shù)據(jù)庫(kù)中樸實(shí)無(wú)華的和花里胡哨的分庫(kù)

    4、水平分庫(kù) 總結(jié) 首先我們要知道分庫(kù)、都是干啥的,本文主角還是我們的MySQL為第一視角。首先從字面意思來(lái)看:
    的頭像 發(fā)表于 08-26 16:33 ?1223次閱讀

    你是否知道分庫(kù)需要哪些要素?

    分庫(kù)會(huì)重新影響數(shù)據(jù)的分布,無(wú)論是全量還是增量,都會(huì)涉及到數(shù)據(jù)遷移,所以Databus是必要的。
    的頭像 發(fā)表于 10-12 10:39 ?741次閱讀

    什么是分庫(kù)?為什么分庫(kù)?什么情況下會(huì)用分庫(kù)呢?

    分庫(kù)是由分庫(kù)這兩個(gè)獨(dú)立概念組成的,只不過(guò)通常分庫(kù)
    的頭像 發(fā)表于 11-30 09:37 ?7174次閱讀

    分庫(kù)的21條法則速來(lái)碼?。ㄉ希?/a>

    還是不著急實(shí)戰(zhàn),咱們先介紹下在分庫(kù)架構(gòu)實(shí)施過(guò)程中,會(huì)接觸到的一些通用概念,了解這些概念能夠幫助理解市面上其他的分庫(kù)表工具,盡管它們的實(shí)
    的頭像 發(fā)表于 05-26 17:33 ?532次閱讀
    <b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>的21條法則速來(lái)碼?。ㄉ希? />    </a>
</div>                            <div   id=

    分庫(kù)的21條法則速來(lái)碼?。ㄏ拢?/a>

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

    分庫(kù)后復(fù)雜查詢的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬構(gòu)建技術(shù)實(shí)踐

    1 問(wèn)題域 業(yè)務(wù)發(fā)展的初期,我們的數(shù)據(jù)庫(kù)架構(gòu)往往是單庫(kù)單,外加讀寫分離來(lái)快速的支撐業(yè)務(wù),隨著用戶量和訂單量的增加,數(shù)據(jù)庫(kù)的計(jì)算和存儲(chǔ)往往會(huì)成為我們系統(tǒng)的瓶頸,業(yè)界的實(shí)踐多數(shù)采用分而治之的思想:分庫(kù)
    的頭像 發(fā)表于 06-25 18:30 ?807次閱讀
    <b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>后復(fù)雜查詢的應(yīng)對(duì)之道:基于DTS實(shí)時(shí)性ES寬<b class='flag-5'>表</b>構(gòu)建技術(shù)<b class='flag-5'>實(shí)踐</b>

    軟件系統(tǒng)數(shù)據(jù)庫(kù)的分庫(kù)設(shè)計(jì)

    軟件系統(tǒng)數(shù)據(jù)庫(kù)的分庫(kù)設(shè)計(jì) 系統(tǒng)讀寫分離、分庫(kù)技術(shù)實(shí)現(xiàn)采用MyCat中間件,MyCat 是
    的頭像 發(fā)表于 08-22 11:39 ?276次閱讀
    軟件系統(tǒng)數(shù)據(jù)庫(kù)的<b class='flag-5'>分庫(kù)</b><b class='flag-5'>分</b><b class='flag-5'>表</b>設(shè)計(jì)