视频

了解更多
RedisRaft (正在开发中) 是适用于开源 Redis 的一项新模块,它使您能够以单个容错、强一致性集群的形式运行多台 Redis 服务器。顾名思义,它基于 Raft 共识算法 和一个 实现它的开源 C 库。
RedisRaft 为 Redis 和 Redis 生态系统带来了新的 带有严格序列化的高一致性 部署选项。借助此新模块,您可以在超出缓存场景(需要高级别的可靠性和一致性)中使用 Redis 及其现有的客户端、库和数据类型。
在 Redis 5 发布前不久,RedisRaft 开始作为一项实验性的“分支项目”。Redis 模块 API 在 Redis 4 中引入,其主要设计用于支持实现新数据类型和命令的模块。我们希望探索我们能够对 API 做出哪些改进,并用模块的方式以更为激进的方式扩展 Redis。但是,我们还希望最终获得一些有用的成果——Redis 的强一致性部署选项。
RedisRaft 集群提供了与 ZooKeeper 或 Etcd 等可靠知名数据存储所期望的相同级别的一致性和可靠性。总而言之,在 RedisRaft 中
与提供此一致性级别的可靠数据存储所期望的一样,此类保证也会影响性能和可用性。在 RedisRaft 中
一旦 RedisRaft 模块加载到 Redis 中,它就会接管集群节点之间的通信、Raft 日志或快照的复制、持久性等等。Redis 核心对此并不知情,而且它单单作为一个独立的服务器在运行,没有任何集群、持久性或复制。
设置一个三节点 RedisRaft 集群就像启动三个 Redis 服务器一样简单,如下所示
redis-server --loadmodule /path/to/redisraft.so
以下是如何连接到第一台服务器和创建 Raft 集群
10.0.0.1:6379> RAFT.CLUSTER INIT
确定 989645460313dd2ddb051f033c791222
然后,您连接至另外两台服务器,并将它们加入集群
10.0.0.2:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
确定
10.0.0.3:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
确定
设置 Redis Raft 后,我们可以将数据写入集群
10.0.0.1:6379> INCR counter:1
(整型) 1
收到回复表明,我们的写入至少已经复制到集群节点的大多数(在我们的案例中为 2 个节点)并已提交至其持久存储。
Raft 基于强领导者概念,这意味着所有客户端操作都应转到领导者节点并从中发起。在这种情况下,我们的客户端确实连接到领导者,但集群领导是动态的,并且客户端不一定知道谁是领导者。
尝试在跟随者(非领导者)节点上执行相同操作会创建此回复
10.0.0.3:6379> INCR counter:1
(错误) MOVED 10.0.0.1:6379
因此,作为客户端,我们现在可以捕获此错误,按照指定重新建立与领导者节点的连接并重试我们的命令。
但是,如果我们不想修改现有应用程序呢?幸运的是,Redis Raft 还可以配置为自动处理此问题。启用跟随者代理模式后,我们可以让集群节点自动将我们的请求转发到领导者并在收到回复时提供回复:
10.0.0.3:6379> RAFT.CONFIG SET follower-proxy yes
确定
10.0.0.3:6379> INCR counter:1
(整型) 2
当然,这简单得多,但会影响延迟和网络负载,因为连接到非领导者节点会创建额外的网络跃点。
设置集群时,我们实际执行了三个不同的操作
Redis Raft 集群配置不是静态的,并且可以在创建集群后和活动时添加或移除其他节点。
例如,我们可能需要替换我们的第三个节点。首先,我们加入一个将替换它的新节点。请注意,我们“先添加后移除”而不是“先移除后添加”,以免在转换过程中集群和我们宝贵的数据处于降级冗余状态
10.0.0.4:6379> RAFT.CLUSTER JOIN 10.0.0.1:6379
确定
接下来,我们查找随机分配给我们的第三个节点的 ID
redis-cli -h 10.0.0.1 --raw RAFT.INFO | grep 10.0.0.3
node2:id=1739451728,state=connected,voting=yes,addr=10.0.0.3,port=6379,
last_conn_secs=3537,conn_errors=0,conn_oks=1
然后移除它
10.0.0.1:6379> RAFT.NODE REMOVE 1739451728
确定
作为 RedisRaft 开发工作的一部分,我们一直与 Kyle Kingsbury(又名Aphyr)合作,以分析和测试 RedisRaft,使用Jepsen,一个用于测试分布式系统安全性及正确性的知名框架。迄今为止,此合作关系已促成此已发布分析中的结果。
虽然仍在开发中,但 RedisRaft 的大多数基本功能已到位。我们目前正在致力于第一个预览版本,预计几个月后可供使用。RedisRaft 的最终版本将以双重许可证发布,即 GNU AGPLv3 或 Redis 源代码可用许可证 (RSAL)。