简单地说,我们现在是Redis

了解更多

介绍RedisRaft,一个新的强一致性部署选项

RedisRaft(正在开发中)是开源Redis的一个新模块,它可以将多个Redis服务器作为一个单一的容错、强一致性集群来运行。顾名思义,它是基于筏共识算法和一个开源的C库实现它。

RedisRaft带来了新的具有严格序列化的强一致性Redis和Redis生态系统的部署选项。新的模块使得Redis与Redis现有的客户端、库和数据类型在需要高可靠性和一致性的非缓存场景中使用成为可能。

RedisRaft起源的

RedisRaft是在Redis 5发布前不久作为一个实验性的“副项目”开始的。Redis模块API是在Redis 4中引入的,主要用于支持实现新的数据类型和命令的模块。我们想要探索API可以扩展到什么程度,并使用模块以更激进的方式扩展Redis。但我们也希望最终得到一些有用的东西——Redis的强大一致性部署选项。

RedisRaft集群提供了与ZooKeeper或Etcd等可靠、知名的数据存储相同级别的一致性和可靠性。简而言之,在RedisRaft中:

  • 被确认的写保证被提交并且不会丢失。
  • read总是返回最新的已提交的写。

正如提供这种级别一致性的可靠数据存储所期望的那样,这种保证带来了性能和可用性方面的权衡。在RedisRaft:

  • 客户机操作依赖于交换消息的集群节点,因此它们与网络延迟绑定在一起。
  • 写必须在完成之前刷新到磁盘,因此它们会绑定到磁盘I/O延迟。
  • 只有当大多数节点处于正常运行状态并能够相互通信时,集群才可用。

RedisRaft是如何工作的

一旦RedisRaft模块被加载到Redis中,它就会接管集群节点之间的通信、Raft日志或快照的复制、持久化等等。Redis核心还没有意识到这一点,就目前而言,它是作为一个独立的服务器运行的,没有集群、持久性或复制。

设置一个三节点的RedisRaft集群就像启动三个Redis服务器一样简单,如下所示:

/ / redisraft.so redis-server——loadmodule /路径

这是如何连接到第一个服务器和创建Raft集群:

10.0.0.1:6379 >筏。集群初始化
好989645460313 dd2ddb051f033c791222

然后连接其他两台服务器并将它们加入集群:

10.0.0.2:6379 >筏。集群加入10.0.0.1:6379
好吧
10.0.0.3:6379 >筏。集群加入10.0.0.1:6379
好吧

访问集群

一旦设置了RedisRaft,我们就可以将数据写入集群:

10.0.0.1:6379 >增加计数器:1
(整数)1

收到回复表明我们的信件已被复制到至少大多数集群节点(在我们的例子中是2个节点),并承诺它们的持久存储。

Raft基于强势领导的概念,这意味着所有客户端操作都应该进入领导节点并从它发起。在这个例子中,我们的客户确实连接到了leader,但是集群的leader是动态的,客户不一定知道leader是谁。

在follower(非leader)节点上尝试相同的操作会创建以下响应:

10.0.0.3:6379 >增加计数器:1
(错误)10.0.0.1:6379移动

因此,作为客户端,我们现在可以捕获这个错误,按照指定重新建立与leader节点的连接,并重试我们的命令。

但是,如果我们不想修改现有的应用程序呢?幸运的是,RedisRaft也可以配置为自动处理这个问题。通过启用追随者代理模式,我们可以让集群节点自动将我们的请求转发给leader,并在有时间回复:

10.0.0.3:6379 >筏。CONFIG SET follower-proxy yes
好吧
10.0.0.3:6379 >增加计数器:1
(整数)2

当然,这要简单得多,但是会影响延迟和网络负载,因为击中非前导节点会产生额外的网络跳。

集群的变化

在设置我们的集群时,我们实际上执行了三个不同的操作:

  1. 在单个节点上创建集群。
  2. 添加第二个节点。
  3. 增加第三个节点。

RedisRaft集群配置不是静态的,可以在集群创建完成并处于活动状态时添加或删除额外的节点。

例如,我们可能需要替换第三个节点。首先,我们加入一个将要替换它的新节点。注意,我们使用“add-then-remove”而不是“remove-then-add”来避免在转换期间离开集群和我们的宝贵数据处于降级冗余状态:

10.0.0.4:6379 >筏。集群加入10.0.0.1:6379
好吧

接下来,我们查找随机分配给第三个节点的ID:

redis-cli -h 10.0.0.1——raw RAFT。信息| grep 10.0.0.3
node2: id =1739451728状态=连接,投票=是的,addr = 10.0.0.3端口= 6379,
last_conn_secs = 3537, conn_errors = 0, conn_oks = 1

然后我们移除它:

10.0.0.1:6379 >筏。节点删除1739451728
好吧

RedisRaft发布状态

作为RedisRaft开发工作的一部分,我们与Kyle Kingsbury(又名Kyle Kingsbury)合作Aphyr)分析和测试RedisRaft的使用Jepsen,这是一个著名的用于测试分布式系统安全性和正确性的框架。到目前为止,这种合作已经产生了结果这发表分析

尽管RedisRaft仍处于开发阶段,但它的大部分基本功能已经就位。我们目前正在开发第一个预览版本,预计将在几个月后发布。当普遍可用时,RedisRaft将在双重许可下发布,要么是GNU AGPLv3,要么是Redis Source available license (RSAL)。

Baidu