Redis6.0 & redis-cluster-proxy集群

2,091 阅读5分钟

Redis3.0版本之后开始支持了Redis Cluster,Redis也开始有了分布式缓存的概念,集群模式下的redis具有故障转移和分区的能力。但在Cluster模式下运行的Redis也对client做出了一些要求和限制

     1、客户端需要处理特殊的响应(如MOVEDASK),我们将能重定向请求到正确节点的客户端称为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操作等等(有点关系数据库的分库分表中间件的感觉)。

安装

  1. 下载

    git clone https://github.com/RedisLabs/redis-cluster-proxy.git
    
  2. 编译

    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

关于线程池

  1. --connections-pool-size参数配置的是每个proxy内部的线程到每个redis节点的连接数。如果按默认值,--thread为8,--connection-pool-size为10,则proxy启动时会对一个node创建80个连接

  2. 当执行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四部分构成

目前状态

  1. 目前redis-cluster-proxy还处于α测试版本,官方也说明暂时不推荐在生产环境使用
  2. 截止到2021年7月github上的 redis-cluster-proxy 还是没解决单点故障导致代理不可用的问题