雲資料庫Redis熱點Key的發現與解決之道

摘要:在2018資料庫直播大講堂峰會-Redis專場中阿里雲資料庫組的梁盼從熱點Key產生的原因,造成的問題開始講解。通過在熱點Key問題解決上以往的方法與阿里的方法的對比,形象的表述了阿里雲在解決熱點Key問題上所提方案的可行性與優越性。

直播視頻:yq.aliyun.com/video/pla

PDF下載:click.aliyun.com/m/4251

以下是精彩內容整理:

熱點問題概述

從基於用戶消費的數據遠遠大於生產的數據的角度來講,我們平常使用的知乎等軟體時,大多數人平常僅僅只是瀏覽,並不會去提問問題、發表的文章,偶爾會發表自己的文章或者看法,這就是一個典型的讀多寫少的情景,當然此類情景不太容易導致熱點的產生。

在日常工作生活中一些突發的的事件,諸如:「雙11」期間某些熱門商品的降價促銷,當這其中的某一件商品被數萬次點擊、購買時,會形成一個較大的需求量,這種情況下就會產生一個單一的Key,這樣就會引起一個熱點;同理,當被大量刊發、瀏覽的熱點新聞,熱點評論等也會產生熱點;另外,在服務端讀數據進行訪問時,往往會對數據進行分片切分,此類過程中會在某一主機Server上對相應的Key進行訪問,當訪問超過主機Server極限時,就會導致熱點Key問題的產生。

在了解熱點問題產生後,為何要重視熱點Key?

就像前文講到的一樣,當某一熱點的Key在某一主機上超過該主機網卡上線時,由於流量的過度集中,會導致伺服器中其它服務無法進行。

此外,熱點Key的緩存過多,超過目前的緩存容量時,就會導致緩存分片服務被打垮現象的產生。當緩存服務崩潰後,此時再有請求產生,會緩存到後台DB上,由於其本身性能較弱,在面臨大請求時很容易發生請求穿透現象,會進一步導致「雪崩」現象,嚴重影響設備的性能。

常見問題解決方案

在了解到熱點Key產生的原因及引起的問題後,那麼究竟該如何解決此類問題?通常來說在上述問題的解決上,目前主要還是集中在客戶端和Server端進行相應的改造。

1.服務端緩存方案

首先Client會將請求發送至Server上,而Server又是一個多線程的服務,本地就具有一個小的緩存空間。當Server本身就擁堵時,Server不會將請求進一步發送給DB而是直接返回,只有當Server本身暢通時才會將Client請求發送至DB,並且將該數據重新寫入到Cache中。

此時就完成了緩存的訪問跟重建,但是該方案也存在問題。

1)緩存失效,多線程構建緩存問題。

2)緩存丟失,緩存構建問題。

3)臟讀問題。

2.使用Memcache、Redis方案

該類方案通過在客戶端單獨部署緩存的方式來解決熱點Key問題。使用過程中Client首先訪問服務層,再對同一主機上的緩存層進行訪問。該種解決方案具有就近訪問、速度快等優點,但是同時也具有:

1)內存資源浪費。

2)臟讀問題。

在上述及較為傳統的解決方案上在本地緩存上都面臨相似的問題,諸如需要獲知熱點、緩存容量有限、不一致時間增長和熱點Key遺漏等。那麼究竟該如何進一步的解決上述方案呢?

阿里雲資料庫解熱點之道

1.讀寫分離方案

架構中個節點的作用:

1)SLB層做負載均衡

2)Proxy層做讀寫分離自動路由

3)Master負責寫

4)ReadOnly節點負責讀請求

5)Slave節點和Master節點做高可用

實際過程中Client將請求傳到SLB,SLB又將其分發至多個Proxy內,通過Proxy對請求的識別,將其進行分類發送。例如,將同為Write的請求發送到Master模塊內,而將Read的請求發送至ReadOnly模塊。而模塊中的節點具有可以進一步擴充的優點,可以有效解決熱點數據多的問題。讀寫分離同時具有可以靈活擴容讀熱點能力、可以存儲大量熱點Key和對客戶友好等優點。

2.熱點數據解決方案

與上述方案不同,該方案通過主動發現熱點並對其進行存儲來解決熱點Key的問題。首先Client也會訪問SLB,並且通過SLB將各種請求分發至Proxy中,Proxy會按照基於路由的方式將請求轉發至後端的Redis中。

在熱點key的解決上是採用在服務端增加緩存的方式進行。具體來說就是在Proxy上增加本地緩存,本地緩存採用LRU演算法來緩存熱點數據,後端db節點增加熱點數據計算模塊來返回熱點數據。

Proxy架構的主要優點有:

1)Proxy緩存熱點,讀能力可水平擴展

2)DB自動計算熱點Key

3)對客戶端完全透明,不需要做任何兼容

DB計算熱點時,主要運用的方法和優勢有:

1)基於統計閥值的熱點統計。

2) 基於統計周期的熱點統計。

3) 基於版本號實現的無需重置初值統計方法。

DB計算同時具有對性能影響極其微小、內存佔用極其微小等優點。

3.熱點數據的讀取

在熱點Key的處理上主要分為寫入跟讀取兩種形式,在數據寫入過程當SLB收到數據K1並將其通過某一個Proxy寫入一個Redis,完成數據的寫入。假若經過後端熱點模塊計算髮現K1成為熱點key後,Proxy會將該熱點進行緩存,當下次客戶端再進行訪問K1時,可以不經Redis,最後由於proxy是可以水平擴充的,因此可以任意增強熱點數據的訪問能力。

4.熱點數據發現

對於db上熱點數據的發現,首先會在一個周期內對Key進行請求統計,在達到請求量級後會對熱點Key進行熱點定位,並將所有的熱點Key放入一個小的LRU鏈表內,在通過Proxy請求進行訪問時,若Redis發現待訪點是一個熱點,就會進入一個反饋階段,同時對該數據進行標記。

通過上述對比分析可以看出,阿里雲在解決熱點Key上較傳統方法相比都有較大的提高,無論是基於讀寫分離方案還是熱點數據解決方案,在實際處理環境中都可以做靈活的水平能力擴充、都對客戶端透明、都有一定的數據不一致性。此外讀寫分離模式可以存儲更大量的熱點數據,而基於Proxy的模式有成本上的優勢。

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎


推薦閱讀:

世界五大類刀劍性能評比,武士刀進不了前三?
Oppo R11s 性能上有哪些驚艷之處?
加速你的MATLAB開發(4): 自動生成C/C++代碼
直播預告 | 極限挑戰:在最短時間內定位性能瓶頸!
2017年,阿里巴巴開源那些事

TAG:Redis | 性能 | 模塊 |