将独立Redis标记为只读 我尝试过的事情

问题描述

我想将独立的Redis服务器(不是Redis-Cluster,不是Redis-Sentinel)标记为只读。我已经花了一段时间寻找这个问题,但似乎找不到一个明确的答案(几乎所有答案都指向“聚类”或“ Sentinel”)。我一直在寻找一些配置修改CONfig SET something)。

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

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

此外,如果不能直接从redis服务器上做到这一点,那么我可以在客户端代码中做些什么来达到相同的效果(我将redis-py用作客户端库)吗? (尽管这不理想)

我尝试过的事情

  • 玩过config set replica-read-only yes和其他配置。他们似乎没有应用当前的Redis服务器。
  • 试图将Redis服务器标记为其自身的副本(这是不合逻辑的,但只是想看看是否可行),但事实证明,它删除了本地Redis中的所有密钥,所以我无法做到。
  • li>

解决方法

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

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

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

  • 您可以为主数据库设置只读的Redis副本,并要求客户端从该副本读取。

,

一旦写入完成,并且您想将节点切换为只读,则有几种方法可以做到这一点:

  1. 修改redis.conf以使其具有“ min-replicas-to-write 3”。由于您没有3个副本,因此您的节点将停止接受写操作,但将继续提供读操作,如下所示:

enter image description here

但是,请注意,在修改redis.conf之后,必须重新启动redis节点才能使更改生效。

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