Redis3.0版本之后开始支持了Redis Cluster,Redis也开始有了分布式缓存的概念,集群模式下的redis具有故障转移和分区的能力。但在Cluster模式下运行的Redis也对client做出了一些要求和限制
1、客户端需要处理特殊的响应(如MOVED
和ASK
),我们将能重定向请求到正确节点的客户端称为Smart client(如JedisCluster等)
2、由于要保证redis命令的原子性,无法处理涉及多个key的命令(如mget、mset)
3、集群进行增减节点的操作时,客户端也需要进行相应修改,需要重启客户端应用
伴随着Redis6.0的发布,作为最令人怦然心动的特性之一,Redis官方同时推出Redis集群的proxy了:redis-cluster-proxy,github.com/RedisLabs/r…
相比从前访问Redis集群时需要制定集群中所有的IP节点相比:
1,redis的redis-cluster-proxy实现了redis cluster集群节点的代理(屏蔽),类似于VIP但又比VIP简单,客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群。
2,不仅如此,还是具有一些非常实用的改进,比如在redis集群模式下,增加了对multiple操作的支持,跨slot操作等等(有点关系数据库的分库分表中间件的感觉)。
安装
-
下载
git clone https://github.com/RedisLabs/redis-cluster-proxy.git
-
编译
sudo apt-get install make gcccd redis-cluster-proxy/# 指定安装目录make PREFIX=/some/other/directory install
使用
目前Proxy的所有参数均可通过命令行或proxy.conf配置文件两种方式指定。
./redis-cluster-proxy host1:port1,host2:port2
./redis-cluster-proxy -c proxy.conf
默认情况下,Proxy将绑定所有可用的网络接口以侦听传入的连接。后端redis-server的地址可在proxy.conf文件中的cluster
项或entry-point
项配置
主要参数
# proxy能接收的最大客户端连接数,默认10000# 超过最大连接数,返回(error) ERR max number of clients reached--maxclients <n>
# proxy的work线程数,默认8,最大500--threads <n># 连接池的大小,0禁用连接池。默认值:10,最大值:50--connections-pool-size <size>
# 连接池中的最小连接数。低于此值时线程将以定义的速率开始重新生成连接,直到池再次变满。默认值:10--connections-pool-min-size <size>
# 重新生成连接池中连接的时间间隔(以毫秒为单位) 默认值:50--connections-pool-spawn-every <ms>
# 每个周期在连接池中重新产生的连接数。 默认值:2--connections-pool-spawn-rate <num>
# 何时应禁用多路复用:(auto|always)(默认值:auto) ????--disable-multiplexing <opt>
# 启用跨槽查询(路由到多个节点的跨槽查询不是原子性的)--enable-cross-slot
关于线程池
-
--connections-pool-size
参数配置的是每个proxy内部的线程到每个redis节点的连接数。如果按默认值,--thread
为8,--connection-pool-size
为10,则proxy启动时会对一个node创建80个连接 -
当执行MULTI、SCAN、阻塞型命令或
--disable-multiplexing
设为always时,客户端的每次连接将不会从连接池中获取,而是重新建立到集群的连接,并且该连接不能被其他客户端复用
特性
redis-cluster-proxy的主要功能:
-
路由:每个查询都会自动路由到集群的正确节点
-
多线程:支持多路复用和专用连接模型。并且在多路复用上下文中,可以确保查询执行和答复顺序
-
自动更新集群的配置:当答复返回
ASK/MOVED
后,proxy会自动重新映射所有slots来自动更新集群,更新完成后所有查询将重新执行。因此,在客户端的角度来看,将不会收到ASK/MOVED
错误,将在收到请求后直接收到预期的回复 -
跨槽/跨节点查询:支持多key命令,即使这些key属于不同插槽(甚至不同集群节点)。Proxy会将查询分为多个查询,这些查询将被路由到不同的插槽/节点,并在Proxy端汇总结果。由于这些查询破坏了Redis命令的原子性,因此在默认情况下是禁用的
-
特殊行为的命令
- PING:由Proxy直接响应PONG
- DBSIZE:将查询发送到集群中的所有节点并对其答复求和
- MULTI / 阻塞类型命令:会禁用多路复用的连接,Proxy为客户端创建专用连接
-
新增用于代理的PRXOXY命令
-
PROXY CONFIG GET|SET option [value]
获取或设置Proxy参数。并非所有参数都是可以在线更改的,某些参数是只读的
-
PROXY MULTIPLEXING status|off
获取客户端连接的状态或禁用多路复用连接。
shared
为多路复用连接;private
为私有连接 -
PROXY COMMAND [UNSUPPORTED|CROSSSLOTS-UNSUPPORTED]
返回目前Proxy不支持的命令或不能与跨槽查询一起使用的命令(即使启用了跨槽查询)
-
PROXY CLIENT id|thread
获取当前客户端的内部id和该连接所绑定的proxy线程
Proxy的多路复用线程模型与netty相似,一个连接只能与固定的线程绑定,该线程负责这个连接的所有生命周期
-
PROXY CLUSTER status|connection|nodes
可获得proxy状态,客户端连接状态和后端nodes列表三部分信息
-
PROXY INFO
返回集群信息,类似于redis info,返回的信息由Proxy、Memory、Clients、Cluster四部分构成
-
目前状态
- 目前redis-cluster-proxy还处于α测试版本,官方也说明暂时不推荐在生产环境使用
- 截止到2021年7月github上的 redis-cluster-proxy 还是没解决单点故障导致代理不可用的问题