为何Redis集群要使用反向代理?

为何要使用反向代理?

若是没有方向代理,一台Redis可能须要跟不少个客户端链接:git

2002319-20210131080526659-119858341

看着是否是很慌?看不要紧,主要是链接须要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端创建链接上,redis的高可用和可扩展不管是自带的Redis Sentinel仍是Redis Cluster都要求客户端进行额外的支持,而目前基本上没有合适的客户端可以作这些事情,客户端来作这些事情也并不合适,它会让维护变得特别困难。github

所以在客户端和redis服务端之间加一层代理成了一种理想的方案,代理屏蔽后端Redis实现细节向客户端提供redis服务,能够完美的解决Redis的高可用和扩展性问题,同时代理的引入也使得Redis维护变得更加简单。redis

因而乎,有了代理:后端

如何使用代理?

很简单,将请求链接到调度代理器上,由Proxy负责将请求转发到后面的Redis服务实例,图示:多线程

2002319-20210131080732301-1329663942

又有了新的问题,Proxy挂了可咋整?负载均衡

因此Proxy又须要作集群,甚至前面能够加一层负载均衡,负载均衡嘛,单机也存在单点故障等问题,一个Director确定不行,搞很差又挂了,因此整一个主备,备机经过KeepAlived来检测主LVS健康情况,出了问题顶上去。memcached

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
相关文章
相关标签/搜索