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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
14天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
200 0
|
23天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
159 2
|
28天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
150 0
|
2月前
|
运维 NoSQL 算法
Redis-Cluster 与 Redis 集群的技术大比拼
Redis-Cluster 与 Redis 集群的技术大比拼
47 0
|
1天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
121 10
|
14天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
16 0
|
23天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
31 0
面试官:如何搭建Redis集群?
|
26天前
|
存储 缓存 NoSQL
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)(一)
【Redis深度专题】「核心技术提升」探究Redis服务启动的过程机制的技术原理和流程分析的指南(集群功能分析)
271 0
|
1月前
|
NoSQL Redis Docker
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
使用Docker搭建一个“一主两从”的 Redis 集群(超详细步骤)
64 0
|
1月前
|
存储 监控 NoSQL
Redis 架构深入:主从复制、哨兵到集群
大家好,我是小康,今天我们来聊下 Redis 的几种架构模式,包括主从复制、哨兵和集群模式。
Redis 架构深入:主从复制、哨兵到集群