将独立的 redis 标记为只读

Mark standalone redis as read-only

我想将独立的 Redis 服务器(不是 Redis 集群,也不是 Redis 哨兵)标记为只读。我已经为此搜索了很长一段时间,但我似乎没有找到明确的答案(几乎所有答案都指向 Clustering 或 Sentinel)。我正在寻找一些配置修改 (CONFIG SET something)。

注意:config set replica-read-only yes 不会将当前的 redis-server 设为只读,而只会将其副本设为只读。

我的用例基本上是我正在进行迁移,其中在某些时候我想将 redis-server 设置为只读。我的应用程序代码可以在写入调用发生时处理故障,所以这不是问题。

此外,如果这不能直接从 redis 服务器实现,我是否可以在客户端代码中执行一些具有相同效果的操作(我使用 redis-py 作为客户端库)? (虽然这不太理想)

我尝试过的事情

您可以尝试几种解决方案:

  • 您可以使用 rename-command 配置来禁用写入命令。如果您只想禁用少量命令,那是一个很好的解决方案。但是,由于写入命令太多,可能需要配置太多,容易漏掉一些。

  • 如果您使用的是 Redis 6.0,您可以使用 Redis ACL 禁用特定用户的写入命令。

  • 您可以为您的主服务器设置一个 read-only Redis 副本,并要求客户端从副本读取。

一旦写入完成并且您想将节点切换到 read-only,有几种方法可以做到这一点:

  1. 将 redis.conf 修改为“min-replicas-to-write 3”。由于您没有 3 个副本,因此您的节点将停止接受写入,但会继续提供读取服务,如下所示:

但是请注意,修改redis.conf后,您需要重启redis节点才能使更改生效。

  1. 另一种方法是当你想切换到只读模式时,此时你创建一个副本并让它与主节点同步,然后杀死主节点。然后副本将以只读形式存在。