Compartilhar via

排查 Azure 托管 Redis 中的数据丢失问题

本文介绍如何诊断Azure托管 Redis 中可能发生的实际或感知数据丢失。

注释

本指南中的一些故障排除步骤包括有关运行 Redis 命令和监视性能指标的说明。 有关详细信息,请参阅 相关内容中的文章。

密钥部分丢失

Azure托管 Redis 在将密钥存储在内存中后不会随机删除密钥。 它因过期策略、逐出策略或显式密钥删除命令而删除密钥。 使用 CLI 运行这些命令。 写入到Azure托管 Redis 实例中主节点的密钥可能无法立即在副本上使用。 数据以异步和非阻塞方式从主节点复制到副本。

如果密钥从缓存中消失,请检查以下可能的原因:

原因 DESCRIPTION
密钥过期 由于设置了超时,因此会删除密钥。
密钥清除 内存不足时会删除键。
删除密钥 客户端通过运行显式删除命令删除密钥。
异步复制 由于数据复制延迟,密钥在副本上不可用。

密钥到期时间

Azure托管 Redis 会在该密钥的超时通过时自动删除密钥。 有关 Redis 密钥过期的详细信息,请参阅 EXPIRE 命令文档。 还可以使用 SETSETEXGETSET 和其他 *STORE 命令设置超时值。

若要查看密钥过期次数,请使用 INFO 命令。 Stats 部分显示已过期密钥的总数。 本 Keyspace 部分提供有关涉及超时的密钥的数量和平均超时值的更多信息。


# Stats

expired_keys:46583

# Keyspace

db0:keys=3450,expires=2,avg_ttl=91861015336

检查缓存的诊断指标,查看密钥丢失时间与逐出密钥峰值之间是否存在关联。

密钥逐出

Azure托管 Redis 需要内存空间来存储数据。 它会删除键以在需要时释放内存。 当 used_memoryused_memory_rss 值在 INFO 命令接近配置的 maxmemory 设置时, Azure托管 Redis 开始根据 cache 策略从内存中逐出密钥。

使用 INFO 命令监视逐出密钥的数量:

# Stats

evicted_keys:13224

密钥删除

Redis 客户端运行 DELHDEL 命令,以从Azure托管 Redis 中删除密钥。 使用 INFO 命令跟踪删除作的数量。 如果 DELHDEL 命令已运行,则会在 Commandstats 部分中列出它们。

# Commandstats

cmdstat_del:calls=2,usec=90,usec_per_call=45.00

cmdstat_hdel:calls=1,usec=47,usec_per_call=47.00

异步复制

在Azure托管 Redis 中启用高可用性时,该服务将创建一个主节点和至少一个副本。 系统使用后台进程以异步方式将数据从主副本复制到副本。 有关更多详细信息,请参阅 Redis 复制文档

由于复制不是即时的,因此,如果客户端频繁写入 Redis,则可能会遇到部分数据丢失。 例如,如果主节点在客户端写入密钥后失败,但在后台进程复制密钥之前,当副本变为新主节点时,密钥将丢失。

密钥严重丢失或完全丢失

如果缓存中大多数或所有密钥都消失,请检查以下可能的原因:

原因 DESCRIPTION
密钥清除 有人手动清除了密钥。
Redis 实例故障 Redis 服务器不可用。

密钥刷新

客户端可以调用 FLUSHDBFLUSHALL 命令,以从 Redis 实例中删除所有密钥。 若要检查密钥是否已刷新,请使用 INFO 命令。 此 Commandstats 部分显示任一 FLUSH 命令是否运行:

# Commandstats

cmdstat_flushall:calls=2,usec=112,usec_per_call=56.00

cmdstat_flushdb:calls=1,usec=110,usec_per_call=52.00

Redis 实例故障

Redis 是内存中数据存储。 数据保留在托管 Redis 缓存的物理或虚拟机(VM)上。 Azure托管 Redis 缓存在默认情况下提供区域复原缓存,可针对数据丢失提供高复原能力。 当此缓存中的主分片失败时,副本分片会自动接管来提供数据。 这些 VM 位于单独的域中进行故障和更新,从而最大程度地减少两个 VM 同时变得不可用的可能性。 如果发生重大数据中心中断,虚拟机可能会一起宕机。 在这些极少数情况下,会丢失数据。

使用 Redis 数据持久性异地复制 更好地保护数据免受这些基础结构故障的影响。