让 Redis 变成 Redis 的智能代理

0 阅读3分钟

🚀 RPR - Redis Proxy Redis

License: MIT Redis Module

仓库地址: gitee.com/JJZ921024/r…

📖 简介

RPR 是一个 Redis 模块,让任意 Redis 节点瞬间变成 Redis Cluster 的智能代理。

💪 核心价值:用单节点的方式访问 Redis Cluster,无需修改客户端代码!

RPR = Make Redis Proxy Redis

让 Redis 变成 Redis 的智能代理!🎯


⚠️ 重要说明

本模块需要 修改过的 Redis(需应用补丁),详见 快速开始

🚧 补丁尚未经官方审核,仅建议用于开发测试环境


✨ 核心特性

🔄 透明代理

  • 🎯 自动路由:根据 key 的 slot 自动转发命令到正确的节点
  • 🔒 无感知:客户端像连接单机 Redis 一样使用
  • 高性能:基于 hiredis 异步 I/O,非阻塞转发

📡 自动拓扑发现

  • 🌐 自动发现:启动时自动获取集群拓扑
  • 事件驱动:监听 Redis 集群事件,实时感知变化
    • 🔁 主从角色切换
    • ➕ 节点上线/下线
    • 📦 Slot 迁移完成
  • 📢 集群广播:拓扑变化时通过 cluster bus 通知所有节点

🔀 读流量负载均衡

当节点需要转发读请求到远程节点时, 能随机选择 master 或任一 replica, 实现读请求负载均衡,减轻 master 压力

┌─────────┐  READONLY   ┌────────────┐      ┌────────────┐
│ Client  │ ──────────► │  Master    │ ───► │  Replica 1 │
│         │             │  (RPR)     │      │  (Slot X)  │
└─────────┘             └────────────┘      └────────────┘
     │                        │
     │  GET product:12345     │    随机选择       │
     │ ────────────────────►  │ ───────────────► │
     │                        │                  │
     │        ◄───────────────────────────────   │
     │  "iPhone 15"           │                  │
     ▼                        ▼                  ▼

💪 充分利用从节点

🚦 从节点也能代理流量

从节点能作为代理节点,将请求转发到正确的目标节点

┌─────────┐        ┌────────────┐        ┌──────────┐
│ Client  │ ────►  │  Replica   │ ────►  │  Master  │
│         │        │  (RPR)     │        │ (Slot X) │
└─────────┘        └────────────┘        └──────────┘
📖 本地读优化

对ReadOnly的客户端连接上的读流量, 若key属于自己 slot 时, 可在从节点本地执行

┌─────────┐  READONLY   ┌────────────┐
│ Client  │ ──────────► │  Replica   │
│         │             │  (RPR)     │
└─────────┘             └────────────┘
     │                        │
     │  GET user:1            │ ✅ 本地处理
     │ ────────────────────►  │ (Slot 归属 Master)
     │                        │ 无需转发!
     │  "Alice"               │
     │ ◄────────────────────  │
     ▼                        ▼
📋 总结: ReadOnly连接上读请求的转发规则

客户端执行 READONLY 后,RPR 按以下规则处理读请求:

场景当前节点Slot 归属处理方式
本地读优化Replica自己的 Master本地执行,无需转发
远程负载均衡任意节点远程 Master随机转发到目标 Master 或其任一 Replica

🚀 快速开始

1️⃣ 编译 Redis & 应用补丁

# 克隆 Redis 仓库
git clone https://github.com/redis/redis.git
cd redis

# 切换到 8.4.0 版本
git checkout 8.4.0

# 应用 RPR 补丁
git apply /path/to/rpr-base-8.4.0.patch

# 编译 Redis
make -j$(nproc)

# 编译完成后,src/redis-server 即可加载 RPR 模块

2️⃣ 编译 RPR 模块

# 配置构建
cmake -B build

# 构建
cmake --build build

# Release 构建
cmake -DCMAKE_BUILD_TYPE=Release -B build && cmake --build build

3️⃣ 加载模块

# 加载模块到 Redis
redis-cli -p 30001 MODULE LOAD ./build/rpr-module.so

# 或在 redis.conf 中配置
loadmodule /path/to/rpr-module.so

4️⃣ 使用示例

# 连接任意节点
redis-cli -p 30001

# 像单机 Redis 一样操作!
> SET user:1 "Alice"
OK
> GET user:1
"Alice"
> HSET session:abc name "Bob"
(integer) 1

# 即使 key 不在当前节点,也能正常工作!
> GET product:12345  # 自动转发到正确的节点
"iPhone 15"

⚙️ 配置

密码认证

RPR 自动从 Redis 配置中读取 masterauth 用于节点间认证:

# redis.conf
masterauth your_password

📋 支持的命令

✅ 自动代理的命令

大部分读写命令都会自动代理到正确的节点。

❌ 不代理的命令

以下命令直接在本地处理:

类别命令
信息类INFO, PING, ECHO, TIME, DBSIZE
配置类CONFIG, MODULE, COMMAND, LOLWUT
管理类ACL, BGSAVE, FLUSHALL, FLUSHDB, SHUTDOWN
集群类CLUSTER, READONLY, READWRITE, ASKING
复制类SYNC, PSYNC, SLAVEOF, ROLE
监控类MONITOR, SLOWLOG, LATENCY
客户端CLIENT, AUTH, QUIT, SELECT

📄 许可证

MIT License


🤝 贡献

欢迎提交 Issue 和 Pull Request!


Made with ❤️ for Redis