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

你的系統(tǒng)有熱點(diǎn)緩存問(wèn)題嗎?如何為系統(tǒng)設(shè)計(jì)緩存架構(gòu)?

開(kāi)發(fā) 架構(gòu)
如果你的系統(tǒng)有熱點(diǎn)緩存問(wèn)題,那么就要實(shí)現(xiàn)類(lèi)似本文的復(fù)雜熱點(diǎn)緩存支撐架構(gòu)。但是如果沒(méi)有的話,那么也別過(guò)度設(shè)計(jì),其實(shí)你的系統(tǒng)可能根本不需要這么復(fù)雜的架構(gòu)。?

這篇文章,跟大家講講站在一個(gè)程序員的角度,自己的后臺(tái)架構(gòu)應(yīng)該如何抗住一天3個(gè)熱點(diǎn)涌入的巨大流量!

(1)為什么要用緩存集群

其實(shí)使用緩存集群的時(shí)候,最怕的就是熱key、大value這兩種情況,那啥叫熱key大value呢?

簡(jiǎn)單來(lái)說(shuō),熱key,就是你的緩存集群中的某個(gè)key瞬間被數(shù)萬(wàn)甚至十萬(wàn)的并發(fā)請(qǐng)求打爆。大value,就是你的某個(gè)key對(duì)應(yīng)的value可能有GB級(jí)的大小,導(dǎo)致查詢(xún)value的時(shí)候?qū)е戮W(wǎng)絡(luò)相關(guān)的故障問(wèn)題。

我們先來(lái)看看下面一幅圖,假設(shè)你手頭有個(gè)系統(tǒng),他本身是集群部署的,然后后面有一套緩存集群,這個(gè)集群不管你用redis cluster,還是memcached,或者是公司自研緩存集群,都可以。

那么,這套系統(tǒng)用緩存集群干什么呢?

很簡(jiǎn)單,在緩存里放一些平時(shí)不怎么變動(dòng)的數(shù)據(jù),然后用戶在查詢(xún)大量的平時(shí)不怎么變動(dòng)的數(shù)據(jù)的時(shí)候,不就可以直接從緩存里走了嗎?

緩存集群的并發(fā)能力是很強(qiáng)的,而且讀緩存的性能是很高的。舉個(gè)例子,假設(shè)你每秒有2萬(wàn)請(qǐng)求,但是其中90%都是讀請(qǐng)求,那么每秒1.8萬(wàn)請(qǐng)求都是在讀一些不太變化的數(shù)據(jù),而不是寫(xiě)數(shù)據(jù)。

那此時(shí)你把這些數(shù)據(jù)都放在數(shù)據(jù)庫(kù)里,然后每秒發(fā)送2萬(wàn)請(qǐng)求到數(shù)據(jù)庫(kù)上讀寫(xiě)數(shù)據(jù),你覺(jué)得合適嗎?

當(dāng)然不合適了,如果你要用數(shù)據(jù)庫(kù)承載每秒2萬(wàn)請(qǐng)求的話,那么不好意思,你很可能就得搞分庫(kù)分表 + 讀寫(xiě)分離。

比如你得分3個(gè)主庫(kù),承載每秒2000的寫(xiě)入請(qǐng)求,然后每個(gè)主庫(kù)掛3個(gè)從庫(kù),一共9個(gè)從庫(kù)承載每秒1.8萬(wàn)的讀請(qǐng)求。

這樣的話,你可能就需要一共是12臺(tái)高配置的數(shù)據(jù)庫(kù)服務(wù)器,這是很耗費(fèi)錢(qián)的,成本非常高,很不合適。

大家看看下面的圖,來(lái)體會(huì)下這種情況。

因此,我們完全可以把平時(shí)不太變化的數(shù)據(jù)放在緩存集群里,緩存集群可以采用2主2從,主節(jié)點(diǎn)用來(lái)寫(xiě)入緩存,從節(jié)點(diǎn)用來(lái)讀緩存。

以緩存集群的性能,2個(gè)從節(jié)點(diǎn)完全可以用來(lái)承載每秒1.8萬(wàn)的大量讀請(qǐng)求,然后3個(gè)數(shù)據(jù)庫(kù)主庫(kù)就是承載每秒2000的寫(xiě)請(qǐng)求和少量其他讀請(qǐng)求就OK了。

這樣一來(lái),你耗費(fèi)的機(jī)器瞬間變成了4臺(tái)緩存機(jī)器 + 3臺(tái)數(shù)據(jù)庫(kù)機(jī)器 = 7臺(tái)機(jī)器,是不是比之前的12臺(tái)機(jī)器減少了很大的資源開(kāi)銷(xiāo)?

沒(méi)錯(cuò),緩存其實(shí)在系統(tǒng)架構(gòu)里是非常重要的組成部分。很多時(shí)候,對(duì)于那些很少變化但是大量高并發(fā)讀的數(shù)據(jù),通過(guò)緩存集群來(lái)抗高并發(fā)讀,是非常合適的。

我們看看下面的圖,體會(huì)一下這個(gè)過(guò)程。

需要說(shuō)明的是,這里所有的機(jī)器數(shù)量、并發(fā)請(qǐng)求量都是一個(gè)示例,大家主要是體會(huì)一下這個(gè)意思就好

其目的主要是給一些不太熟悉緩存相關(guān)技術(shù)的同學(xué)一點(diǎn)背景性的闡述,讓這些同學(xué)能夠理解在系統(tǒng)里用緩存集群承載讀請(qǐng)求是什么意思。

(2)20萬(wàn)用戶同時(shí)訪問(wèn)一個(gè)熱點(diǎn)緩存

好了,背景已經(jīng)給大家解釋清楚,現(xiàn)在就可以給大家說(shuō)說(shuō)今天重點(diǎn)要討論的問(wèn)題:熱點(diǎn)緩存。

我們來(lái)做一個(gè)假設(shè),現(xiàn)在有10個(gè)緩存節(jié)點(diǎn)來(lái)抗大量的讀請(qǐng)求。正常情況下,讀請(qǐng)求應(yīng)該是均勻的落在10個(gè)緩存節(jié)點(diǎn)上的,對(duì)吧!

這10個(gè)緩存節(jié)點(diǎn),每秒承載1萬(wàn)請(qǐng)求是差不多的。

然后我們?cè)僮鲆粋€(gè)假設(shè),你一個(gè)節(jié)點(diǎn)承載2萬(wàn)請(qǐng)求是極限,所以一般你就限制一個(gè)節(jié)點(diǎn)正常承載1萬(wàn)請(qǐng)求就ok了,稍微留一點(diǎn)buffer出來(lái)。

好,所謂的熱點(diǎn)緩存問(wèn)題是什么意思呢?很簡(jiǎn)單,就是突然因?yàn)槟脑?,出現(xiàn)大量的用戶訪問(wèn)同一條緩存數(shù)據(jù)。

比如同一天爆發(fā)3條熱點(diǎn)新聞,這是不是會(huì)引發(fā)短時(shí)間內(nèi)每秒都數(shù)十萬(wàn)用戶去查看這幾條熱點(diǎn)新聞?

假設(shè)3條新聞就是3個(gè)緩存,對(duì)應(yīng)3個(gè)緩存key,這些key都存在于一臺(tái)緩存機(jī)器上。

然后某條新聞一公布,接著瞬間就可能幾十萬(wàn)請(qǐng)求奔向那一臺(tái)機(jī)器。

此時(shí)會(huì)如何?我們看看下面的圖,來(lái)體會(huì)一下這種絕望的感受。

很明顯了,我們剛才假設(shè)的是一個(gè)緩存Slave節(jié)點(diǎn)最多每秒就是2萬(wàn)的請(qǐng)求,當(dāng)然實(shí)際緩存單機(jī)承載5萬(wàn)~10萬(wàn)讀請(qǐng)求也是可能的,這里就是一個(gè)假設(shè)。

結(jié)果每秒突然奔過(guò)來(lái)20萬(wàn)請(qǐng)求到這臺(tái)機(jī)器上,會(huì)怎么樣?很簡(jiǎn)單,上面圖里那臺(tái)被20萬(wàn)請(qǐng)求指向的緩存機(jī)器會(huì)過(guò)度操勞而宕機(jī)的。

那么如果緩存集群開(kāi)始出現(xiàn)機(jī)器的宕機(jī),此時(shí)會(huì)如何?

此時(shí)讀請(qǐng)求發(fā)現(xiàn)讀不到數(shù)據(jù),會(huì)從數(shù)據(jù)庫(kù)里提取原始數(shù)據(jù),然后放入剩余的其他緩存機(jī)器里去。但是接踵而來(lái)的每秒20萬(wàn)請(qǐng)求,會(huì)再次壓垮其他的緩存機(jī)器。

以此類(lèi)推,最終導(dǎo)致緩存集群全盤(pán)崩潰,引發(fā)系統(tǒng)整體宕機(jī)。

咱們看看下面的圖,再感受一下這個(gè)恐怖的現(xiàn)場(chǎng)。

(3)基于流式計(jì)算技術(shù)的緩存熱點(diǎn)自動(dòng)發(fā)現(xiàn)

其實(shí)這里關(guān)鍵的一點(diǎn),就是對(duì)于這種熱點(diǎn)緩存,你的系統(tǒng)需要能夠在熱點(diǎn)緩存突然發(fā)生的時(shí)候,直接發(fā)現(xiàn)他,然后瞬間立馬實(shí)現(xiàn)毫秒級(jí)的自動(dòng)負(fù)載均衡。

那么我們就先來(lái)說(shuō)說(shuō),你如何自動(dòng)發(fā)現(xiàn)熱點(diǎn)緩存問(wèn)題?

首先你要知道,一般出現(xiàn)緩存熱點(diǎn)的時(shí)候,你的每秒并發(fā)肯定是很高的,可能每秒都幾十萬(wàn)甚至上百萬(wàn)的請(qǐng)求量過(guò)來(lái),這都是有可能的。

所以,此時(shí)完全可以基于大數(shù)據(jù)領(lǐng)域的流式計(jì)算技術(shù)來(lái)進(jìn)行實(shí)時(shí)數(shù)據(jù)訪問(wèn)次數(shù)的統(tǒng)計(jì),比如storm、spark streaming、flink。

一旦在實(shí)時(shí)數(shù)據(jù)訪問(wèn)次數(shù)統(tǒng)計(jì)的過(guò)程中,比如發(fā)現(xiàn)一秒之內(nèi),某條數(shù)據(jù)突然訪問(wèn)次數(shù)超過(guò)了1000,就直接立馬把這條數(shù)據(jù)判定為是熱點(diǎn)數(shù)據(jù),可以將這個(gè)發(fā)現(xiàn)出來(lái)的熱點(diǎn)數(shù)據(jù)寫(xiě)入比如zookeeper中。

當(dāng)然,你的系統(tǒng)如何判定熱點(diǎn)數(shù)據(jù),可以根據(jù)自己的業(yè)務(wù)還有經(jīng)驗(yàn)值來(lái)就可以了。

大家看看下面這張圖,看看整個(gè)流程是如何進(jìn)行的。

這里肯定有人會(huì)問(wèn),那你的流式計(jì)算系統(tǒng)在進(jìn)行數(shù)據(jù)訪問(wèn)次數(shù)統(tǒng)計(jì)的時(shí)候,會(huì)不會(huì)也存在說(shuō)單臺(tái)機(jī)器被請(qǐng)求每秒幾十萬(wàn)次的問(wèn)題呢?

答案是:否

因?yàn)榱魇接?jì)算技術(shù),尤其是storm這種系統(tǒng),他可以做到同一條數(shù)據(jù)的請(qǐng)求過(guò)來(lái),先分散在很多機(jī)器里進(jìn)行本地計(jì)算,最后再匯總局部計(jì)算結(jié)果到一臺(tái)機(jī)器進(jìn)行全局匯總。

所以幾十萬(wàn)請(qǐng)求可以先分散在比如100臺(tái)機(jī)器上,每臺(tái)機(jī)器統(tǒng)計(jì)了這條數(shù)據(jù)的幾千次請(qǐng)求。

然后100條局部計(jì)算好的結(jié)果匯總到一臺(tái)機(jī)器做全局計(jì)算即可,所以基于流式計(jì)算技術(shù)來(lái)進(jìn)行統(tǒng)計(jì)是不會(huì)有熱點(diǎn)問(wèn)題的。

(4)熱點(diǎn)緩存自動(dòng)加載為JVM本地緩存

我們自己的系統(tǒng)可以對(duì)zookeeper指定的熱點(diǎn)緩存對(duì)應(yīng)的znode進(jìn)行監(jiān)聽(tīng),如果有變化他立馬就可以感知到了。

此時(shí)系統(tǒng)層就可以立馬把相關(guān)的緩存數(shù)據(jù)從數(shù)據(jù)庫(kù)加載出來(lái),然后直接放在自己系統(tǒng)內(nèi)部的本地緩存里即可。

這個(gè)本地緩存,你用ehcache、hashmap,其實(shí)都可以,一切看自己的業(yè)務(wù)需求。我們這里主要說(shuō)的就是將緩存集群里的集中式緩存,直接變成每個(gè)系統(tǒng)自己本地實(shí)現(xiàn)緩存即可,每個(gè)系統(tǒng)本地是無(wú)法緩存過(guò)多數(shù)據(jù)的。

因?yàn)橐话氵@種普通系統(tǒng)單實(shí)例部署機(jī)器可能就一個(gè)4核8G的機(jī)器,留給本地緩存的空間是很少的,所以用來(lái)放這種熱點(diǎn)數(shù)據(jù)的本地緩存是最合適的,剛剛好。

假設(shè)你的系統(tǒng)層集群部署了100臺(tái)機(jī)器,那么好了,此時(shí)你100臺(tái)機(jī)器瞬間在本地都會(huì)有一份熱點(diǎn)緩存的副本。

然后接下來(lái)對(duì)熱點(diǎn)緩存的讀操作,直接系統(tǒng)本地緩存讀出來(lái)就給返回了,不用再走緩存集群了。

這樣的話,也不可能允許每秒20萬(wàn)的讀請(qǐng)求到達(dá)緩存機(jī)器的一臺(tái)機(jī)器上讀一個(gè)熱點(diǎn)緩存了,而是變成100臺(tái)機(jī)器每臺(tái)機(jī)器承載數(shù)千請(qǐng)求,那么那數(shù)千請(qǐng)求就直接從機(jī)器本地緩存返回?cái)?shù)據(jù)了,這是沒(méi)有問(wèn)題的。

我們?cè)賮?lái)畫(huà)一幅圖,一起來(lái)看看這個(gè)過(guò)程:

(5)限流熔斷保護(hù)

除此之外,在每個(gè)系統(tǒng)內(nèi)部,其實(shí)還應(yīng)該專(zhuān)門(mén)加一個(gè)對(duì)熱點(diǎn)數(shù)據(jù)訪問(wèn)的限流熔斷保護(hù)措施。

每個(gè)系統(tǒng)實(shí)例內(nèi)部,都可以加一個(gè)熔斷保護(hù)機(jī)制,假設(shè)緩存集群最多每秒承載4萬(wàn)讀請(qǐng)求,那么你一共有100個(gè)系統(tǒng)實(shí)例。

你自己就該限制好,每個(gè)系統(tǒng)實(shí)例每秒最多請(qǐng)求緩存集群讀操作不超過(guò)400次,一超過(guò)就可以熔斷掉,不讓請(qǐng)求緩存集群,直接返回一個(gè)空白信息,然后用戶稍后會(huì)自行再次重新刷新頁(yè)面之類(lèi)的。

通過(guò)系統(tǒng)層自己直接加限流熔斷保護(hù)措施,可以很好的保護(hù)后面的緩存集群、數(shù)據(jù)庫(kù)集群之類(lèi)的不要被打死。

再來(lái)一幅圖,一起來(lái)看看:

(6)本文總結(jié)

具體要不要在系統(tǒng)里實(shí)現(xiàn)這種復(fù)雜的緩存熱點(diǎn)優(yōu)化架構(gòu)呢?這個(gè)還要看你們自己的系統(tǒng)有沒(méi)有這種場(chǎng)景了。

如果你的系統(tǒng)有熱點(diǎn)緩存問(wèn)題,那么就要實(shí)現(xiàn)類(lèi)似本文的復(fù)雜熱點(diǎn)緩存支撐架構(gòu)。但是如果沒(méi)有的話,那么也別過(guò)度設(shè)計(jì),其實(shí)你的系統(tǒng)可能根本不需要這么復(fù)雜的架構(gòu)。

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

2019-12-11 10:07:02

緩存架構(gòu)數(shù)據(jù)庫(kù)

2023-07-09 15:20:00

緩存平衡性能

2017-12-27 12:01:39

2022-04-07 17:13:09

緩存算法服務(wù)端

2023-11-03 12:52:00

緩存系統(tǒng)設(shè)計(jì)

2023-01-01 17:00:09

2023-08-30 10:28:02

LRU鏈表區(qū)域

2023-08-31 13:36:00

系統(tǒng)預(yù)讀失效

2024-03-12 10:44:42

2015-02-02 10:03:50

2019-06-21 14:40:52

緩存系統(tǒng)性能操作系統(tǒng)

2017-12-12 14:51:15

分布式緩存設(shè)計(jì)

2018-11-15 12:12:31

Memcache緩存系統(tǒng)

2019-08-01 08:36:51

緩存系統(tǒng)并發(fā)

2021-06-02 06:49:18

Redis緩存設(shè)計(jì).

2021-04-18 15:01:56

緩存系統(tǒng)數(shù)據(jù)

2024-11-01 16:18:52

2023-05-05 06:13:51

分布式多級(jí)緩存系統(tǒng)

2024-08-12 10:53:00

2021-08-11 10:00:51

緩存MyBatis管理
點(diǎn)贊
收藏

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