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

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

感谢 doyoubi 提供这么好的项目,原文:https://github.com/doyoubi/undermoon/blob/master/docs/redis_cluster_protocol.md

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

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

这种客户端称为 Smart Client。

https://redis.io/topics/cluster-tutorial

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

  • https://github.com/RedisLabs/redis-cluster-proxy
  • https://github.com/wayslog/aster
  • https://github.com/eleme/corvus
  • https://github.com/samaritan-proxy/samaritan

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

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

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

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

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

为什么是 Server-side Proxy?

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

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

Server-side Proxy

以下是 Server-side Proxy 和 Redis 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


责任编辑:武晓燕 来源: 黑客下午茶
相关推荐

2022-01-26 20:43:04

集群构建块Chunk

2022-01-27 20:15:31

集群存储元数据

2022-02-06 21:14:57

Redis命令

2022-02-02 21:58:43

Redis集群Undermoon

2024-03-07 16:03:56

RedisDocker

2021-04-06 06:04:36

Redis 6.X C集群搭建操作系统

2023-04-07 08:28:14

2023-06-10 23:09:40

Redis场景内存

2019-12-13 10:50:49

集群Redis存储

2020-08-31 16:36:36

Redis架构节点

2021-04-22 08:40:42

RedisCluster 集群故障转移

2023-10-10 23:06:46

RedisMySQL

2019-09-16 16:05:13

Redis集群模式

2021-06-03 18:42:26

Redis集群故障

2022-08-28 19:36:15

数据分片KafkaRocketMQ

2021-10-07 20:36:45

Redis集群场景

2022-03-19 12:16:49

Redis高并发系统集群部署

2022-02-14 08:33:51

Redis哨兵集群

2017-02-27 21:55:04

LinuxCentOS 7.0Redis

2021-03-12 07:47:44

KubernetesRedis-clustRedis
点赞
收藏

51CTO技术栈公众号