如何在不启动哨兵故障转移的情况下执行 redis FLUSHALL?

How to do a redis FLUSHALL without initiating a sentinel failover?

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

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

sentinel down-after-milliseconds OurMasterName 5000

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

我们承认执行 FLUSHALL 并不好,我们也知道我们可以将 down-after-ms 增加到,但出于这个问题的目的,假设这些都不是选项。

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

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

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

出于好奇,如果您只是一直刷新并且不关心数据,因为您将擦除数据,为什么还要使用 sentinel?

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

进行一些自动化