天天看點

緩存Tair高性能使用規範不要短時間大量重複讀寫相同的keyValue大小多大合适逾時時間設定多少合适逾時是否需要重試批量請求使用注意複雜資料結構中元素不宜過多作為緩存使用時,不要在擷取資料失敗時直接重寫緩存資料Prefix接口相關

緩存Tair高性能使用規範不要短時間大量重複讀寫相同的keyValue大小多大合适逾時時間設定多少合适逾時是否需要重試批量請求使用注意複雜資料結構中元素不宜過多作為緩存使用時,不要在擷取資料失敗時直接重寫緩存資料Prefix接口相關

2x.png

不要短時間大量重複讀寫相同的key

server端的原理是網絡收包後,放入到工作隊列(讀寫隊列分離,但都隻有一個),再由工作線程從隊列中取出進行處理。這裡一個問題是,為保證資料的正确性,會對同一個key的讀寫加鎖,而如果存在大量讀寫同一個key的情況,則勢必會阻塞其他線程(鎖不慢,鎖競争才慢),導緻拖慢整個服務端的處理速度。

不要使用時間戳作為key的一部分,容易導緻一段時間内所有流量都通路一台服務端機器,導緻服務端壓力過大而出現大量逾時

Value大小多大合适

value建議不超過50KB,value越大,服務端能承受qps越低,請求耗時越大,當value大小超過1MB時,緩存失效,讀寫性能将嚴重受影響

逾時時間設定多少合适

普通kv接口:單key請求逾時時間建議設定100ms以上,批量請求逾時時間建議設定200ms以上

特殊資料結構接口:逾時時間建議設定500ms左右

逾時是否需要重試

寫逾時:除非服務端壓力過大丢棄請求,否則所有寫請求在服務端都會執行成功,隻是沒有傳回結果給用戶端,除非業務邏輯依賴資料的強一緻性,否則不需要重試

讀逾時:如果是批量接口,建議設定傳回比例(參數為BatchReturnPercent),如果需要重試,建議sleep 100ms左右後重試,重試不要超過3次

批量請求使用注意

批量請求key個數

批量請求key個數建議不要超過100個

batchGet請求如何提升可用性

可以設定批量請求傳回比例(參數為BatchReturnPercent)

複雜資料結構中元素不宜過多

tair目前引擎對于複雜資料結構,如list,set,map,prefix接口,支援的不夠友好。

這些複雜資料結構的元素不要存儲超過2000個,後續服務端會限制元素個數,個數超過後禁止寫入。

作為緩存使用時,不要在擷取資料失敗時直接重寫緩存資料

擷取資料失敗的原因很多,但是隻有在确定資料不存在的情況下,才需要重寫緩存資料。如果沒有正确區分失敗的情況就直接重寫緩存資料,則可能會加劇失敗的可能,同時會對叢集造成更大的壓力。例如在逾時的情況下重寫緩存資料,逾時次數可能會更多,且有雪崩的風險。

隻有出現下面其中一個傳回碼時,才需要重寫緩存資料:

  • NOTEXIST (-3998) - 資料不存在
  • EXPIRED (-3988) - 資料已過期

Prefix接口相關

不要在同一個pkey下存放過多skey

一個pkey下skey個數建議小于1000,在同一個pkey下存放過多的skey可能會導緻性能問題。同一個pkey下的所有skey資料在實體上都存放在同一個機器上,當skey數量過多時,到同一台機器的請求也會增多。如果存在一個pkey是熱點key, 則熱點流量會集中到一台機器上,且無法通過擴容均衡壓力。一種極端的錯誤使用情況是,整個資料空間隻有一個pkey, 所有資料都作為skey,這個情況下整個叢集的全部流量都集中在叢集中的一台機器上,造成整個叢集的性能降低為隻相當于單機的性能。為了避免這些情況,不要在pkey下存放過多skey, 并且在整個資料空間中需要存在足夠數量的pkey,以将流量均衡到叢集中的各台機器上。

batchPrefixGetMulti接口使用注意

該接口沒有部分傳回機制和重試機制,容易受網絡問題、熱點問題等影響而出現少量逾時,減少每個包中的pkey個數可以緩解

優先使用prefixGet,而不是getRange

prefixGet比getRange擁有更好的性能。prefixGet會優先從記憶體緩存中擷取資料,而getRange隻能通過磁盤掃描來擷取資料。

注意傳入getRange接口的參數

傳入getRange接口的參數,對于getRange接口的性能,以及對叢集造成的壓力都有很重要的影響,是以傳入正确的參數非常重要。

  1. 盡量設定skey的範圍,即skey_start和skey_end
  2. offset不宜較大,可以通過設定skey_start,而避免設定offset為較大的數值

可能需要多次調用getRange來擷取全部資料

getRange接口最多傳回1M的資料。如果pkey下面skey的value較大,全部資料大小超過了1M,getRange隻會傳回1M的資料,同時傳回碼為HAS_MORE_DATA。

getRange接口有三個較重要的傳回碼:

  • OK (0) - 表示參數中要求的所有資料都已正确擷取
  • HAS_MORE_DATA (150) - 隻擷取了參數中要求的部分資料,需要再次調用來擷取剩餘資料。需要注意的是,再次調用時需要調用者調整調用參數。
  • NOTEXIST (-3998) - 參數中要求的資料不存在

是以,當getRange接口傳回HAS_MORE_DATA時,則需要調用者根據已經擷取到的資料,調整調用參數,繼續調用getRange來擷取剩餘的資料,直到getRange傳回OK或者NOT_EXIST。

歡迎關注

高廣超的簡書部落格

與 收藏文章 !

頭條号:網際網路技術棧

個人介紹:

高廣超:多年一線網際網路研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴充的網際網路架構。

本文首發在

轉載請注明!