為什麼要使用反向代理?
如果沒有反向代理,一臺Redis可能需要跟很多個客戶端連線:
看著是不是很慌?看沒關係,主要是連線需要消耗執行緒資源,沒有代理的話,Redis要將很大一部分的資源用在與客戶端建立連線上,redis的高可用和可擴充套件無論是自帶的Redis Sentinel還是Redis Cluster都要求客戶端進行額外的支援,而目前基本上沒有合適的客戶端能夠做這些事情,客戶端來做這些事情也並不合適,它會讓維護變得特別困難。
因此在客戶端和redis服務端之間加一層代理成了一種理想的方案,代理遮蔽後端Redis實現細節向客戶端提供redis服務,可以完美的解決Redis的高可用和擴充套件性問題,同時代理的引入也使得Redis維護變得更加簡單。
於是乎,有了代理:
如何使用代理?
很簡單,將請求連線到排程代理器上,由Proxy負責將請求轉發到後面的Redis服務例項,圖示:
又有了新的問題,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