本文介绍如何诊断 Azure Redis 缓存中发生的 部分 或 完整的 数据丢失。
Azure Redis 缓存在内存中存储密钥后不会随机删除密钥,但它会删除密钥以响应过期策略、逐出策略和显式密钥删除命令。 可以在 控制台 或 Redis CLI 上运行这些命令。
在高级或标准 Azure Redis 实例中写入主节点的密钥可能无法立即在副本上使用。 数据以异步和非阻止方式从主副本复制到副本。
如果某些密钥从缓存中消失,请检查以下可能的原因:
如果为密钥分配了超时且该时间段通过,Azure Redis 缓存会自动删除密钥。 有关 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 缓存需要内存空间来存储数据和清除密钥,以在必要时释放可用内存。 当used_memory
或used_memory_rss
值接近配置的maxmemory
设置时,Azure Redis 会基于缓存策略开始从内存中清除密钥。
可以使用 INFO 命令监视逐出密钥的数量。
# Stats
evicted_keys:13224
Redis 客户端可以发出 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 复制 介绍了 Redis 数据复制的一般工作原理。 对于客户端频繁写入 Redis 的情况,可能会发生部分数据丢失,因为复制并非设计为即时复制。
例如,如果主副本在客户端向其写入密钥后出现故障,但在后台进程有机会将该密钥发送到副本之前,当副本接管为新主副本时,密钥将丢失。
如果缓存中大多数或所有密钥都消失,请检查以下可能的原因:
原因 | 说明 |
---|---|
密钥清除 | 密钥已手动清除。 |
选择了错误的数据库 | Azure Redis 设置为使用非默认数据库。 |
Redis 实例故障 | Redis 服务器不可用。 |
Azure 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
每个数据库都是一个在逻辑上独立的单元,其中保存了不同的数据集。 Azure Cache for Redis 默认使用 db0
数据库。 如果切换到另一个数据库(例如 db1
并尝试从该数据库读取密钥),则 Azure Redis 找不到它们。 使用 Redis SELECT 命令查找其他可用数据库中的密钥。
Redis 将数据保留在托管 Redis 缓存的物理或虚拟机(VM)上的内存中。 基本层 Azure Redis 缓存实例仅在单个虚拟机(VM)上运行。 如果该 VM 出现故障,则缓存中存储的所有数据都将丢失。
标准层和高级层中的缓存通过在复制配置中使用两个 VM,增强了对数据丢失的抗损能力。 当此类缓存中的主节点发生故障时,副本节点将会接管工作并自动提供数据。
这些 VM 位于用于故障和更新的单独域名中,以最大程度地减少两个 VM 同时不可用的可能性。 但是,如果发生重大数据中心中断,则这两个 VM 可能会出现故障。 在这些极少数情况下,数据会丢失。 请考虑使用 数据持久性 和 异地复制 来改善针对基础结构故障的数据保护。