【问题标题】:Redis + “source of truth” DB consistencyRedis +“真相之源”数据库一致性
【发布时间】:2016-08-16 23:05:09
【问题描述】:

我正在构建一个分析工具,但在基于时间序列的指标方面遇到了一些性能问题。我一直在尝试使用 Redis + bitmapist,这使我能够在数据库写入时急切地准备指标,并且对性能非常满意。

但是,我对如何确保我的数据库和 Redis 保持同步感到有些困惑。我的数据库是存储所有事件数据的“真实来源”,但用户仪表板将依赖 Redis 来显示指标。

我是否应该定期重新构建我的 Redis 指标以确保我的数据库和 Redis 之间没有差异? (如:事件发生时,写入DB,写入Redis失败)

如果我的 Redis 服务器出现故障,重新处理所有事件并重建指标将需要很长时间。即使特定指标的数据库查询逻辑与 Redis 查询逻辑完全不同,我的仪表板是否应该将数据库作为备份计划进行查询?

【问题讨论】:

  • 有时完全重建似乎是合理的,但仪表板到底需要多完美?
  • 这是真的,它不需要完美。我只是想尽可能减少不准确的机会。
  • Redis 具有数据持久性(默认开启),因此无需担心完全重建,只需担心增量;)

标签: database database-design redis


【解决方案1】:

本质上你在这里指的是保持缓存一致性的问题。

首先,您需要确定仪表板的陈旧程度。一旦你有了它,就用它作为你的限制,并为存储在 Redis 中的数据设置一个过期时间。请注意,您如何做到这一点与您选择在 Redis 中存储结果的方式紧密相关。

接下来让您的仪表板执行“获取或存储”序列。这意味着您首先查询 Redis 设置以获取数据,如果找到,则显示它。如果未找到,则查询源数据库,将结果存储在 Redis 中,设置适当的过期时间并显示它。对于重新启动或重新启动缓存预热,让 Redis 持久保存到磁盘(默认情况下会这样做),并且您不会在重新启动时丢失条目 - 当然过期的条目除外。

此过程将最大限度地降低数据过时的风险,同时根据请求提供数据的直接更新。另一种选择是将存储在原始数据库中的事件也存储在 Redis 中。但是,该选项将意味着完全复制数据,而不是仅保留 Redis 仪表板中的“热”或选择项以提高仪表板性能。

【讨论】:

  • 至少应该有能力从你的真实来源“水合”缓存。我也是设置过期时间的坚定支持者(您必须在每次更新时都这样做),因为未使用的数据不会浪费昂贵的内存。如果过去的更新失败,您还可以考虑强制删除密钥。然后在下一次请求数据时,正确的集合将被放入缓存中。
【解决方案2】:

应使用可靠的服务总线在 Redis 上写入,以便可以根据需要重试多次以执行写入:

这样,您的系统将更加可靠,因为消息队列或服务总线可以提供设置来定义消息可以不成功地出列 1、2 或 1K 次。如果由于 Redis 宕机而将指标写入 Redis 失败,则没有问题:异步进程将尝试再次写入 Redis,依此类推。

您的 Redis 数据库可能会在几秒钟、几分钟甚至一小时内保持不同步,但您知道,一旦临时问题得到解决,您的系统就会尝试恢复其正常状态。

另一方面,从 Redis 3.0 开始,您就有了 Redis Cluster,这是 Redis 的内置分片方法。也就是说,您可以将数据分区到两个或多个 Redis 服务器中。这对于避免单台服务器停机可能影响对您客户的整个服务非常重要。

另外,Redis 有数据persistency to disk

我相信我已经提供了足够多的提示和工具来实现您应该能够可靠地同步您的最终存储与基于 Redis 的 fast 存储。

【讨论】:

  • 服务总线和集群都与这个问题无关。
  • @TheRealBill 这是你的意思,不是我的。这与这个问题有很大关系,因为 OP 希望确保两个数据库是同步的,并且服务总线可以提供一种在 Redis 上重试写入以避免数据丢失的好方法。
  • @TheRealBill 我已经增强了我的答案,以反映我使用集群和服务总线的意思。我不会仅仅因为我不了解其背后的背景而对答案投反对票。我只是想了解更多信息.....
  • 它没有解决所提出的问题,而是您决定回答的问题。集群与问题无关,因为它与缓存一致性无关,并且不提供与问题相关的 HA。服务总线也不会专门提供一致性。我明白你说的,但它并没有解决这个问题。同步不会因为服务总线而发生,而是因为您编写代码来完成工作。提倡只通过服务总线写入 Redis 并不能解决问题或回答问题,而只是推动其他技术堆栈。
  • OP 确实征求了有关如何减轻缓存写入错误的建议。持久的排队机制是解决这个问题的方法。但在分析平台的情况下,重试队列可能会导致更新延迟,如果乱序更新出现问题,可能会导致数据损坏。这是需要考虑的事情。
猜你喜欢
  • 2012-09-21
  • 2019-10-21
  • 2010-10-10
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
相关资源
最近更新 更多