久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

微博高并發(fā)場(chǎng)景下的分布式緩存架構(gòu)

 快讀書(shū)館 2017-07-30

1.Memcached內(nèi)存分配原理介紹

掌握Memcached的安裝、使用命令,,其實(shí)對(duì)大部分的同學(xué)來(lái)說(shuō)已經(jīng)足以開(kāi)展相關(guān)開(kāi)發(fā)工作了,。但當(dāng)碰到一些線上問(wèn)題的時(shí)候,單純的會(huì)用Memcached是無(wú)法快速,、合理的分析問(wèn)題所在的,。所以接下來(lái)我們將介紹Memcached的內(nèi)存分配管理原理。

Memcached默認(rèn)情況下采用了名為Slab Allocator的機(jī)制分配,、管理內(nèi)存,。Slab Allocator的基本原理是按照預(yù)先規(guī)定的大小,,將分配的內(nèi)存分割成特定長(zhǎng)度的塊,, 以完全解決內(nèi)存碎片問(wèn)題。

在介紹memcached的內(nèi)存分配原理之前,,需要跟大家說(shuō)明以下幾個(gè)關(guān)鍵的名詞的概念:

item

一個(gè)待存儲(chǔ)的元素,,按字節(jié)計(jì)算大小,可以理解為一個(gè)物品

Chunk

用于緩存item的內(nèi)存空間,??梢岳斫鉃橐粋€(gè)儲(chǔ)物格

Slab Class

特定大小的chunk的組??梢岳斫鉃閮?chǔ)物格按大小進(jìn)行分類,,如80B作為一類,96B作為一類….

Page

分配給Slab class的內(nèi)存空間,,默認(rèn)是1MB,。分配給Slab之后根據(jù)slab class的大小切分成chunk,。可以理解為一個(gè)page是一個(gè)固定大小的柜子,,上面可以按slab class進(jìn)行分割,,一個(gè)柜子只能按一個(gè)slab class進(jìn)行分割。柜子上的格子數(shù)為柜子大小/ 儲(chǔ)物格的大小

介紹完上述的幾個(gè)基本概念后,,我們可以來(lái)看看mc在分配內(nèi)存的時(shí)候是怎么處理的,。 

圖1 memcached 初始化示意圖

如圖1為一個(gè)memcached示例在啟動(dòng)的時(shí)候,可以指定的一些參數(shù),,初始大小為slab class的起始大小,,增長(zhǎng)因子為下一個(gè)slab class是初始因子的倍數(shù)。如圖中所示,,初始大小為80B,,增長(zhǎng)因子為1.5。則mc在啟動(dòng)后,,會(huì)按下圖生成slab class表,。

 
圖2 slab分布圖

完成初始后,當(dāng)某一個(gè)請(qǐng)求到來(lái)的時(shí)候——如圖中所示由一個(gè)123B大小的元素希望找到存儲(chǔ)空間,,memcached會(huì)通過(guò)slab class表找到最合適的slab class:比元素大的最少的那個(gè),,在圖中場(chǎng)景下為180B,即使所需的空間只要123B,。

此時(shí)Memcached示例并沒(méi)有分配任何的空間給180B的slab進(jìn)行管理,。所以為了能讓請(qǐng)求的元素能存儲(chǔ)上,Memcached實(shí)例會(huì)分配1 個(gè)page給180這個(gè)slab(在默認(rèn)情況下為1MB實(shí)際內(nèi)存),。

 
圖 3 page分配圖

180B slab class在獲取到1MB的空間后,,會(huì)按照自己的大小對(duì)page進(jìn)行分隔,也即1MB/180=5828個(gè)具體的存儲(chǔ)空間(chunk),。此時(shí),,123B的請(qǐng)求就可以被存儲(chǔ)起來(lái)了。

隨著時(shí)間的慢慢推移,,memcached的內(nèi)存空間會(huì)逐步被分配完,,如下圖4所示:

圖 4內(nèi)存slab分配圖

我們可以看到,memcached劃分給每個(gè)slab的page數(shù)是不均等的,,存在部分的slab是可能一個(gè)page都分配不到的,。

假設(shè)所有的內(nèi)存都分配完,同時(shí)每個(gè)slab內(nèi)部的chunk也都分配完了,。此時(shí)又來(lái)了一個(gè)新的元素123B,,那么就會(huì)觸發(fā)memcached的淘汰機(jī)制了。

memcached首先會(huì)查看180B的slab是否存在過(guò)期的元素,如果存在,,則先清理部分,,預(yù)留空位。如果180B這個(gè)slab的數(shù)據(jù)都比較熱(沒(méi)有過(guò)期),,則按LRU進(jìn)行淘汰,。需要注意的是,淘汰是在slab內(nèi)部進(jìn)行的,,也即在上面的場(chǎng)景中只有180Bslab內(nèi)部進(jìn)行淘汰剔除,,對(duì)于其他的slab,是沒(méi)有受到影響的,。memcached也不會(huì)回收比較空余的其他slab的page,。也即一個(gè)page被分配給某個(gè)slab后,他將一直被這個(gè)slab所占用,,永遠(yuǎn)無(wú)法被mc回收,,直到memcached重啟。

這個(gè)特性被稱為Memcached的鈣化問(wèn)題:Memcached在線上跑了一段時(shí)間后,,內(nèi)存按原始訪問(wèn)模式分配內(nèi)存,。當(dāng)訪問(wèn)模式變更后,原有的分配模式可能導(dǎo)致緩存頻繁出現(xiàn)數(shù)據(jù)剔除問(wèn)題,。最典型的場(chǎng)景即為內(nèi)存尚有空余,,但一直有數(shù)據(jù)被剔除,命中率一直上不去,。對(duì)于這種情況,,解決方法為重啟緩存。 
主從雙層結(jié)構(gòu)

高并發(fā)&高可用

2. 主從雙層結(jié)構(gòu)

通過(guò)數(shù)據(jù)分片,,將mc從單臺(tái)實(shí)例增加到一組緩存后,,我們可以解決單端口容量、訪問(wèn)量不足的問(wèn)題,,但是如果出現(xiàn)某一臺(tái)緩存掛了的情況,。請(qǐng)求依然會(huì)落到后端的DB上??梢酝ㄟ^(guò)一致性hash的方式,,來(lái)減少損失。

但基于一致性哈希策略的分布式實(shí)現(xiàn)在微博業(yè)務(wù)場(chǎng)景下也存在一些問(wèn)題:

(1)微博線上業(yè)務(wù)對(duì)緩存命中率要求高,。某臺(tái)緩存掛了,會(huì)導(dǎo)致緩存整體命中率下降(即使一致性hash會(huì)在一定時(shí)間后將數(shù)據(jù)重新種到另一個(gè)節(jié)點(diǎn)上),,對(duì)于命中率要求在99%以上的Feed流核心業(yè)務(wù)場(chǎng)景來(lái)說(shuō),,命中率的下降是難以接受的

(2)一致性hash存在請(qǐng)求漂移的情況,假設(shè)某一段時(shí)間服務(wù)因網(wǎng)絡(luò)因素訪問(wèn)某個(gè)服務(wù)節(jié)點(diǎn)失敗,則在這時(shí)候,,會(huì)將數(shù)據(jù)的更新,、獲取都遷移到下一個(gè)節(jié)點(diǎn)上。后續(xù)網(wǎng)絡(luò)恢復(fù)后,,應(yīng)用服務(wù)探測(cè)到服務(wù)節(jié)點(diǎn)可用,,則繼續(xù)從原服務(wù)節(jié)點(diǎn)中獲取數(shù)據(jù),這就導(dǎo)致了在故障期間所做的更新操作,,對(duì)于原服務(wù)節(jié)點(diǎn)不可見(jiàn)了

目前我們對(duì)于這種單點(diǎn)問(wèn)題主要是通過(guò)引入主從緩存結(jié)構(gòu)來(lái)解決的,。主從結(jié)構(gòu)示意圖如下圖5所示:

圖 5主從雙層結(jié)構(gòu)緩存

服務(wù)端在上行邏輯中,進(jìn)行雙寫操作——由應(yīng)用服務(wù)負(fù)責(zé)更新master,、slave數(shù)據(jù),。

下行獲取數(shù)據(jù),先獲取master數(shù)據(jù),,當(dāng)master返回空,,或者無(wú)法取到數(shù)據(jù)的時(shí)候,訪問(wèn)slave,。

在這種模式下,,為了避免兩份數(shù)據(jù)帶來(lái)的不一致問(wèn)題,需要以master數(shù)據(jù)為準(zhǔn),。即如果有更新數(shù)據(jù)操作,,需要從master中獲取數(shù)據(jù),再對(duì)master進(jìn)行cas更新,。更新成功后,,才更新slave。如果cas多次后都失敗,,則對(duì)master,、slave進(jìn)行delete操作,后續(xù)讓請(qǐng)求穿透回種即可,。

2橫向線性擴(kuò)展

在雙層結(jié)構(gòu)下,,我們可以很好的解決單點(diǎn)問(wèn)題,即某一個(gè)節(jié)點(diǎn)如果crash了,,請(qǐng)求可以被slave承接住,,請(qǐng)求不會(huì)直接落在DB上。

但這種架構(gòu)仍然存在一些問(wèn)題:

(1)帶寬問(wèn)題,。由于存在熱點(diǎn)訪問(wèn)的情況,,線上經(jīng)常出現(xiàn)單個(gè)服務(wù)節(jié)點(diǎn)的帶寬跑滿的情況。

(2)請(qǐng)求量問(wèn)題,。隨著業(yè)務(wù)的不斷發(fā)展,,并發(fā)請(qǐng)求數(shù)超過(guò)了單個(gè)節(jié)點(diǎn)的機(jī)器上限,。數(shù)據(jù)分片、雙層結(jié)構(gòu)都不能解決這種問(wèn)題,。

上面的兩個(gè)問(wèn)題,,其實(shí)總結(jié)起來(lái)是如何快速橫向擴(kuò)展系統(tǒng)的支撐能力。對(duì)于這個(gè)問(wèn)題,,我們的解決思路為增加數(shù)據(jù)的副本數(shù),。即讓數(shù)據(jù)副本存在于多個(gè)節(jié)點(diǎn)中,從而平攤原本落在一個(gè)節(jié)點(diǎn)的請(qǐng)求,。

從我們經(jīng)驗(yàn)來(lái)看,,對(duì)于線性擴(kuò)展,可以在原來(lái)的master上引入一層L1層緩存,。整體示意圖如6所示:

圖6采用L1的緩存架構(gòu)

上行操作需要對(duì)L1進(jìn)行多寫,。寫緩存的順序?yàn)閙aster-slave-L1(所有),寫失敗則進(jìn)行delete操作,,后續(xù)由穿透請(qǐng)求進(jìn)行回種,。

L1可以由多組緩存組成,每組緩存相互獨(dú)立,。應(yīng)用服務(wù)在獲取數(shù)據(jù)的時(shí)候,,先從L1中選取一組資源,然后再進(jìn)行hash選取特定節(jié)點(diǎn),。對(duì)于multiget的場(chǎng)景也是先選取一組緩存,,然后才對(duì)這組緩存進(jìn)行multiget操作。如果L1獲取不到數(shù)據(jù),,再依次獲取master,、slave數(shù)據(jù)。獲取成功,,則回種到L1中,。

在采用L1的模式中,數(shù)據(jù)也是以master中數(shù)據(jù)為主的,。即如果有更新數(shù)據(jù)的需要,,需要從master中獲取數(shù)據(jù)原本,再進(jìn)行cas更新,。如果cas更新成功,,才同時(shí)更新slave、L1資源,。如果對(duì)master的操作失敗,,則進(jìn)行delete all操作,讓后續(xù)請(qǐng)求穿透回種,。

當(dāng)線上流量,、請(qǐng)求量達(dá)到一個(gè)水位的時(shí)候,,我們會(huì)進(jìn)行L1的擴(kuò)容——增加一組,、或幾組L1緩存,,從而提升系統(tǒng)整體的承載能力。此時(shí)系統(tǒng)的整體響應(yīng)請(qǐng)求量是可以做到線性擴(kuò)展的,。

可以看到,,雙層結(jié)構(gòu)下,slave作為主的備份存在,。假設(shè)線上master緩存命中率為99%,,則落在slave上的請(qǐng)求只有1%,并且這1%的請(qǐng)求都是很偏,、很少人訪問(wèn)到的,。可以想象,,在這種情況下,,如果master真的出現(xiàn)問(wèn)題,請(qǐng)求全部落在slave上,,slave也是沒(méi)有任何數(shù)據(jù)可供訪問(wèn)的,。Slave作為防單點(diǎn)措施是失敗的。

引入L1后,,slave過(guò)冷并沒(méi)有被解決,,同時(shí),由于master被放置到L1之下,,也遇到了slave的問(wèn)題,,master的數(shù)據(jù)也存在過(guò)冷的風(fēng)險(xiǎn)。為了解決上面的問(wèn)題,,我們?cè)诰€上配置的時(shí)候,,會(huì)將整組slave做為L(zhǎng)1的一組資源進(jìn)行配置,讓slave以L1的身份承擔(dān)部分的熱請(qǐng)求,。同時(shí)為了解決master過(guò)冷的問(wèn)題,,我們也會(huì)讓應(yīng)用服務(wù)在選擇L1的時(shí)候有一定的概率落空,從而讓master作為L(zhǎng)1邏輯分組,,去承擔(dān)部分熱請(qǐng)求,。整體結(jié)構(gòu)圖如圖7所示:

圖7 slave、master同時(shí)作為L(zhǎng)1架構(gòu)

出處:http://blog.csdn.net/wongson/article/details/47418039

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多