...

爲什麼(me) Redis 集群要使用反向(xiàng)代理? 看這(zhè)篇就(jiù)明白了!

2022-03-21

如果沒(méi)有反向(xiàng)代理,一台Redis可能(néng)需要跟很多個客戶端連接:

圖片

看著(zhe)是不是很慌?看沒(méi)關系,主要是連接需要消耗線程資源,沒(méi)有代理的話,Redis要將(jiāng)很大一部分的資源用在與客戶端建立連接上,redis的高可用和可擴展無論是自帶的Redis Sentinel還(hái)是Redis Cluster都(dōu)要求客戶端進(jìn)行額外的支持,而目前基本上沒(méi)有合适的客戶端能(néng)夠做這(zhè)些事(shì)情,客戶端來做這(zhè)些事(shì)情也并不合适,它會(huì)讓維護變得特别困難。

因此在客戶端和redis服務端之間加一層代理成(chéng)了一種(zhǒng)理想的方案,代理屏蔽後(hòu)端Redis實現細節向(xiàng)客戶端提供redis服務,可以完美的解決Redis的高可用和擴展性問題,同時(shí)代理的引入也使得Redis維護變得更加簡單。

于是乎,有了代理:

如何使用代理?

很簡單,將(jiāng)請求連接到調度代理器上,由Proxy負責將(jiāng)請求轉發(fā)到後(hòu)面(miàn)的Redis服務實例,圖示:

圖片

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

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

圖片

Redis代理插件

Redis代理插件有很多,這(zhè)兒簡單介紹幾款

predixy高性能(néng)全特征redis代理,支持Redis Sentinel和Redis Cluster
twemproxy快速、輕量級memcached和redis代理
codisredis集群代理解決方案
redis-cerberusRedis Cluster代理

代理詳細功能(néng)對(duì)比

特性predixytwemproxycodisredis-cerberus
高可用Redis Sentinel或Redis Cluster一緻性哈希Redis SentinelRedis Cluster
可擴展Key哈希分布或Redis ClusterKey哈希分布Key哈希分布Redis Cluster
開(kāi)發(fā)語言C++CGOC++
多線程
事(shì)務Redis Sentinel模式單Redis組下支持不支持不支持不支持
BLPOP/BRPOP/BLPOPRPUSH支持不支持不支持支持
Pub/Sub支持不支持不支持支持
Script支持load不支持不支持不支持
Scan支持不支持不支持不支持
Select DB支持不支持支持Redis Cluster隻有一個DB
Auth支持定義多個密碼,給予不同讀寫及管理權限和Key訪問空間不支持同redis不支持
讀從節點支持,可定義豐富規則讀指定的從節點不支持支持,簡單規則支持,簡單規則
多機房支持支持,可定義豐富規則調度流量不支持有限支持有限支持
統計信息豐富豐富豐富簡單

簡單來說(shuō),predixy既支持Redis Sentinel也支持Redis Cluster

  • 後(hòu)端爲Redis Sentinel監控的一組Redis,功能(néng)完全等同于原始Redis
  • 後(hòu)端爲Redis Sentinel監控的多組Redis,則有部分功能(néng)受限
  • 後(hòu)端爲Redis Cluster,功能(néng)完全等同于Redis Cluster


來源: 架構師優雅之道(dào)