緩存Tair高性能使用規範

5401760-56b5f5335d39a19f.png
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。


歡迎關注 高廣超的簡書博客 與 收藏文章 !
歡迎關注 頭條號:互聯網技術棧

個人介紹:

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

本文首發在 高廣超的簡書博客 轉載請註明!

發佈了141 篇原創文章 · 獲贊 17 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章