自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL讀多寫少設(shè)計(jì)方案 - 分庫(kù)分表還能這么做?

數(shù)據(jù)庫(kù) MySQL
通過(guò)主從復(fù)制的技術(shù)把數(shù)據(jù)復(fù)制多份,讀操作只讀取從數(shù)據(jù)庫(kù)中的數(shù)據(jù),這樣就增強(qiáng)了抵抗大量并發(fā)讀請(qǐng)求的能力,提升了數(shù)據(jù)庫(kù)的查詢性能。

[[414668]]

本文轉(zhuǎn)載自微信公眾號(hào)「JerryCodes」,作者KyleJerry。轉(zhuǎn)載本文請(qǐng)聯(lián)系JerryCodes公眾號(hào)。

通過(guò)主從復(fù)制的技術(shù)把數(shù)據(jù)復(fù)制多份,讀操作只讀取從數(shù)據(jù)庫(kù)中的數(shù)據(jù),這樣就增強(qiáng)了抵抗大量并發(fā)讀請(qǐng)求的能力,提升了數(shù)據(jù)庫(kù)的查詢性能。這時(shí),你的系統(tǒng)架構(gòu)如下:

  • 系統(tǒng)架構(gòu)圖
  • 案例背景

如何確定分庫(kù)還是分表?

何時(shí)分表

何時(shí)分庫(kù)

垂直拆分

Range(范圍分片)

  • 如何解決數(shù)據(jù)查詢問(wèn)題?
  • 總結(jié)

案例背景

假設(shè)在這樣的背景下,面試官出了一道考題:

公司現(xiàn)有業(yè)務(wù)不斷發(fā)展,流量劇增,交易數(shù)量突破了千萬(wàn)訂單,但是訂單數(shù)據(jù)還是單表存儲(chǔ),主從分離后,雖然減少了緩解讀請(qǐng)求的壓力,但隨著寫入壓力增加,數(shù)據(jù)庫(kù)的查詢和寫入性能都在下降,這時(shí)你要怎么設(shè)計(jì)架構(gòu)?

這個(gè)問(wèn)題可以歸納為:數(shù)據(jù)庫(kù)寫入請(qǐng)求量過(guò)大,導(dǎo)致系統(tǒng)出現(xiàn)性能與可用性問(wèn)題。

要想解決該問(wèn)題,你可以對(duì)存儲(chǔ)數(shù)據(jù)做分片,常見的方式就是對(duì)數(shù)據(jù)庫(kù)做“分庫(kù)分表”,在實(shí)現(xiàn)上有三種策略:垂直拆分、水平拆分、垂直水平拆分。

這么回答真的可以嗎?

雖然分庫(kù)分表技術(shù)方案很常見,但是在面試中回答好并不簡(jiǎn)單。因?yàn)槊嬖嚬俨粫?huì)單純浮于表面問(wèn)你“分庫(kù)分表的思路”,而是會(huì)站在業(yè)務(wù)場(chǎng)景中,當(dāng)數(shù)據(jù)出現(xiàn)寫多讀少時(shí),考察你做分庫(kù)分表的整體設(shè)計(jì)方案和技術(shù)實(shí)現(xiàn)的落地思路。一般會(huì)涉及這樣幾個(gè)問(wèn)題:

什么場(chǎng)景該分庫(kù)?什么場(chǎng)景該分表?

復(fù)雜的業(yè)務(wù)如何選擇分片策略?

如何解決分片后的數(shù)據(jù)查詢問(wèn)題?

如何確定分庫(kù)還是分表?

針對(duì)“如何確定分庫(kù)還是分表?”的問(wèn)題,你要結(jié)合具體的場(chǎng)景。

何時(shí)分表

當(dāng)數(shù)據(jù)量過(guò)大造成事務(wù)執(zhí)行緩慢時(shí),就要考慮分表,因?yàn)闇p少每次查詢數(shù)據(jù)總量是解決數(shù)據(jù)查詢緩慢的主要原因。你可能會(huì)問(wèn):“查詢可以通過(guò)主從分離或緩存來(lái)解決,為什么還要分表?”但這里的查詢是指事務(wù)中的查詢和更新操作。

何時(shí)分庫(kù)

為了應(yīng)對(duì)高并發(fā),一個(gè)數(shù)據(jù)庫(kù)實(shí)例撐不住,即單庫(kù)的性能無(wú)法滿足高并發(fā)的要求,就把并發(fā)請(qǐng)求分散到多個(gè)實(shí)例中去(這種應(yīng)對(duì)高并發(fā)的思路我之前也說(shuō)過(guò))。

總的來(lái)說(shuō),分庫(kù)分表使用的場(chǎng)景不一樣:分表是因?yàn)閿?shù)據(jù)量比較大,導(dǎo)致事務(wù)執(zhí)行緩慢;分庫(kù)是因?yàn)閱螏?kù)的性能無(wú)法滿足要求。

如何選擇分片策略?在明確分庫(kù)分表的場(chǎng)景后,面試官一般會(huì)追問(wèn)“怎么進(jìn)行分片?”換句話說(shuō)就是按照什么分片策略對(duì)數(shù)據(jù)庫(kù)進(jìn)行分片?

垂直拆分

垂直拆分是根據(jù)數(shù)據(jù)的業(yè)務(wù)相關(guān)性進(jìn)行拆分。比如一個(gè)數(shù)據(jù)庫(kù)里面既存在商品數(shù)據(jù),又存在訂單數(shù)據(jù),那么垂直拆分可以把商品數(shù)據(jù)放到商品庫(kù),把訂單數(shù)據(jù)放到訂單庫(kù)。一般情況,垂直拆庫(kù)常伴隨著系統(tǒng)架構(gòu)上的調(diào)整。

垂直拆分

比如在對(duì)做系統(tǒng)“微服務(wù)”改造時(shí),將原本一個(gè)單體系統(tǒng)拆分成多個(gè)子系統(tǒng),每個(gè)系統(tǒng)提供單獨(dú)的服務(wù),那么隨著應(yīng)用層面的拆分帶來(lái)的也有數(shù)據(jù)層面的拆分,將一個(gè)主庫(kù)的數(shù)據(jù)表,拆分到多個(gè)獨(dú)立的子庫(kù)中去。

對(duì)數(shù)據(jù)庫(kù)進(jìn)行垂直拆分最常規(guī),優(yōu)缺點(diǎn)也很明顯。

垂直拆分可以把不同的業(yè)務(wù)數(shù)據(jù)進(jìn)行隔離,讓系統(tǒng)和數(shù)據(jù)更為“純粹”,更有助于架構(gòu)上的擴(kuò)展。但它依然不能解決某一個(gè)業(yè)務(wù)的數(shù)據(jù)大量膨脹的問(wèn)題,一旦系統(tǒng)中的某一個(gè)業(yè)務(wù)庫(kù)的數(shù)據(jù)量劇增,比如商品系統(tǒng)接入了一個(gè)大客戶的供應(yīng)鏈,對(duì)于商品數(shù)據(jù)的存儲(chǔ)需求量暴增,在這個(gè)時(shí)候,就要把數(shù)據(jù)拆分到多個(gè)數(shù)據(jù)庫(kù)和數(shù)據(jù)表中,也就是對(duì)數(shù)據(jù)做水平拆分。

水平拆分

垂直拆分隨架構(gòu)改造而拆分,關(guān)注點(diǎn)在于業(yè)務(wù)領(lǐng)域,而水平拆分指的是把單一庫(kù)表數(shù)據(jù)按照規(guī)則拆分到多個(gè)數(shù)據(jù)庫(kù)和多個(gè)數(shù)據(jù)表中,比如把單表 1 億的數(shù)據(jù)按 Hash 取模拆分到 10 個(gè)相同結(jié)構(gòu)的表中,每個(gè)表 1 千萬(wàn)的數(shù)據(jù)。并且拆分出來(lái)的表,可以分別存放到不同的物理數(shù)據(jù)庫(kù)中,關(guān)注點(diǎn)在于數(shù)據(jù)擴(kuò)展。

Range(范圍分片)

是按照某一個(gè)字段的區(qū)間來(lái)拆分,最好理解的就是按照時(shí)間字段分片,比如可以把一個(gè)月的數(shù)據(jù)放入一張表中,這樣在查詢時(shí)就可以根據(jù)時(shí)間先定位數(shù)據(jù)存儲(chǔ)在哪個(gè)表里面,再按照查詢條件來(lái)查詢。

但是按時(shí)間字段進(jìn)行范圍分片的場(chǎng)景并不多,因?yàn)闀?huì)導(dǎo)致數(shù)據(jù)分布不均,畢竟不是每個(gè)月的銷量都是平均的。所以常見的 Range 分片是按照字段類型,比如按照商品的所屬品類進(jìn)行分片。這樣與 Hash 分片不同的是,Range 分片就可以加入對(duì)于業(yè)務(wù)的預(yù)估。

Range 分片

但是同樣的,由于不同“商品品類”的業(yè)務(wù)熱點(diǎn)不同,對(duì)于商品數(shù)據(jù)存儲(chǔ)也會(huì)存在熱點(diǎn)數(shù)據(jù)問(wèn)題,這個(gè)時(shí)候處理的手段有兩個(gè)。

1、垂直擴(kuò)展

由于 Range 分片是按照業(yè)務(wù)特性進(jìn)行的分片策略,所以可以對(duì)熱點(diǎn)數(shù)據(jù)做垂直擴(kuò)展,即提升單機(jī)處理能力。在業(yè)務(wù)發(fā)展突飛猛進(jìn)的初期,建議使用“增強(qiáng)單機(jī)硬件性能”的方式提升系統(tǒng)處理能力,因?yàn)榇穗A段,公司的戰(zhàn)略往往是發(fā)展業(yè)務(wù)搶時(shí)間,“增強(qiáng)單機(jī)硬件性能”是最快的方法。

2、分片元數(shù)據(jù)

單機(jī)性能總是有極限的,互聯(lián)網(wǎng)分布式架構(gòu)設(shè)計(jì)高并發(fā)終極解決方案還是水平擴(kuò)展,所以結(jié)合業(yè)務(wù)的特性,就需要在 Range 的基礎(chǔ)上引入“分片元數(shù)據(jù)”的概念:分片的規(guī)則記錄在一張表里面,每次執(zhí)行查詢的時(shí)候,先去表里查一下要找的數(shù)據(jù)在哪個(gè)分片中。

這種方式的優(yōu)點(diǎn)是靈活性高,并且分片規(guī)則可以隨著業(yè)務(wù)發(fā)展隨意改動(dòng)。比如當(dāng)某個(gè)分片已經(jīng)是熱點(diǎn)了,那就可以把這個(gè)分片再拆成幾個(gè)分片,或者把這個(gè)分片的數(shù)據(jù)移到其他分片中去,然后修改一下分片元數(shù)據(jù)表,就可以在線完成數(shù)據(jù)的再分片了。

分片元數(shù)據(jù)

但你要注意,分片元數(shù)據(jù)本身需要做高可用。方案缺點(diǎn)是實(shí)現(xiàn)起來(lái)復(fù)雜,需要二次查詢,需要保證分片元數(shù)據(jù)服務(wù)的高可用。不過(guò)分片元數(shù)據(jù)表可以通過(guò)緩存進(jìn)行提速。

垂直水平拆分,是綜合垂直和水平拆分方式的一種混合方式,垂直拆分把不同類型的數(shù)據(jù)存儲(chǔ)到不同庫(kù)中,再結(jié)合水平拆分,使單表數(shù)據(jù)量保持在合理范圍內(nèi),提升性能。

垂直水平拆分

如何解決數(shù)據(jù)查詢問(wèn)題?

分庫(kù)分表引入的另外一個(gè)問(wèn)題就是數(shù)據(jù)查詢的問(wèn)題(比較常見),比如面試官會(huì)問(wèn)類似的問(wèn)題:

在未分庫(kù)分表之前,我們查詢數(shù)據(jù)總數(shù)時(shí),可以直接通過(guò) SQL 的 count() 命令,現(xiàn)在數(shù)據(jù)分片到多個(gè)庫(kù)表中,如何解決呢?

解題思路很多,你可以考慮其他的存儲(chǔ)方案,比如聚合查詢使用頻繁時(shí),可以將聚合查詢的數(shù)據(jù)同步到 ES 中,或者將計(jì)數(shù)的數(shù)據(jù)單獨(dú)存儲(chǔ)在一張表里。如果是每日定時(shí)生成的統(tǒng)計(jì)類報(bào)表數(shù)據(jù),也可以將數(shù)據(jù)同步到 HDFS 中,然后用一些大數(shù)據(jù)技術(shù)來(lái)生成報(bào)表。

總結(jié)

總的來(lái)說(shuō),在面對(duì)數(shù)據(jù)庫(kù)容量瓶頸和寫請(qǐng)求并發(fā)量大時(shí),你可以選擇垂直分片和水平分片:

垂直分片一般隨著業(yè)務(wù)架構(gòu)拆分來(lái)進(jìn)行;

水平分片通常按照 Hash(哈希分片)取模和 Range(范圍分片)進(jìn)行,并且,通常的形態(tài)是垂直拆分伴隨著水平拆分,即先按照業(yè)務(wù)垂直拆分后,再根據(jù)數(shù)據(jù)量的多少?zèng)Q定水平分片。

Hash 分片在互聯(lián)網(wǎng)中應(yīng)用最為廣泛,簡(jiǎn)單易實(shí)現(xiàn),可以保證數(shù)據(jù)非常均勻地分布到多個(gè)分片,但其過(guò)濾掉了業(yè)務(wù)屬性,不能根據(jù)業(yè)務(wù)特性進(jìn)行調(diào)整。而 Range 分片卻能預(yù)估業(yè)務(wù),更高效地掃描數(shù)據(jù)記錄(Hash 分片由于數(shù)據(jù)被打散,掃描操作的 I/O 開銷更大)。

除了 Hash 分片和 Range 分片,更為靈活的方式是基于分片元數(shù)據(jù)。

不過(guò)你要注意,這幾種方式也會(huì)引入諸如聚合查詢的問(wèn)題,要想解決聚合查詢,你可以讓聚合查詢記錄存儲(chǔ)在其他存儲(chǔ)設(shè)備中(比如 ES、HDFS)。

 

責(zé)任編輯:武曉燕 來(lái)源: JerryCodes
相關(guān)推薦

2021-04-01 05:40:53

分庫(kù)分表數(shù)據(jù)庫(kù)MySQL

2021-04-21 13:48:22

MySQL優(yōu)化Redis

2023-07-27 13:44:19

業(yè)務(wù)用戶畫像

2023-06-27 11:57:24

用戶分析挖掘法ABtest

2020-03-05 13:55:50

MySQL分庫(kù)分表數(shù)據(jù)庫(kù)

2022-05-25 08:06:37

MySQL分庫(kù)分表

2024-10-17 16:55:08

2014-07-10 09:15:38

負(fù)載均衡安全網(wǎng)關(guān)

2015-08-05 10:50:01

Facebook緩存網(wǎng)頁(yè)

2020-11-18 09:39:02

MySQL數(shù)據(jù)庫(kù)SQL

2024-02-21 12:17:00

2013-11-27 12:40:21

鮑爾默微軟

2019-10-08 12:32:07

運(yùn)維架構(gòu)技術(shù)

2019-12-04 14:59:01

分布式緩存高可用

2023-08-26 20:08:15

分庫(kù)分表Spring

2024-02-02 16:25:01

模型訓(xùn)練

2020-07-30 17:59:34

分庫(kù)分表SQL數(shù)據(jù)庫(kù)

2013-03-29 09:54:05

創(chuàng)業(yè)創(chuàng)業(yè)者

2024-02-21 23:03:56

代碼系統(tǒng)

2018-09-21 15:50:58

數(shù)據(jù)庫(kù)MySQL分庫(kù)分表
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)