【问题标题】:Making redis durable with a slave redis queue使用从属 redis 队列使 redis 持久化
【发布时间】:2021-08-21 14:30:19
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

    标签: redis queue fault-tolerance durability


    【解决方案1】:

    这可能吗?

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

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

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

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

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

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

    【讨论】:

    • “但是,您仍然可能会丢失数据。因为从服务器可能在将数据保存到磁盘之前也已关闭。”。您是说主从都可能在 fsync 在两者上成功之前都关闭了吗?我想知道......如果我有更多的奴隶来进一步缓解这个问题,我可以等待他们所有人接受写入吗?可以使用 WAIT 吗?
    • YES,因为 fsync 是异步的。当然,你可以有更多的奴隶来缓解这个问题,但性能可能会很差。在将 HTTP 200 返回给客户端之前,您可能会等待很长时间。
    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2017-07-15
    • 2023-03-21
    相关资源
    最近更新 更多