0

也许我错过了一些东西,这似乎太简单了。是否可以通过让主 redis 节点将数据复制到从 redis 节点来使 redis 持久化?

我的情况是,我有一个 REST 端点,它在收到来自客户端的请求后,会将有效负载粘贴到 redis 队列中,然后向客户端返回成功(HTTP 200)。如果该队列在消息处理之前和 fsync 发生之前发生故障,我已经丢失了该有效负载并且没有人知道它。

我想知道,如果我可以简单地写入两个 redis 队列(在不同的区域中),一个是主队列,一个是从属队列。当我写入“主”时,redis 将自动在从属队列中写入相同的元素,然后端点才会向客户端返回 HTTP 200。

这可能吗?Redis 将 (i) 需要一种写入从属设备的方法,并且 (ii) 具有同步 API 或可等待 API,只有在确认有效负载已写入主服务器和从服务器时才会返回。这里的关键是redis让调用者知道slave已经收到了事件。

如果客户端没有收到 HTTP 200,他们知道应该再次尝试发送。感觉有一些我没有看到的警告。

谢谢

4

1 回答 1

0

这可能吗?

简短的回答。不,这是不可能的。

Redis 将 (i) 需要一种写入从属设备的方法

Redis 可以将数据复制到从站。但是,复制是异步的,这意味着它将在数据写入从站之前向客户端返回响应。

(ii) 有一个同步 API 或可等待的 API,只有在确认有效负载已写入主服务器和从服务器时才会返回。

从 Redis 3.0 开始,它支持WAIT命令,该命令将阻塞客户端,直到该客户端的写操作被复制到给定数量的从站。

这可能会缓解问题,至少您可以确保写入操作已复制到服务节点。但是,您仍然可能会丢失数据。因为从服务器在将数据持久化到磁盘之前也可能已关闭。

于 2021-08-22T02:01:27.290 回答