将数据从 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:
- All the commands affecting a given key.
- All the keys receiving an LPUSH operation.
- 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 频道的员工来改善:
- N 个工作组订阅通知并将数据放入基于 SET 的 "sync" 列表。这允许我们控制开销并且不会将相同的数据写入我们的同步列表。
- 另一组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
设置中删除密钥。
我正在使用 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:
- All the commands affecting a given key.
- All the keys receiving an LPUSH operation.
- 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 频道的员工来改善:
- N 个工作组订阅通知并将数据放入基于 SET 的 "sync" 列表。这允许我们控制开销并且不会将相同的数据写入我们的同步列表。
- 另一组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
设置中删除密钥。