🚀 RPR - Redis Proxy Redis
仓库地址: 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 |
📄 许可证
🤝 贡献
欢迎提交 Issue 和 Pull Request!
Made with ❤️ for Redis