本文爲《持續演進的 Cloud Native》的一篇學習記錄。redis
優點:後端
1. 去中心化緩存
元數據分佈在全部節點,不會輕易丟失。服務器
2. 部署簡單網絡
Redis 自帶的 redis-cli 便可。負載均衡
3. 性能高異步
由於沒必要經過代理。ide
劣勢:性能
1. SDK 複雜學習
不是大問題。Lettuce 和 Spring Data Redis(底層也是 Lettuce)對它有很好支持。
2. 沒有良好的界面管理
目前官方有個簡單的界面管理。若是須要,能夠定製修改或自研。
3. 不一致問題
在主從異步、從新選主的過程當中,Redis 集羣不保證強一致性。當發生網絡分區的時候,若是主服務器剛好在少數節點,實際上有一個能夠繼續寫入的時間窗口。當多數節點完成從新選主,而網絡分區恢復以後,會覆蓋舊的主服務器在這個時間窗口內所寫的數據。
4. gossip 協議的性能問題
當節點不少時,gossip 協議的報文會佔據比較大的帶寬。
注:目前最新版的 Redis 自帶集羣已經能夠在 NAT 後面工做了。
客戶端作負載均衡,而且直連 Redis 節點。
用 etcd 等做爲註冊發現服務,可實現 Redis 節點的動態改變(增刪節點,節點擴容)。
優點:
1. 數據分散
將數據分到多個節點,總體容量獲得了提高。
當一個節點不可用時,只有 1/n 的流量穿透緩存,不會對後端存儲形成很大危害。
2. 可用性高
部分節點掛了不影響其餘節點。
若是不要求緩存高可用,能夠不作主從,不持久化。
注:Redis 的兩種持久化方式,RDB 可能形成不一致,AOF 性能比較差。若是須要持久化根據業務場景選擇。
3. 能夠動態配置
etcd 便可實現。
4. 擴容方便
擴容能夠採用 presharding、數據遷移兩種方式。能夠利用 slot 機制遷移數據,在 etcd 中存儲 slot 元數據,若是將數據劃分爲 1024 個 slot,再以 slot 爲單位分片存儲到多個 Redis 節點上。當須要遷移數據時,以 slot 爲單位遷移,要比以節點爲單位遷移溫和得多。
5. 性能高
由於客戶端直連 Redis。
劣勢:
SDK 開發起來比較複雜。但問題不大,由於 SDK 開發完成後不會常常修改。
優點:
1. 控制力強
2. 簡單(客戶端用起來簡單,連代理就行)
3. Redis 鏈接數可控
劣勢:
響應時間升高(由於多走了一次代理)。
是否考慮代理模式,取決於增長的響應時間可否被接受。
設沒有代理時,整個請求過程消耗的時間爲 A,加入代理以後,增長的時間爲 B。若是 B 和 A 相比能夠忽略或不在意增長 B,則能夠考慮使用該模式。
與代理模式的異同:
因爲客戶端和 sidecar 在一個 pod 中,性能更好一些。
須要將 sidecar 作成無狀態的,由於 sidecar 的數量可能不少。