我们有一个Redis集群(3个主节点,3个从节点),并且在一个主节点(和相关的从节点)上看到大量的密钥,这些密钥看起来是空的,不能被删除。
如果我连接到具有大量条目(由DBSIZE确定)的主节点,我可以扫描并看到键:
--> redis-cli -h 192.168.100.81 -p 6381
192.168.100.81:6381> scan 0 match mykey-* count 10
1) "2359296"
2) 1) "mykey-1be333a7"
2) "mykey-e85a9d31"
3) "mykey-d9162eff"
4) "mykey-41d12fd8"
5) "mykey-a6e755d3"
6) "mykey-c2aa1eaa"
7) "mykey-c0597cac"
8) "mykey-10e69376"
9) "mykey-7263aef0"
10) "mykey-7fa9de50"但是,如果我尝试获取键的值,它将显示它已移动:
192.168.100.81:6381> get mykey-1be333a7
(error) MOVED 8301 192.168.3.107:6380如果连接到键移动到的节点,则无法获得或执行以下值:
--> redis-cli -h 192.168.3.107 -p 6380
192.168.3.107:6380> get mykey-1be333a7
(nil)
192.168.3.107:6380> del mykey-1be333a7
(integer) 0我也无法使用redis-cli的集群(-c)标志获取或执行该值:
--> redis-cli -h 192.168.100.81 -p 6381 -c get mykey-1be333a7
(nil)
--> redis-cli -h 192.168.100.81 -p 6381 -c del mykey-1be333a7
(integer) 0
--> redis-cli -h 192.168.3.107 -p 6380 -c get mykey-1be333a7
(nil)
--> redis-cli -h 192.168.3.107 -p 6380 -c del mykey-1be333a7
(integer) 0我能做些什么来移除这些类型的钥匙?
发布于 2021-10-27 00:46:20
有趣的问题!
如何重现这个问题
下面的场景将重现您的问题:
您可以创建一个独立的Redis实例,并在其中设置一些数据。但是,有一天,您将此独立的Redis配置为Redis群集的成员,而无需刷新旧数据或将旧数据移动到集群的正确节点。让我们将这些数据称为脏数据。
在此场景中,您可以扫描此实例上的所有键,包括脏数据。但是,您不能读取或写入这些脏数据,因为您的Redis处于群集模式,因此它会将您的请求重定向到没有此类数据的正确节点。
如何解决这个问题
为了删除这些脏数据,应该将Redis实例重新配置为独立模式,即启用集群的no,并以独立模式删除脏数据。
然后,您可以让它再次加入集群。
https://stackoverflow.com/questions/69726157
复制相似问题