本文介绍如何诊断 Azure 托管 Redis 中可能发生的实际或感知数据丢失。
注释
本指南中的一些故障排除步骤包括有关运行 Redis 命令和监视性能指标的说明。 有关详细信息,请参阅 相关内容中的文章。
密钥部分丢失
将密钥存储在内存中后,Azure 托管 Redis 不会随机删除密钥。 它因过期策略、逐出策略或显式密钥删除命令而删除密钥。 使用 CLI 运行这些命令。 写入 Azure 托管 Redis 实例中主节点的密钥可能无法立即在副本上使用。 数据以异步和非阻塞方式从主节点复制到副本。
如果密钥从缓存中消失,请检查以下可能的原因:
原因 | DESCRIPTION |
---|---|
密钥过期 | 由于设置了超时,因此会删除密钥。 |
密钥清除 | 内存不足时会删除键。 |
删除密钥 | 客户端通过运行显式删除命令删除密钥。 |
异步复制 | 由于数据复制延迟,密钥在副本上不可用。 |
密钥到期时间
当密钥的超时通过时,Azure 托管 Redis 会自动删除密钥。 有关 Redis 密钥过期的详细信息,请参阅 EXPIRE 命令文档。 还可以使用 SET、 SETEX、 GETSET 和其他 *STORE 命令设置超时值。
若要查看密钥过期次数,请使用 INFO 命令。
Stats
部分显示已过期密钥的总数。 本 Keyspace
部分提供有关涉及超时的密钥的数量和平均超时值的更多信息。
# Stats
expired_keys:46583
# Keyspace
db0:keys=3450,expires=2,avg_ttl=91861015336
检查缓存的诊断指标,查看密钥丢失时间与逐出密钥峰值之间是否存在关联。
密钥逐出
Azure 托管 Redis 需要内存空间来存储数据。 它会删除键以在需要时释放内存。 如果 INFO 命令中的 used_memory 或 used_memory_rss 值即将达到配置的 maxmemory 设置,Azure 托管 Redis 将会根据缓存策略从内存中开始逐出密钥。
使用 INFO 命令监视逐出密钥的数量:
# Stats
evicted_keys:13224
密钥删除
Redis 客户端运行 DEL 或 HDEL 命令,从 Azure 托管 Redis 中删除密钥。 使用 INFO 命令跟踪删除作的数量。 如果 DEL 或 HDEL 命令已运行,则会在 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 服务器不可用。 |
密钥刷新
客户端可以调用 FLUSHDB 或 FLUSHALL 命令,以从 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 数据持久性 和 异地复制 更好地保护数据免受这些基础结构故障的影响。