Rust 写的 Undermoon Redis 集群 - Redis Cluster Protocol与Server Proxy

简介: Rust 写的 Undermoon Redis 集群 - Redis Cluster Protocol与Server Proxy

Redis Cluster 是官方的 Redis 分布式解决方案,支持 sharding(分片)failover(故障转移)。与使用单实例 redis 相比,连接 Redis Cluster 的客户端需要实现 Redis Cluster Client Protocol。它的基本作用是:

  • 如果我们没有向正确的节点发送命令,则重定向请求。
  • CLUSTER NODESCLUSTER SLOTS 这两个命令之一缓存集群路由表。

这种客户端称为 Smart Client



image.png


为了兼容现有的 Redis client,还有一些 Redis Cluster Proxies,如 redis-cluster-proxy(官方)、aster、corvus 和 samaritan,以使集群协议适应广泛支持的单实例协议。



image.png


Undermoon 是如何实现 “Redis Cluster Protocol” 的?



Undermoon 基于 server-side proxyServer Proxy 实现 Redis Cluster ProtocolServer Proxy 将像官方的 Redis Cluster Redis 一样工作,并在需要时返回重定向响应。


image.png


为什么要实现另一个 “Redis Cluster Protocol”?



该实现不仅支持水平可扩展性和高可用性,还使您能够构建一个自我管理的分布式 Redis,支持:


  • Redis 资源池管理
  • 为不同的用户提供多个集群
  • 将流量洪水均匀地传播到所有物理机
  • 扩容迅速
  • 操作和 Kubernetes 集成更容易。


为什么是 Server-side Proxy?



Redis 和大多数 redis 代理(如 redis-cluster-proxycorvusastercodis)部署在独立的机器上,因为代理通常需要将请求分散到不同的 Redis 实例。

Server-side Proxy 不是路由请求,而是充当与这些代理不同的角色,类似于 Rediscluster module,通过使用一些定制的迁移协议,使其能够迁移数据快速扩展


Server-side Proxy



以下是 Server-side ProxyRedis Cluster Protocol 的一小部分操作。

首先运行一个 redis-server


$ redis-server


构建并运行 server_proxy,在端口 5299 上运行并将命令转发到 127.0.0.1:6379


> cargo build
> make server


> redis-cli -p 5299
# 通过 `UMCTL` 命令初始化代理。
127.0.0.1:5299> UMCTL SETCLUSTER v2 1 NOFLAGS mydb 127.0.0.1:6379 1 0-8000 PEER 127.0.0.1:7000 1 8001-16383
# Done! 我们可以像 Redis Cluster 一样使用它!
# 和官方的 Redis Cluster 不同,这里只显示 master 节点
# 而不是同时显示主服务器和副本。
127.0.0.1:5299> CLUSTER NODES
mydb________________9f8fca2805923328____ 127.0.0.1:5299 myself,master - 0 0 1 connected 0-8000
mydb________________d458dd9b55cc9ad9____ 127.0.0.1:7000 master - 0 0 1 connected 8001-16383
# 当我们使用 UMCTL SETCLUSTER 初始化它时,
# 插槽(slots) 8001-16383 属于另一个服务器代理 127.0.0.1:7000
# 所以我们得到一个重定向响应。
#
# 这是普通 Redis client 和 Redis Cluster client 的关键区别
# 因为我们需要处理重定向。
127.0.0.1:5299> get a
(error) MOVED 15495 127.0.0.1:7000
# Key 'b' 是该代理负责的,因此我们处理请求。
127.0.0.1:5299> set b 1
OK


相关文章
|
12月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
781 2
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
1224 5
|
10月前
|
NoSQL Java 网络安全
SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
742 5
|
10月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
939 6
|
11月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
404 5
|
12月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
缓存 NoSQL Redis
Redis原理—3.复制、哨兵和集群
详细介绍了Redis的复制原理、哨兵原理和集群原理。