YHM404 / redis-rs

使用Rust实现的仿codis架构的redis集群

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用Rust实现Redis集群

集群架构

Untitled

代理节点集群:用于转发redis客户端的请求到redis集群的节点。

manage_client:用于管理redis集群节点的注册和注销,以及把redis集群的信息同步给代理集群。

redis集群: 每个redis节点之间互相无感知,每个节点行为和单机redis时一致。

redis client: 向代理集群发送请求,与向单机redis节点发送请求的行一致。

Example

环境:

Mac M1

启动步骤

  1. 安装玩具etcd
homebrew install etcd
  1. 启动玩具etcd,默认启动地址127.0.0.1:2380,正常打印日志代表成功启动。
>>> etcd
>>>
{"level":"info","ts":"2023-01-14T09:03:20.945+0800","caller":"api/capability.go:75","msg":"enabled capabilities for version","cluster-version":"3.5"}
{"level":"info","ts":"2023-01-14T09:03:20.945+0800","caller":"embed/etcd.go:584","msg":"serving peer traffic","address":"127.0.0.1:2380"}
{"level":"info","ts":"2023-01-14T09:03:20.945+0800","caller":"embed/etcd.go:275","msg":"now serving peer/client/metrics","local-member-id":"8e9e05c52164694d","initial-advertise-peer-urls":["http://localhost:2380"],"listen-peer-urls":["http://localhost:2380"],"advertise-client-urls":["http://localhost:2379"],"listen-client-urls":["http://localhost:2379"],"listen-metrics-urls":[]}
  1. 编译redis-rs
# 需要安装protoc,用于编译grpc需要的protobuf文件
cargo build --release
  1. 随便启动两个redis节点
# 启动第一个redis节点
# 1是redis节点id 0.0.0.0:8001是启动的地址
./target/release/redis_node 1 0.0.0.0:8001

# 启动一个新的命令行窗口,启动第二个redis节点
./target/release/redis_node 2 0.0.0.0:8002
  1. 随便启动两个proxy节点
# 启动第一个proxy节点
# 1是代理节点id 0.0.0.0:7001是启动地址 http://localhost:2379是etcd集群地址
./target/release/proxy_node 1 0.0.0.0:7001 http://localhost:2379

# 启动一个新的命令行窗口,启动第二个proxy节点
./target/release/proxy_node 2 0.0.0.0:7002 http://localhost:2379
  1. 使用manage_client来把两个redis节点注册到集群中
./target/release/manage-client http://localhost:2379 add 1 http://0.0.0.0:8001
./target/release/manage-client http://localhost:2379 add 2 http://0.0.0.0:8002
  1. 使用redis_client测试set/get/remove等命令
#  http://localhost:2379是ectd地址

./target/release/redis_client http://localhost:2379 set key1 value1
2023-01-14T02:50:19.546Z INFO  [redis_client] Set key: "key1", value: "value1"

./target/release/redis_client http://localhost:2379 get key1
2023-01-14T02:50:40.077Z INFO  [redis_client] Get key: "key1", value: Some("value1")

./target/release/redis_client http://localhost:2379 delete key1 value1
2023-01-14T02:50:53.348Z INFO  [redis_client] Remove key: "key1"

./target/release/redis_client http://localhost:2379 get key1
2023-01-14T02:51:06.933Z INFO  [redis_client] Get key: "key1", value: None

TODO:

  • 实现单机redis,基本get/set/remove功能
  • 实现代理节点基本转发功能
  • 实现manage_client管理redis节点功能
  • 实现redis_client访问代理集群
  • redis节点主从复制
  • ….其他功能没想好

About

使用Rust实现的仿codis架构的redis集群


Languages

Language:Rust 100.0%