雲資料庫memcached之熱點key問題解決方案

2021-07-11 07:20:58 字數 2252 閱讀 8291

使用者使用雲資料庫memcached就是為了提公升業務效能,難免會觸發「熱點key問題」。但雲資料庫memcached做為公有雲服務,在發現有熱點的情況下,如果繼續放任該熱點無限激增,就會帶來整個系統雪崩似宕機。所以當前的做法會對每個使用者在每台伺服器上分配一定的qps或頻寬,當使用者在某台伺服器上的請求超過該使用者的配額,我們就會對使用者進行流控,服務端返回temporary_failure。該限制會影響使用者正常請求,持續時間分鐘級。

使用者觸發熱點問題是業務需要,是理所當然;雲資料庫memcached對熱點key進行流控是保障系統穩定性,也在情理之中。但有沒有一種既能提供使用者熱點key訪問的需求,又能保護雲資料庫memcached伺服器的方法,正是本文所要闡述的。

解決熱點問題有很多辦法,比如使用者如果提前知道某些key可能成為熱點,那麼客戶端可以提前拆分熱點key;也可以搭建乙個備用集群,寫的時候雙寫,然後隨機雙讀。這些方案的實現前提和難度,可想而知。下面給出的是對應用透明,且動態發現熱點的解決方案。

本方案解決的是使用者讀熱點問題,不解決寫熱點問題。

首先,雲資料庫memcached簡單架構圖如下:

我們的proxy是無狀態層,上面做了些訪問控制功能,使用者客戶端到proxy是隨機的,不受固定演算法(如hash)控制。而proxy到dataserver的鏈路是根據key決定的,當使用者訪問熱點key時,所有proxy上關於該key的請求都會落到同一臺dataserver。

所以解決熱點問題,其核心思路是:每台dataserver對所有key進行取樣、定位,實時計算出當前熱點key,將其反饋給proxy層,由proxy快取備份。即負載壓力由dataserver轉向proxy。理由是:proxy可以無狀態擴容,而dataserver不可以。

每台伺服器有個hotkey邏輯,讓每個到達伺服器的目標請求(可配置不同型別請求)經歷三個流水階段:

a. 取樣階段(根據配置設定取樣次數sample_max)

本階段輸出:是否有熱點現象,如果有熱點,輸出熱點的桶號供下階段使用。

b. 定位階段(根據配置設定取樣次數reap_max)

本階段輸出:熱點key(如果滿足閾值)。 並新增到服務端的lru鍊錶。

c. 反饋階段

對到達伺服器的目標請求,取出key,然後查詢lru鍊錶判斷該key是否為熱點key。如果是熱點,就會在請求結束後,向proxy傳送乙個feedback包,通知proxy。

至此,伺服器hot-key邏輯結束。流程圖如下:

當proxy收到dataserver的熱點反饋之後,會將該key寫入到自己的lru-cache裡面,該cache的過期時間和容量大小都交由使用者通過控制台設定,預設分別是100ms和30。這樣,熱點的key就已經存在於與proxy中了,下次使用者請求就可以直接返回了。

下面討論都是使用者client已經觸發了熱點key問題,假設使用者client跟每個proxy都建立了鏈結,並且每個proxy上都有對熱點key的請求,那麼理論上每個proxy的lru-cache都有乙份資料。

我們保證單條連線上的一致性。

當使用者client和proxy1建立連線,使用者修改了乙個key(任何寫操作),proxy1上會在lru-cache中同步刪除該key,新key就會寫到dataserver上,然後在讀資料的時候,由於lru-cache不命中,就會從dataserver上拿到最新資料。

不同鏈結上只能提供弱一致性。

如果這個時候使用者從proxy2上讀熱點資料呢?理論上就會讀到老資料,該資料將於100ms之後從proxy-cache中過期淘汰掉,之後就會更新會最新資料,即不同連線間可能有100ms不一致。

怎樣看待弱一致性。

事實上,不開啟熱點key功能,在不同鏈結上也會存在弱一致。假設使用者client建立了兩條鏈結到雲資料庫memcached,在鏈結1上寫入key-value1,在鏈結1、2上分別讀該key。當鏈結1上使用者update了key-value2,這個請求需要一定的網路延遲才能寫入到服務端,如果這個時候鏈結2上同時發起對key的讀取操作,如果讀請求先到服務端,它將讀到的是value1的老值。

所以開啟熱點key功能,只是增加了不一致時間,且該功能為可選。控制權由使用者掌握。

由以上分析可以看到,開啟熱點key功能之後,只會對使用者的讀請求產生影響,該影響增加了不同鏈結上的弱一致性的時間。因此,該功能適合讀多寫少,且對強一致性要求不高的應用。

整個方案核心是負載壓力由dataserver轉移到proxy。好處如下:

1、因為dataserver擴容也解決不了熱點問題,而proxy可以無狀態擴容,對使用者來講就極大提公升了熱點key訪問的能力,不受單點制約。

2、縮短了服務端處理鏈路,對使用者平均rt也所降低。

3、免除服務端熱點流控的分鐘級別影響。

如何管理雲資料庫 Memcached

例項擴容 雲資料庫 memcached 的擴容包括儲存擴容 介面擴容和埠擴容。儲存擴容 雲資料庫 memcached 會自動為每個例項每日預留約20 的空間作為資料增長 buffer。例如,例項的使用空間為80gb,則會分配96gb作為例項的占用空間。如果例項的資料日增長量超過20 請 提交工單 進...

xtarbackup mysql資料庫熱備指令碼

xtrabackup命令屬於物理備份,還原速度快,mysql自身帶著mysqldump屬於邏輯備份,適用於備份小型資料庫,而且mysqldump備份得是二進位制檔案,還原較慢。xtarbackup安裝過程如下 yum install y wget perl perl devel perl time ...

雲資料庫之新增資料

資料庫常見操作之 插入資料。const db wx.cloud.database 獲取引用之後,我們可以將它指向具體的表集合!這個時候用到了collection方法 const db wx.cloud.database collection 集合名稱 資料庫測試環境的更改必須和自己雲開發設定中的環境...