數(shù)據(jù)庫(kù)架構(gòu)演變及分庫(kù)分表-創(chuàng)新互聯(lián)

當(dāng)生產(chǎn)環(huán)境中業(yè)務(wù)量激增,數(shù)據(jù)庫(kù)數(shù)據(jù)量也會(huì)極具增加。當(dāng)數(shù)據(jù)庫(kù)的數(shù)據(jù)量達(dá)到一定程度時(shí)(數(shù)據(jù)庫(kù)瓶頸),數(shù)據(jù)庫(kù)宿主機(jī)負(fù)載超高,會(huì)嚴(yán)重影響業(yè)務(wù),嚴(yán)重時(shí)會(huì)導(dǎo)致數(shù)據(jù)庫(kù)宕機(jī)。
為了避免這種極端情況的發(fā)生,我們應(yīng)當(dāng)在發(fā)生前做好預(yù)案,用于解決數(shù)據(jù)庫(kù)數(shù)據(jù)量過載的問題。
以下是我個(gè)人工作中使用的解決方案:
1)數(shù)據(jù)庫(kù)主從或多主多從方案
2)數(shù)據(jù)庫(kù)冷熱數(shù)據(jù)拆分
3)數(shù)據(jù)庫(kù)分庫(kù)分表操作
4)在數(shù)據(jù)庫(kù)前端增加緩存redis或memcached

成都創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元浪卡子做網(wǎng)站,已為上家服務(wù),為浪卡子各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

一開始時(shí),公司部分業(yè)務(wù)的架構(gòu)如下(全都是單節(jié)點(diǎn)情況)
數(shù)據(jù)庫(kù)架構(gòu)演變及分庫(kù)分表
經(jīng)過自己強(qiáng)調(diào)該架構(gòu)嚴(yán)重的缺點(diǎn):節(jié)點(diǎn)單一,服務(wù)中斷情況嚴(yán)重等嚴(yán)峻問題,后演變?yōu)槿缦潞?jiǎn)圖的架構(gòu):
數(shù)據(jù)庫(kù)架構(gòu)演變及分庫(kù)分表
上述架構(gòu)中,我們更新代碼實(shí)現(xiàn)了不中斷服務(wù),同時(shí)解決了部分單一節(jié)點(diǎn)問題。后來一段時(shí)間業(yè)務(wù)做推廣優(yōu)惠活動(dòng),業(yè)務(wù)量激增,數(shù)據(jù)庫(kù)數(shù)據(jù)量成指數(shù)性增長(zhǎng)。數(shù)據(jù)庫(kù)負(fù)載一直居高不下。當(dāng)前的架構(gòu)已經(jīng)無法滿足業(yè)務(wù)需求,后又提出對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的冷熱數(shù)據(jù)拆分和數(shù)據(jù)讀寫分離(可以考慮使用中間件Mycat、Atlas、MaxScale,也可以考慮讓開發(fā)寫路由規(guī)則,有些框架自帶路由規(guī)則),這里我們使用Mycat,如下圖架構(gòu),這里只顯示后端:
數(shù)據(jù)庫(kù)架構(gòu)演變及分庫(kù)分表
隨著時(shí)間的推移,單庫(kù)單表已經(jīng)達(dá)到業(yè)務(wù)忍受的極限,這時(shí)候已經(jīng)在硬件還是在mysql參數(shù)調(diào)優(yōu)上都已經(jīng)無法滿足業(yè)務(wù)。這時(shí)候提出了數(shù)據(jù)庫(kù)的分庫(kù)分表。這里主要講解數(shù)據(jù)庫(kù)的分庫(kù)分表
分庫(kù)分表一共有兩種方案:
1) 垂直拆分
2) 水平拆分
1、 垂直拆分
所謂垂直拆分,就是將單一數(shù)據(jù)庫(kù)拆分成多個(gè)數(shù)據(jù)庫(kù),可以考慮的方案:
1) 根據(jù)業(yè)務(wù)邏輯進(jìn)行拆分
2) 根據(jù)冷熱數(shù)據(jù)進(jìn)行拆分
這里先講解根據(jù)業(yè)務(wù)邏輯拆分:
這里以商品--訂單--用戶為例,當(dāng)多種類商品存放于一個(gè)數(shù)據(jù)庫(kù)和一張表中時(shí),隨著時(shí)間推移,數(shù)據(jù)量增大,單庫(kù)單表查詢能力下降,可以根據(jù)商品種類來進(jìn)行拆分,比如公司的產(chǎn)品:高中、初中、小學(xué),由單個(gè)表拆分成三個(gè)獨(dú)立表。如果還大,繼續(xù)拆分,高中拆分成高一、高二、高三。初中拆分成初一、初二、初三。小學(xué)拆分成小一、小二......小六。(所有的分庫(kù)分表都源于生活中的邏輯)。
我們生產(chǎn)環(huán)境中針對(duì)數(shù)據(jù)進(jìn)行了拆分,冷數(shù)據(jù)(采用MyISAM引擎),熱數(shù)據(jù)(采用Innodb引擎),同時(shí)將MyISAM引擎的數(shù)據(jù)庫(kù)的宿主機(jī)多采用redis或memcache進(jìn)行緩存,Innodb引擎的數(shù)據(jù)庫(kù)的宿主機(jī)針對(duì)業(yè)務(wù)情況分配計(jì)算型和內(nèi)存型物理機(jī),還是混合型,同時(shí)可以考慮使用redis做部分存儲(chǔ),用于緩解數(shù)據(jù)庫(kù)壓力。
垂直拆分優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1) 由單庫(kù)單表拆分成多庫(kù)多表,降低了數(shù)據(jù)庫(kù)增刪改查壓力
2) 對(duì)冷熱數(shù)據(jù)拆分,降低了成本并合理利用硬件
3) 對(duì)于垂直拆分的數(shù)據(jù)庫(kù),在設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí)就應(yīng)當(dāng)考慮好數(shù)據(jù)庫(kù)架構(gòu)的延展性,(否則會(huì)對(duì)后期的擴(kuò)展造成很大的阻力)
4) 按照業(yè)務(wù)分庫(kù)后,業(yè)務(wù)邏輯更加清晰,更方便運(yùn)維管理。
缺點(diǎn):
1) 對(duì)于聯(lián)表查詢,帶來了不便,可以通過調(diào)用接口的方式來觸發(fā)聯(lián)表查詢的操作,對(duì)整個(gè)系統(tǒng)而言,復(fù)雜度提高了。
2) 對(duì)于有些數(shù)據(jù)庫(kù),存在單庫(kù)性能瓶頸影響整個(gè)業(yè)務(wù)情況。
3) 同時(shí)對(duì)于事務(wù)而言,復(fù)雜度提高了。
2、 水平拆分
所謂水平拆分,簡(jiǎn)單來說就是將一張表中的數(shù)據(jù)按照行拆分成多份存儲(chǔ)到不同的數(shù)據(jù)庫(kù)的表中。比如user表有9000條數(shù)據(jù),將user表拆成user1、user2、user3三張表存放于不同的數(shù)據(jù)庫(kù)中,user1存儲(chǔ)前3000條數(shù)據(jù),中間3000條數(shù)據(jù)存儲(chǔ)到user2表中,最后3000條數(shù)據(jù)存放到user3表中。
水平拆分的分片維度(有很多算法來決定采用哪種水平拆分的方案)
1) 按照哈希切片,對(duì)某個(gè)字段進(jìn)行求哈希值,然后除以分片的數(shù)量,最后取模,取模相同的數(shù)據(jù)為一個(gè)分片,這就是哈希分片。
這種分片方式?jīng)]有時(shí)效性。對(duì)數(shù)據(jù)分散比較均勻,缺點(diǎn)是如果需要查詢則需要對(duì)數(shù)據(jù)進(jìn)行聚合處理。
2) 按照時(shí)間序列算法切片,有的業(yè)務(wù)會(huì)有明顯的季度波動(dòng),可以使用時(shí)間算法。這種算法就是數(shù)據(jù)分配不均。
生產(chǎn)環(huán)境中,我們部分業(yè)務(wù)采用的是哈希算法和時(shí)間序列算法的混合式
說到水平拆分,不得不提的是水平拆分的路由規(guī)則
設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候,就要考慮到數(shù)據(jù)庫(kù)中各種表的路由規(guī)則,同時(shí)還需要考慮數(shù)據(jù)表將來按照什么樣的路由規(guī)則來進(jìn)行分庫(kù)分表。
比如,某個(gè)新用戶注冊(cè),這個(gè)用戶是如何分配到哪個(gè)庫(kù)哪個(gè)表中?一般在注冊(cè)的時(shí)候都會(huì)系統(tǒng)自動(dòng)分配一個(gè)uid。根據(jù)這個(gè)uid可以按照某種算法來進(jìn)行分配。比如uid%4,(這里將一張表分成4個(gè)表),如果是1 則分到第一張表中,以此類推。

水平拆分的優(yōu)缺點(diǎn):
1) 單庫(kù)單表的數(shù)據(jù)量大就那么大,有數(shù)據(jù)量的限制,我們可以根據(jù)業(yè)務(wù)情況來分配,剛好達(dá)到大(這個(gè)量很難把握),既能提高該表的操作性能又節(jié)省了資源
2) 因?yàn)閷?duì)表的結(jié)構(gòu)改變非常少,對(duì)于開發(fā)而言更改代碼量非常少,只需要增加路由規(guī)則。
3) 對(duì)整體系統(tǒng)的穩(wěn)定性和負(fù)載都有大大的提高
缺點(diǎn):
1) jion操作非常困難,尤其是跨庫(kù)的聯(lián)表查詢
2) 有的拆分規(guī)則很難抽象出來
3) 分片的事務(wù)一致性比較難解決
4) 還有數(shù)據(jù)庫(kù)的擴(kuò)容和維護(hù)比較困難
針對(duì)上述垂直拆分和水平拆分,都有以下缺點(diǎn):
1) jion操作困難
2) 事務(wù)一致性困難
3) 多個(gè)數(shù)據(jù)源的管理變復(fù)雜。
如何解決事務(wù)一致性問題呢?(這個(gè)重要性排在第一位)
1) 采用本地事務(wù)的一致性(能用則用)
2) 分布式事務(wù)處理
分布式事務(wù)處理的解決方案:
1) 兩階段提交方案(最嚴(yán)格的方案,很少使用,因?yàn)槭亲枞麉f(xié)議造成性能問題):分為準(zhǔn)備(鎖定資源)和提交(消費(fèi)資源)兩個(gè)階段。這種方式依賴資源管理器。
2) 大努力保證模式(最常用,極端情況需要實(shí)時(shí)補(bǔ)償,將已提交的數(shù)據(jù)進(jìn)行回滾)不依賴資源管理器
一共有兩種操作:從消息隊(duì)列中消費(fèi)消息和更新數(shù)據(jù)庫(kù)操作
開始消息事務(wù)?開始數(shù)據(jù)庫(kù)事務(wù)?接收消息?更新數(shù)據(jù)庫(kù)?提交數(shù)據(jù)庫(kù)事務(wù)?提交消息事務(wù)
當(dāng)更新數(shù)據(jù)庫(kù)時(shí),突然中斷,會(huì)進(jìn)行回滾,恢復(fù)到初始狀態(tài),特殊情況,如果提交數(shù)據(jù)庫(kù)事務(wù)成功,但是提交消息事務(wù)失敗,就會(huì)造成消息再次消費(fèi)的情況。這個(gè)可以通過消息冪等處理(有時(shí)候很多消息無法滿足冪等性比如update操作,可以考慮增加一個(gè)消息應(yīng)用狀態(tài)表來記錄消息消耗情況和數(shù)據(jù)庫(kù)事務(wù)情況),出現(xiàn)上述極端情況,需要實(shí)時(shí)補(bǔ)償。這種補(bǔ)償機(jī)制類似于TCC模式Try-Confirm-Cancel(如果try都成功了,它會(huì)重復(fù)confirm或重復(fù)cancel,直到都成功),TCC要求Confirm/Cancel都必須是冪等操作。

3) 事務(wù)補(bǔ)償機(jī)制
前面兩種方案,都不是最好的,事務(wù)補(bǔ)償機(jī)既能保證性能又能盡大可能保證事務(wù)的一致性。說白了就是突破事務(wù)一失敗就回滾的思想,指定在一定的時(shí)間內(nèi)不斷提交直到成功為止,如果超時(shí)則回滾。
分庫(kù)分表過程中帶來的問題
1、 擴(kuò)容和數(shù)據(jù)的遷移
數(shù)據(jù)已經(jīng)分片,同時(shí)數(shù)據(jù)量已經(jīng)快達(dá)到閾值,需要對(duì)集群進(jìn)行擴(kuò)容,都采用成倍擴(kuò)容。
以下是5個(gè)擴(kuò)容步驟:
1) 增加新的路由規(guī)則,對(duì)新的數(shù)據(jù)庫(kù)采用新路由規(guī)則進(jìn)行寫,同時(shí)對(duì)舊數(shù)據(jù)庫(kù)采用舊路由規(guī)則寫。(雙寫,兩套路由規(guī)則)
2) 將雙寫前的舊數(shù)據(jù)按照新規(guī)則寫入到新數(shù)據(jù)庫(kù)中(需要做大量的數(shù)據(jù)清洗工作)。
3) 將按照舊的分片規(guī)則的查詢更改為按照新的分片規(guī)則查詢。
4) 將雙寫的路由規(guī)則代碼下線,只按照新規(guī)則寫數(shù)據(jù)
5) 刪除按照舊分片規(guī)則寫入的歷史數(shù)據(jù)。
2、 分庫(kù)分表帶來的聯(lián)表查詢問題
舉例:
賣家和買家,賣家需要查看該商品賣出情況,買家需要查看自己的交易情況,可以考慮使用兩個(gè)表,一個(gè)以買家維度,記錄買家商品交易情況,一個(gè)以賣家維度,記錄賣家該商品交易情況。也就是查詢交易和交易的數(shù)據(jù)是分別存儲(chǔ)的,并從不同的系統(tǒng)提供接口。
方法二:通過搜索引擎解決(大數(shù)據(jù)了)

參考文檔:
https://blog.csdn.net/it_man/article/details/21593187

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱:數(shù)據(jù)庫(kù)架構(gòu)演變及分庫(kù)分表-創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/article10/cddjdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、ChatGPT品牌網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、動(dòng)態(tài)網(wǎng)站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)