问题描述
我想将独立的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副本,并要求客户端从该副本读取。
一旦写入完成,并且您想将节点切换为只读,则有几种方法可以做到这一点:
- 修改redis.conf以使其具有“ min-replicas-to-write 3”。由于您没有3个副本,因此您的节点将停止接受写操作,但将继续提供读操作,如下所示:
但是,请注意,在修改redis.conf之后,必须重新启动redis节点才能使更改生效。
- 另一种方法是,当您想切换到只读模式时,此时您将创建一个副本,并使其与主节点同步,然后终止主节点。然后副本将以只读形式存在。