準備新節點 =》 加入集羣 =》 遷移槽和數據
新節點:前端
加入集羣做用node
建議使用redis-trib.rb可以避免新節點加入其餘集羣,形成故障
步驟redis
redis-cli -p 7000 cluster meet 127.0.0.1 7006 redis-trib.rb reshard 127.0.0.1 7000
下線遷移槽
忘記節點:cluster forget downNodeId
關閉節點算法
redis-trib.rb reshard --from nodeId --to nodeId --slots 1366 127.0.0.1:7000
redis-trib.rb del-node 127.0.0.1:7000 nodeIdsql
moved重定向數據庫
槽命中:直接返回
槽命不中:moved異常
ask重定向後端
moved和ask:二者都是客戶端重定向,moved槽已經肯定遷移,ask槽還在遷移中
smart客戶端緩存
批量優化的方法:
串行mget,串行IO,並行IO,hash_tag服務器
故障發現:
經過ping/pong消息實現故障發現,不須要sentinel
主觀下線和客觀下線網絡
主觀下線:某個節點認爲另外一個節點不可用,偏見 客觀下線:當半數以上持有槽的主節點都標記某節點主觀下線
故障恢復:
資格檢查
準備選舉時間
選舉投票
替換主節點
cluster-require-full-coverage默認爲yes
大多業務沒法容忍,cluster-require-full-coverage建議設置爲no
帶寬消耗
三個方面:消息發送頻率;消息數據量;節點部署的機器規模
避免大集羣:避免多業務使用一個集羣,大業務能夠多集羣 cluster-node-timeout:帶寬和故障轉移速度的均衡 儘可能均勻分配到多機器上:保證高可用和帶寬
數據傾斜
redis-trib.rb info ip:port查看節點,槽,鍵值分佈
redis-trib.rb rebalance ip:port從新分配槽,節點,鍵值
請求傾斜
熱點key:重要的key或者bigkey
優化:
避免bigkey
熱鍵不要使用hash_tag
當一致性不高時,可用使用本地緩存 + MQ
集羣讀寫分離
只讀鏈接:集羣模式的從節點不接受任何讀寫請求
讀寫分離:更加複雜
數據遷移
官方遷移工具:redis-trib.rb import
只能從單機遷移到集羣
不支持在線遷移:source須要停寫
不支持斷點續傳
單線程遷移:影響速度
集羣和單機
集羣限制
key批量操做支持有限:mget,mset必須再一個slot
key事物和lua支持有限:操做的key必須在一個節點
key時數據分區的最小粒度:不支持bigkey分區
不支持多個數據庫:集羣模式下只有一個db 0
複製只支持一層:不支持樹形複製結構
受益:
經過緩存加速讀寫速度
後端服務器經過前端緩存下降負載,業務端使用Redis下降後端Mysql負載
成本:
緩存從和數據層有時間窗口不一致,和更新策略有關
多了一層緩存邏輯
使用場景
對高消耗的SQL=>join結果集/分組統計結果緩存
利英Redis/Memcache優化IO響應時間
如計數器先Redis累加再批量寫DB
建議 低一致性:最大內存和淘汰策略 高一致性 超時剔除和主動更新結合,最大內存和淘汰策略兜底
大量請求不命中
緣由:
發現:
解決方案:
兩個問題:
須要更多的鍵
緩存層和存儲層數據短時間不一致
因爲cache服務承載大量請求,當cache服務器異常/脫機,流量直接壓向後端組建,形成級聯故障
優化方案:
保證緩存高可用性
優化IO的幾種方法
三個目標
兩個解決
緩存層面:沒有設置過時時間
功能層面:爲每一個value添加邏輯過時時間,但發現超過邏輯過時時間後,會使用單獨的線程去構建緩存
緩存收益:加速讀寫,下降後端存儲負載緩存成本 緩存和存儲數據不一致性 代碼維護成本 運維成本推薦結合剔除、超時、主動更新三種方案共同完成穿透問題:使用緩存空對象和布隆過濾器來解決,注意他們各自的使用場景和侷限性無底洞問題:分佈式緩存中,有更多的機器不保證有更高的性能雪崩問題:緩存層高可用,客戶端降級 提早演練熱點key問題 互斥鎖 永遠不過時 可以子啊必定程度上解決熱點key的問題