【问题标题】:Propagating data from Redis slave to a SQL database将数据从 Redis 从站传播到 SQL 数据库
【发布时间】:2024-01-11 08:46:01
【问题描述】:

我使用Redis 来存储简单的键值对;其中,值也是string 类型。在我的 Redis 集群中,我有一个主服务器和两个从服务器。我想将对数据的任何更改从其中一个从属设备传播到任何其他存储(实际上是 oracle 数据库)。我怎样才能可靠地做到这一点? sink 数据库只需要最终一致。允许延迟。

我能想到的策略:

a) 读取从机写入的 AOF 文件并传播更改。 (需要解析 AOF 文件并收到文件每次更改的通知。)

b) 使用rpoplpush。提供的可靠队列模式。但是,当从主节点收到一些设置事件时,如何让从节点插入到该队列中?

还有其他可能吗?

【问题讨论】:

    标签: redis message-queue event-propagation


    【解决方案1】:

    这是 Redis 开发人员面临的一个非常普遍的问题。简而言之,事实是:

    • 想知道最后的所有变化
    • 保持此更改数据的原子性

    我相信任何一种或另一种方式的决定都将围绕这些问题。所以,是的,在这种情况下,AOF 是最好的选择之一,但这里没有任何可用于生产的工具。是的,在一台服务器的情况下这不是非常复杂的解决方案,但是使用主/从或集群可能会非常复杂。

    使用键空间通知

    看起来像Keyspace Notifications 功能可能是替代品。 Keyspace 通知是自 2.8.0 起提供的功能,并且在 Redis 集群中也可用。来自原始文档:

    Keyspace 通知允许客户端订阅 Pub/Sub 频道,以便接收以某种方式影响 Redis 数据集的事件。可能接收的事件示例如下:

    1. 影响给定键的所有命令。
    2. 接收 LPUSH 操作的所有键。
    3. 数据库 0 中的所有密钥都将过期。

    使用 Redis 的普通 Pub/Sub 层传递事件,因此实现 Pub/Sub 的客户端无需修改即可使用此功能。

    因为 Redis Pub/Sub 一劳永逸如果您的应用程序需要可靠的事件通知,即如果您的 Pub /Sub 客户端断开连接并稍后重新连接,在客户端断开连接期间传递的所有事件都将丢失。这可以通过复制服务于此 Pub/Sub 频道的员工来改进:

    1. N 个工作人员组订阅通知并将数据放入基于 SET 的“同步”列表。这允许我们控制开销并且不会将相同的数据写入我们的同步列表。
    2. 另一组工人用 SPOP 弹出记录并将其写入其他存储。

    使用手动更新列表

    另一种方法是在每次写入操作时使用特殊的“同步”基于 SET 的列表(据我所知,在您的情况下是 SET/HSET)。比如:

    MULTI
    SET myKey value
    SADD myKey
    EXEC
    

    每次修改密钥时,都会将密钥名称添加到 SET。因此,在其他进程或工作人员中,您可以 SPOP 该键、读取值和更新源。

    除了 SPOP 之外,您还可以在某种 in progress 列表中使用 RPOPLPUSH/LPOPRPUSH 来保护您的密钥在工作人员失败时会丢失。在这种情况下,每个工作人员首先从同步集 RPOPLPUSH/LPOPRPUSH 到 in progress set,将数据推送到存储并从 in progress 集中删除密钥。

    【讨论】:

    • > 因此,在其他进程或工作人员中,您可以 SPOP 该键、读取值和更新源。您确实需要确保该工作人员确实成功完成,否则您将丢失SPOPed 密钥...另一种方法是将LPOPRPUSH 放到另一个列表中,例如inprocess,并为死去的工人投票。
    最近更新 更多