如果设置了 maxmemory,复制品是否应用驱逐策略?

上次更新时间:2024 年 3 月 22 日

问题

在驱逐策略设置为非 noeviction 值的 Redis 复制拓扑中,驱逐密钥的决定是仅基于主节点的读/写操作还是也基于从节点上的读操作?

回答

Redis OSS 复制拓扑允许对从节点执行读操作,因此此问题适用于 Redis 或 Redis 堆栈复制拓扑。Redis Enterprise 和 Redis Cloud 数据库不支持对从片进行读操作。读操作会影响密钥的最后访问时间或访问频率,这可能导致主节点和从节点驱逐的密钥不同,进而导致主节点及其从节点之间的数据不一致。

来自 文档

当主节点和从节点实例连接良好时,主节点通过向从节点发送命令流来保持从节点更新,以复制由于以下原因在主节点侧发生的数据集影响:客户端写入、密钥到期或被驱逐、任何其他更改主节点数据集的操作。

因此,驱逐和过期会复制给副本。还要注意,副本不主动因内存不足 (OOM) 条件驱逐键。

默认情况下,副本将忽略 maxmemory(除非在故障转移或手动后将其提升为主副本)。这意味着键的驱逐将由主副本处理,在主副本端驱逐键时向副本发送 DEL 命令。

你可以在主服务器上设置严格的 maxmemory 值,验证主副本如何传播命令的驱逐。

CONFIG SET maxmemory <BYTES>

然后,你可以以副本模式将 redis-cli 会话连接到主副本

redis-cli --replica
sending REPLCONF capa eof
SYNC with master, discarding 213 bytes of bulk transfer...
SYNC done. Logging commands from master.

然后在主副本上插入一些数据,直到达到 OOM 条件

SET hello world
(error) OOM command not allowed when used memory > 'maxmemory'

并从 redis-cli 验证 DEL 命令已传播。

"ping"
"ping"
"DEL","collection"
"DEL","hello"
"ping"

参考

有关驱逐机制的说明,请参阅文档