【问题标题】:How to do a redis FLUSHALL without initiating a sentinel failover?如何在不启动哨兵故障转移的情况下执行 redis FLUSHALL?
【发布时间】:2016-01-06 12:45:24
【问题描述】:

我们有一个带有两个 redis 服务器的 redis 配置。我们还有 3 个哨兵来监控这两个实例并在需要时启动故障转移。

我们目前有一个流程,我们必须定期在 redis 服务器上执行 FLUSHALL。这是一个阻塞操作,比我们为哨兵分配的超时时间要长。换句话说,我们的哨兵配置是:

sentinel down-after-milliseconds OurMasterName 5000

在服务器上执行 redis-cli FLUSHALL 需要 > 5000 毫秒,因此哨兵启动故障转移。

我们承认执行 FLUSHALL 不是很好,我们也知道我们可以将毫秒后下降时间增加到但出于本问题的目的,假设这些都不是选项。

问题是:我们如何在 FLUSHALL 阻塞超过 5000 毫秒而不让哨兵启动故障转移的情况下执行 FLUSHALL(或等效操作)?有没有人遇到并解决过这个问题?

【问题讨论】:

  • 如果您在某个云平台上,您可以创建一个新实例:准备好机器映像或使用一些 devops 工具
  • @LiviuCostea 我认为这可能是正确的选择。如果您可以参考更详细地描述其工作原理的内容,我将很乐意接受您的回答。
  • 如果您使用的是 AWS 或 Azure 之类的东西,那么您有用于创建新 Redis 集群的 API。启动它,用数据加载它,一旦准备好,只需修改 DNS,再次使用 API 调用 - 所以所有这些都可以由应用程序的某些部分处理。但是在本地,事情可能会变得更加复杂,因为它需要使用 ansible/chef/puppet 进行一些自动化。
  • @LiviuCostea 是的——仍然是一个合法的答案。如果你把这个放在答案表格中,我可以接受。

标签: redis sentinel redis-sentinel


【解决方案1】:

您当前必须做的下一个最佳选择是批量删除密钥以将工作量减少到一次。你可以建立一个列表,假设你没有,使用scan 然后删除任何适合你的批量大小。

编辑:由于您对保留数据不感兴趣,请禁用持久性,删除 RDB 文件,然后重新启动实例。这样,您不必像使用配置新主机时那样更新哨兵。

出于好奇,如果您只是一直在刷新并且不关心数据,因为您将擦除它,为什么还要打扰哨兵?

【讨论】:

  • 我认为这里的问题是它不能保证一致性。在这种情况下,我们最好将超时时间增加到 > 5000 毫秒(我们实际上已经这样做了 - 并暂时解决了我们的问题 - 但不是真正可接受的解决方案)。
【解决方案2】:

您可以只创建新实例:如果您使用的是 AWS 或 Azure 之类的东西,那么您就可以使用 API 来创建新的 Redis 集群。启动它,用数据加载它,一旦准备好,只需修改 DNS,再次使用 API 调用 - 所以所有这些都可以由应用程序的某些部分处理。但是在本地,事情可能会变得更加复杂,因为它需要使用 ansible/chef/puppet 进行一些自动化。

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2018-07-12
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多