redis叢集 應該注意的問題
redis cluster注意的問題 :
-
‘cluster-require-full-coverage’引數的設定。該引數是redis配置檔案中cluster模式的一個引數,從字面上基本就能看出它的作用:需要全部覆蓋!
具體點是redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。
redis預設是‘yes’,即需要全覆蓋!建議設定成‘no’。 -
阻塞命令產生failover。由於一些阻塞命令(flushall, del key1 key2 …)會造成redis在‘cluster-node-timeout’時間內無法響應其他節點的ping請求,
從而導致其他節點都把該redis標記出了pfail狀態,進而產生failover。redis作者計劃使用lazy redis解決。 -
連線建立。當redis cluster的節點數多了以後,client對每個節點建立一個tcp連線需要花比較多的時間。如果是長連線,使用者只需忍受一次連線建立的過程,
如果是短連線,那麼頻繁建立連線將會極大的降低效率。但即便是短連線,只要每次請求只涉及到一個key,有些客戶端可能只需要與一個節點建立連線。 -
Jedis。Jedis是redis最流行的Java客戶端,支援redis cluster。
‘MaxRedirectionsException’異常,出現該異常說明剛剛執行的那條命令經過多次重試,沒有執行成功,需要使用者再次執行。
在cluster擴容或者slot遷移的時候比較容易出現。建議捕獲該異常並採取相應重試工作。
Pipeline,Jedis目前不支援cluster模式的pipeline,建議採用多併發代替pipeline。 -
Multi-key。Redis cluster對多key操作有限,要求命令中所有的key都屬於一個slot,才可以被執行。客戶端可以對multi-key命令進行拆分,再發給redis。
另外一個侷限是,在slot遷移過程中,multi-key命令特別容易報錯(CROSSSLOT Keys in request don’t hash to the same slot)。建議不用multi-key命令。 -
擴容速度慢。redis官方提供了redis cluster管理指令碼redis-trib.rb。使用該指令碼進行擴容cluster的時候,是序列的遷移slot中的每個key,這樣導致了
擴容的速度非常慢,百G的資料要數小時。擴容時間越長,越容易出現異常。