注:本文轉(zhuǎn)自我的個人博客 Aerospike(3) - Evict機制缎浇。
在實時的場景中淘衙,我們往往會對Aerospike/Redis等設置evict機制,來防止流量暴增帶來的存儲系統(tǒng)崩潰缨叫。
原理
原理如上圖所示祝峻,在Aerospike中,有TTL的數(shù)據(jù)根據(jù)TTL的大小被等分在這個橫軸上堵漱,每個bucket的大小由最大的TTL和設置的evict-hist-buckets來決定综慎。其中:
bucket_width = max_ttl / evict-hist-buckets
evict-hist-buckets可以基于namespace去設置,并且可以動態(tài)修改勤庐,無需啟動集群示惊。我們會設置high-water-memory-pct或者high-water-disk-pct來決定開始evict數(shù)據(jù)的時機好港,當滿足條件后,剩下就是等nsup線程啟動米罚,從柱狀圖中的第一個bucket開始驅(qū)逐钧汹。
限制
當然,實際情況不會永遠這么簡單录择。Evict機制本身就是獲取與丟棄之間的博弈的產(chǎn)物拔莱,所以也許根本就找不到一個跟實際業(yè)務情況完全匹配的現(xiàn)成方案。Aerospike的evict機制并不完美隘竭,有時候存儲超過了你所設置的HWM塘秦,但是并沒有數(shù)據(jù)被驅(qū)逐。Aerospike3.8之后的evict機制中有兩個特點:
- evict-hist-buckets可以動態(tài)配置动看,也就是用戶可以自定義柱狀圖的粒度和evict數(shù)據(jù)的粒度尊剔。
- Evict的單位是bucket,不能將bucket中的部分數(shù)據(jù)彈出菱皆。
下面引入evict機制中的另一個參數(shù): evict-tenths-pct须误。
這個參數(shù)決定了每次evict的數(shù)量。舉個極端例子仇轻,假設柱狀圖中的元素不夠均勻京痢,全部被分配到了第1個bucket上,那么不可能將第1個bucket的數(shù)據(jù)全部彈出吧篷店?所以這就是evict-tenths-pct的作用祭椰。類似于這種情況,可以動態(tài)調(diào)整evict-hist-buckets船庇,降低柱狀圖中的粒度,使得第1個bucket中的數(shù)量少于evict-tenths-pct所限制的數(shù)量侣监,從而達到evict的目的鸭轮。不過同時注意,bucket的對象也有一定的內(nèi)存占用,具體可以在下面鏈接中查看。
所以說要尔,這種Evict的機制也帶來了一些風險鲁豪,雖然比Redis的evict策略控制的更加精細化,但是在一些極端場景中秃流,很容易出現(xiàn)需要手工調(diào)整參數(shù),或者根本就無法evict的情況(幾天前因為業(yè)務流量上漲剛手工調(diào)整過)。
調(diào)優(yōu)
Aerospike的evict機制主要依賴于上述兩個參數(shù)逮京,如果線上出現(xiàn)故障,可以根據(jù)日志來調(diào)整自己的策略束莫。在此截取部分官方的Log來加以闡釋:
Apr 07 2016 13:42:17 GMT: WARNING (nsup): (thr_nsup.c:1068)
{test} no records below eviction void-time 200346037 - insufficient histogram resolution?
void-time是由evict-tenths-pct決定的threshold bucket的時間戳懒棉,這個時間戳是從2010年1月1日算起草描,可以理解為是Aerospike自己的時間戳〔哐希可以看出此時的threshold bucket是第1個bucket穗慕,和之前的解決方案類似,調(diào)整evict-hist-buckets即可妻导。
Jan 30 2017 02:36:21 GMT: WARNING (nsup): (thr_nsup.c:1043) {test} no records below eviction void-time 222541923 - threshold bucket 361, width 259 sec, count 686375 > target 530312 (0.5 pct)
此時threshold bucket是361逛绵,每個bucket時間寬度為259秒,但此時在第一個Bucket中的元素為686375倔韭,超過了evict-tenths-pct設置的0.5pct的數(shù)量术浪,所以無法evict。
參考資料
- https://discuss.aerospike.com/t/records-ttl-and-evictions-for-aerospike-server-version-prior-to-3-8/737
- https://discuss.aerospike.com/t/eviction-mechanisms-in-aerospike/2854