将数据从 Redis 从站传播到 SQL 数据库

Propagating data from Redis slave to a SQL database

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

我能想到的策略:

a) 读取slave机器写入的AOF文件并传播变化。 (需要解析 AOF 文件并获得文件每次更改的通知。)

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

还有其他可能吗?

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

  • 想知道自上次以来的所有变化
  • 保持此更改数据的原子性

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

使用键空间通知

看起来像 Keyspace Notifications 功能可能是替代的。 Keyspace notifications 是自 2.8.0 以来可用的功能,在 Redis 集群中也可用。来自原始文档:

Keyspace notifications allows clients to subscribe to Pub/Sub channels in order to receive events affecting the Redis data set in some way.Examples of the events that is possible to receive are the following:

  1. All the commands affecting a given key.
  2. All the keys receiving an LPUSH operation.
  3. All the keys expiring in the database 0.

Events are delivered using the normal Pub/Sub layer of Redis, so clients implementing Pub/Sub are able to use this feature without modifications.

因为 Redis Pub/Sub 是 fire and forget 如果您的应用程序要求可靠,目前无法使用此功能事件通知,也就是说,如果您的 Pub/Sub 客户端断开连接并稍后重新连接,则客户端断开连接期间传送的所有事件都会丢失。这可以通过复制服务于此 Pub/Sub 频道的员工来改善:

  1. N 个工作组订阅通知并将数据放入基于 SET 的 "sync" 列表。这允许我们控制开销并且不会将相同的数据写入我们的同步列表。
  2. 另一组worker用SPOP pop record写入其他store。

使用手动更新列表

另一种方法是在每个写操作中使用特殊的 "sync" 基于 SET 的列表(据我所知,在你的情况下是 SET/HSET)。类似于:

MULTI
SET myKey value
SADD myKey
EXEC

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

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