一、Redis-cluster
针对单节点Redis出现的扩容等问题,Redis官方在Redis3.0版本时推出了Redis集群模式,集群模式主要有以下4个特点:
1、redis cluster 采用无中心结构,每个节点都保存数据和整个集群的状态;
2、节点之间使用GOSSIP协议彼此互联(PING-PONG机制),这些连接保持活跃,内部使用二进制协议优化传输速度和带宽;
3、节点的fail是通过集群中超过半数的节点检测失效时才生效;
4、客户端与redis节点直连,不需要中间proxy层;client根据node返回的错误信息重定向请求
对应的缺陷有以下两点:
1、无中心化的结构使得每个节点需要同剩余的节点进行通信,随着节点增多,网络压力增大。
2、业务层和架构层高度耦合,出现问题难以拆分解决。
针对Redis cluster的问题,市场上出现了诸如Codis、Twemproxy等分布式解决方案,都是在架构顶层增加一层无状态的代理,
这样不仅解决了无中心结构互相通信造成的网络压力问题,也可以使得业务和架构低耦合,避免出现系统问题。
但是由于各种原因,开源的解决方案无法持续更新来跟上Redis版本升级的进度,Redis一些固有的问题无法解决,对使用者带来了一定的烦恼。Redis作者更新了官方集群版的proxy。
二、Redis-cluster-proxy
Redis集群代理和上述的Codis、Twemproxy方案类似,是基于Redis集群的上层代理,通过使用代理,集群被抽象出来,访问代理如图访问Redis节点。
Redis集群代理有以下几个特性:
1、路由:每个查询将自动路由到集群的正确节点
2、多线程
3、支持多路复用和私有连接模型
4、即使在多路复用上下文中,查询执行和返回顺序也得到保证
5、在ASK|MOVED错误后自动更新集群的配置:当这些类型的错误在返回中发生时,代理会通过重新映射所有slot来自动更新集群的内部配置。更新完成后,将重新执行所有查询。
6、跨slot/节点查询:支持在不同slot(甚至属于不同集群节点)的处理多个键的命令。这些命令将被分割成多个查询路由到不同的slot/节点。这些命令的结果返回是特定于命令的。
MGET、MSET或DEL等其他命令将对所有应答的结果进行求和。因为这些查询实际上破坏了命令的原子性,所以它们的使用是可选的(默认禁用)。
7、一些没有特定节点/slot的命令(如DBSIZE)被分发给所有节点,汇总每个节点的结果并返回。
8、PROXY命令可以展现一些代理特定的信息。
三、编译部署
proxy编译详见:https://github.com/RedisLabs/redis-cluster-proxy (编译proxy对应的gcc版本要高于gcc5),此处重点讲部署。
1、proxy启动的方式和Redis类似,命令为# ./redis-cluster-proxy -c /path/to/proxy.conf
2、需要制定Redis-cluster的节点地址,可指定多个,格式为 cluster 127.0.0.1:7000
3、设定proxy的侦听端口,默认7777
4、设置proxy的线程数,默认为8线程,可根据实际情况部署。
5、设置proxy的tcp-backlog队列长度,默认511,建议设置到2047。
6、设置proxy的连接池connections-pool-size大小,默认10,建议根据实际情况调大。
7、设置日志文件的路径,根据部署情况选择日志路径
8、开启跨slot查询,enable-cross-slot yes。默认禁用
根据说明,必须部署Redis集群,在配置文件里指定集群的部分节点,才可启动Redis集群代理。
3.1 先创建一个4master节点的Redis集群
/app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8031.conf &
/app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8032.conf &
/app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8033.conf &
/app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8034.conf &
/app/zhouqw/redis-6.0.4/bin/redis-cli --cluster create 192.168.10.202:8031 192.168.10.202:8032 192.168.10.202:8033 192.168.10.202:8034
查看Redis集群的状态
/app/zhouqw/redis-6.0.4/bin/redis-cli -p 8031 cluster nodes
3.2 新建代理
在proxy.conf文件里指定4个master节点,将日志级别设置为debug并启动
/app/zhouqw/redis-cluster-proxy/bin/redis-cluster-proxy -c /app/zhouqw/redis-cluster-proxy/proxy.conf &
查看启动后的proxy日志,日志记录了代理发现了4个master节点及其他的设置信息。
通过proxy新建一个key hello,并将值设置为world,
3.3 常用命令
/app/zhouqw/redis-6.0.4/bin/redis-cli -p 7777 proxy cluster 可查看集群信息
proxy config get 、proxy config set 命令和redis-cli客户端一样可以修改配置参数;proxy info 命令如图redis-cli info命令一样,只是提供的有效信息有限
四、性能压测
本次压测样例为100万请求,增大客户端连接数压测五次取平均值,压测结果显示Redis-cluster-proxy的QPS大概在5万到6万之间。与单线程IO Redis节点压测结果差距不大。
五、结语
由于市场上其他的分布式解决方案无法跟随底层的Redis版本进行更新迭代,无法享受Redis内核更新及新功能的红利,
Redis-cluster-proxy解决了Redis-cluster无中心化的多节点网络通信压力、业务和架构高度耦合的问题,同时可以兼容底层Redis版本变更,是一个不错分布式解决方案的选择。
由于目前Redis-cluster-proxy仍处于非稳定版本,GitHub上仍有反馈bug,部分proxy参数无法动态修改,统计信息缺失不易监控,距离在生产环境大规模部署有一定距离。
期待Redis-cluster-proxy功能强大的一天!