Redis集群Proxy支持select命令方案介绍

简介: 目前Redis集群开源的方案主要有Redis Cluster,Codis,Twemproxy等,这几个方案里面都不支持select命令,即用户无法使用select进行逻辑db的切换,这样会给之前使用Redis单机的用户带来一定困扰,导致很多用户在迁移到集群方案的时候需要改造代码,本文探讨Redis集群支持select命令的方案实现。

目前Redis集群开源的方案主要有Redis Cluster,Codis,Twemproxy等,这几个方案里面都不支持select命令,即用户无法使用select进行逻辑db的切换,这样会给之前使用Redis单机的用户带来一定困扰,导致很多用户在迁移到集群方案的时候需要改造代码,本文探讨Redis集群支持select命令的方案实现。

阿里云Redis集群

阿里云的redis集群版由3大组件构成:

  • redis-config : 集群管理工具
  • redis-server : 优化过源码的redis,支持slot, 扩容迁移等
  • redis-proxy : 单线程,c++14语言实现的内核

数据链路图如下所示,用户的请求通过Proxy负载均衡之后分发到后端多个节点进行请求。
screenshot.png

Proxy介绍

Redis通常作为缓存,用户在访问Redis的时候都希望延迟尽量低,所以我们选择了C++进行开发,另外为了使用更多C++的新特性,我们选择了C++14进行开发,大量精简了代码提高了代码可阅读性。为了简化模型Proxy设计成单进程单线程的结构,所有用户请求都只会在一个工作线程上进行转发。另外为了保证云资源之间的隔离性,每个用户都具有独立的Proxy避免不同用户之间的互相影响。同时Proxy提供了HTTP的接口用于管控系统的控制和查询。阿里云Redis集群Proxy特性如下:

  • 支持单slot命令,支持set,get等单key命令
  • 支持多key命令,支持mset,mget等分布在不同db进行请求的命令
  • 支持pubsub订阅命令
  • 支持相同slot上的事物
  • 支持select命令
  • 热升级,链接不断开
  • 高性能
  • 低延时

从以上特性我们可以看到阿里云Redis的Proxy支持了绝大部分的Redis的命令,具有很高的兼容性。后续阿里云Redis集群Proxy还会提供block类命令支持,读写分离等特性。

Proxy如何支持select命令

方案1:一对一链接

screenshot.png
简单的方案如上图Proxy可以维护和客户端一对一的链接,对于所有客户端的请求建立一对一的链接,所有请求都直接进行转发到后端处理。这样的方案可以直接实现select命令的支持,但是这样的方案带来的问题就是需要频繁和后端Redis建立链接,性能比较差,而且在用户使用短连接的情况下还会造成链接风暴导致链路不稳定。

方案2:长连接

screenshot.png
方案二Proxy和后端Redis之间维护一个长连接,所有的命令都通过该长连接进行转发,Proxy需要维护每个前端Client的db信息,在转发命令的时候显示的增加select调用。这个方案如果在前端Client使用不同db的时候会导致后端db链接频繁进行db的切换,而且qps放大的倍数直接和client链接数目相关,会极大的影响集群的性能。

方案3:db级别长连接

screenshot.png
如上图Proxy到Redis之间每个db都维护一个长连接,每个长连接建立的时候都会执行select命令标注该链接为某个db的链接。用户执行select命令之后我们就标记该链接为对应的db,Proxy在接收到用户请求之后根据链接db信息转发到后端对应的长连接上,如果没有存在的长连接则新建一个对应的db长连接。考虑到原生的Redis支持的db数目为16个db,在后端Redis节点数目不多的情况下,Proxy支撑的连接数是有限的。这种方案可以降低Proxy的链接数目,同时可以让命令在相同链接上合并发送提高Proxy到Redis的性能。

总结

阿里云Redis采用了上述方案3来实现select多命令的支持,在实际过程中由于Proxy还需要支持事物、订阅等命令,实际的链接模型会比上面的还复杂,后续我们也会继续介绍事物、订阅等命令如何实现。阿里云Redis致力于提供最好的云数据库Redis服务,我们正在寻找有一样志向的同学加入我们,有兴趣的同学请猛击链接

目录
相关文章
|
5月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
418 2
|
3月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
576 7
|
4月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
4月前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
146 12
|
4月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
5月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
6月前
|
NoSQL Redis
Lua脚本协助Redis分布式锁实现命令的原子性
利用Lua脚本确保Redis操作的原子性是分布式锁安全性的关键所在,可以大幅减少由于网络分区、客户端故障等导致的锁无法正确释放的情况,从而在分布式系统中保证数据操作的安全性和一致性。在将这些概念应用于生产环境前,建议深入理解Redis事务与Lua脚本的工作原理以及分布式锁的可能问题和解决方案。
245 8
|
5月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
5月前
|
监控 NoSQL 关系型数据库
保障Redis与MySQL数据一致性的强化方案
在设计时,需要充分考虑到业务场景和系统复杂度,避免为了追求一致性而过度牺牲系统性能。保持简洁但有效的策略往往比采取过于复杂的方案更加实际。同时,各种方案都需要在实际业务场景中经过慎重评估和充分测试才可以投入生产环境。
321 0
|
8月前
|
存储 缓存 监控
Redis设计与实现——Redis命令参考与高级特性
Redis 是一个高性能的键值存储系统,支持丰富的数据类型(字符串、列表、哈希、集合等)和多种高级功能。本文档涵盖 Redis 的核心命令分类,包括数据类型操作、事务与脚本、持久化、集群管理、系统监控等。特别介绍了事务的原子性特性、Lua 脚本的执行方式及优势、排序机制、发布订阅模型以及慢查询日志和监视器工具的使用方法。适用于开发者快速掌握 Redis 常用命令及其应用场景,优化系统性能与可靠性。

相关产品

  • 云数据库 Tair(兼容 Redis)