為什麼Redis叢集要使用反向代理?

等不到的口琴發表於2021-01-31

為什麼要使用反向代理?

如果沒有反向代理,一臺Redis可能需要跟很多個客戶端連線:

2002319-20210131080526659-119858341

看著是不是很慌?看沒關係,主要是連線需要消耗執行緒資源,沒有代理的話,Redis要將很大一部分的資源用在與客戶端建立連線上,redis的高可用和可擴充套件無論是自帶的Redis Sentinel還是Redis Cluster都要求客戶端進行額外的支援,而目前基本上沒有合適的客戶端能夠做這些事情,客戶端來做這些事情也並不合適,它會讓維護變得特別困難。

因此在客戶端和redis服務端之間加一層代理成了一種理想的方案,代理遮蔽後端Redis實現細節向客戶端提供redis服務,可以完美的解決Redis的高可用和擴充套件性問題,同時代理的引入也使得Redis維護變得更加簡單。

於是乎,有了代理:

如何使用代理?

很簡單,將請求連線到排程代理器上,由Proxy負責將請求轉發到後面的Redis服務例項,圖示:

2002319-20210131080732301-1329663942

又有了新的問題,Proxy掛了可咋整?

所以Proxy又需要做叢集,甚至前面可以加一層負載均衡,負載均衡嘛,單機也存在單點故障等問題,一個Director肯定不行,搞不好又掛了,所以整一個主備,備機通過KeepAlived來檢測主LVS健康狀況,出了問題頂上去。

Redis代理外掛

Redis代理外掛有很多,這兒簡單介紹幾款

predixy 高效能全特徵redis代理,支援Redis Sentinel和Redis Cluster
twemproxy 快速、輕量級memcached和redis代理
codis redis叢集代理解決方案
redis-cerberus Redis Cluster代理

代理詳細功能對比

特性 predixy twemproxy codis redis-cerberus
高可用 Redis Sentinel或Redis Cluster 一致性雜湊 Redis Sentinel Redis Cluster
可擴充套件 Key雜湊分佈或Redis Cluster Key雜湊分佈 Key雜湊分佈 Redis Cluster
開發語言 C++ C GO C++
多執行緒
事務 Redis Sentinel模式單Redis組下支援 不支援 不支援 不支援
BLPOP/BRPOP/BLPOPRPUSH 支援 不支援 不支援 支援
Pub/Sub 支援 不支援 不支援 支援
Script 支援load 不支援 不支援 不支援
Scan 支援 不支援 不支援 不支援
Select DB 支援 不支援 支援 Redis Cluster只有一個DB
Auth 支援定義多個密碼,給予不同讀寫及管理許可權和Key訪問空間 不支援 同redis 不支援
讀從節點 支援,可定義豐富規則讀指定的從節點 不支援 支援,簡單規則 支援,簡單規則
多機房支援 支援,可定義豐富規則排程流量 不支援 有限支援 有限支援
統計資訊 豐富 豐富 豐富 簡單

簡單來說,predixy既支援Redis Sentinel也支援Redis Cluster

  • 後端為Redis Sentinel監控的一組Redis,功能完全等同於原始Redis
  • 後端為Redis Sentinel監控的多組Redis,則有部分功能受限
  • 後端為Redis Cluster,功能完全等同於Redis Cluster

相關文章