閱讀英文

共用方式為

排查 Azure Cache for Redis 中的数据丢失问题

本文介绍如何诊断 Azure Redis 缓存中发生的 部分完整的 数据丢失。

部分密钥丢失

Azure Redis 缓存在内存中存储密钥后不会随机删除密钥,但它会删除密钥以响应过期策略、逐出策略和显式密钥删除命令。 可以在 控制台Redis CLI 上运行这些命令。

在高级或标准 Azure Redis 实例中写入主节点的密钥可能无法立即在副本上使用。 数据以异步和非阻止方式从主副本复制到副本。

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

原因 说明
密钥过期 密钥因为被设置了超时而被删除。
密钥清除 在内存压力下删除了密钥。
删除密钥 密钥被显式删除命令去除。
异步复制 由于数据复制延迟,密钥在副本上不可用。

密钥到期时间

如果为密钥分配了超时且该时间段通过,Azure Redis 缓存会自动删除密钥。 有关 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值接近配置的maxmemory设置时,Azure Redis 会基于缓存策略开始从内存中清除密钥。

可以使用 INFO 命令监视逐出密钥的数量。

# Stats

evicted_keys:13224

密钥删除

Redis 客户端可以发出 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 复制 介绍了 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 将数据保留在托管 Redis 缓存的物理或虚拟机(VM)上的内存中。 基本层 Azure Redis 缓存实例仅在单个虚拟机(VM)上运行。 如果该 VM 出现故障,则缓存中存储的所有数据都将丢失。

标准层和高级层中的缓存通过在复制配置中使用两个 VM,增强了对数据丢失的抗损能力。 当此类缓存中的主节点发生故障时,副本节点将会接管工作并自动提供数据。

这些 VM 位于用于故障和更新的单独域名中,以最大程度地减少两个 VM 同时不可用的可能性。 但是,如果发生重大数据中心中断,则这两个 VM 可能会出现故障。 在这些极少数情况下,数据会丢失。 请考虑使用 数据持久性异地复制 来改善针对基础结构故障的数据保护。