你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
排查 Azure 托管 Redis 中的数据丢失问题(预览版)
本文讨论如何诊断 Azure 托管 Redis(预览版)中可能实际发生的或觉察到的数据丢失问题。
注意
本指南中的多个故障排除步骤包括了运行 Redis 命令和监视各种性能指标的说明。 有关详细信息和说明,请参阅其他信息部分的文章。
密钥部分丢失
将密钥存储在内存中后,Azure 托管 Redis 不会随机删除密钥。 但是,在响应“过期”、“逐出”策略以及显式密钥删除命令时,它确实会删除密钥。 可以通过 CLI 运行这些命令。
已写入 Azure 托管 Redis 实例中主节点的密钥可能无法立即在副本上使用。 数据将以异步的非阻塞方式从主节点复制到副本。
如果你发现密钥在缓存中消失,请查看以下可能原因:
原因 | 说明 |
---|---|
密钥过期 | 密钥因设置了超时而被删除。 |
密钥逐出 | 在内存压力较大的情况下删除了密钥。 |
删除密钥 | 显式删除命令删除了密钥。 |
异步复制 | 由于数据复制延迟,密钥未提供到副本中。 |
密钥到期时间
如果为密钥分配了超时,而该期限已过,则 Azure 托管 Redis 会自动删除该密钥。 有关 Redis 密钥过期的详细信息,请参阅 EXPIRE 命令文档。 还可以使用 SET、SETEX、GETSET 和其他 *STORE 命令来设置超时值。
若要获取有关已过期密钥数的统计信息,请使用 INFO 命令。 Stats
部分显示已过期密钥的总数。 Keyspace
部分提供有关设置了超时的密钥数以及平均超时值的详细信息。
# Stats
expired_keys:46583
# Keyspace
db0:keys=3450,expires=2,avg_ttl=91861015336
此外,可以查看缓存的诊断指标,以了解密钥丢失的时间与已过期密钥的高峰之间是否存在某种关联。 有关如何使用 keyspace
通知或 MONITOR
来调试此类问题的信息,请参阅调试 Redis 密钥空间缺失附录。
密钥逐出
Azure 托管 Redis 需要使用内存空间来存储数据。 在必要时,它将清除密钥以释放可用内存。 如果 INFO 命令中的 used_memory 或 used_memory_rss 值即将达到配置的 maxmemory 设置,Azure 托管 Redis 将会根据缓存策略从内存中开始逐出密钥。
可以使用 INFO 命令来监视逐出的密钥数:
# Stats
evicted_keys:13224
此外,还可以查看缓存的诊断指标,以了解密钥丢失的时间与已逐出密钥的高峰之间是否存在某种关联。 有关如何使用密钥空间通知或 MONITOR 调试此类问题的信息,请参阅调试 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.io 网站概括性地介绍了 Redis 数据复制的工作原理。 如果客户端频繁写入 Redis,可能会发生部分数据丢失,因为在这种情况下无法保证此复制会即时完成。 例如,如果在客户端向主节点写入密钥之后、后台进程有机会将此密钥发送到副本之前主节点关闭,那么,在副本接管为新的主节点时,密钥就会丢失。
密钥严重丢失或完全丢失
如果大部分或所有密钥在缓存中消失,请查看以下可能原因:
原因 | 说明 |
---|---|
密钥刷新 | 已手动清除密钥。 |
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 数据持久性和异地复制来改善数据保护,防范此类基础结构故障。
其他信息
这些文章提供了有关如何避免数据丢失的详细信息: