本文說明如何診斷 Azure 受控 Redis 中可能發生的實際或感知資料遺失。
備註
本指南中的一些疑難排解步驟包括執行 Redis 命令和監控效能指標的指示。 如需詳細資訊,請參閱 相關內容中的文章。
遺失部分金鑰
Azure 受控 Redis 不會在將金鑰儲存在記憶體中之後隨機刪除金鑰。 它會因為到期原則、收回原則或明確的金鑰刪除命令而移除金鑰。 使用 CLI 執行這些命令。 寫入 Azure 受控 Redis 執行個體中主要節點的金鑰可能無法立即在複本上使用。 資料會以非同步的方式從主要伺服器複寫到複本,且以非封鎖的模式進行。
如果金鑰從快取中消失,請檢查下列可能的原因:
| 原因 | 說明 |
|---|---|
| 金鑰到期日 | 由於在金鑰上設定了超時,因此會移除金鑰。 |
| 金鑰收回 | 當記憶體不足時,會移除金鑰。 |
| 金鑰刪除 | 用戶端會執行明確的刪除命令來移除金鑰。 |
| 非同步複寫 | 由於資料複寫延遲,複本上無法使用金鑰。 |
金鑰到期日
Azure Managed 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 Managed 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,您可能會遇到部分資料遺失。 例如,如果主要節點在用戶端寫入金鑰之後失敗,但在背景處理程序抄寫金鑰之前,則當複本成為新的主要金鑰時,金鑰就會遺失。
主要或完全遺失金鑰
如果大部分或所有鍵從快取中消失,請檢查以下可能原因:
| 原因 | 說明 |
|---|---|
| 金鑰排清 | 有人手動清除了按鍵。 |
| Redis 執行個體失敗 | Redis 伺服器無法使用。 |
金鑰排清
用戶端可以呼叫 FLUSHDB 或 FLUSHALL 命令,從 Redis 執行個體中移除所有金鑰。 若要檢查金鑰是否已排清,請使用 INFO 指令。 如果任一 FLUSH 命令執行,該 Commandstats 區段會顯示結果。
# 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 位於不同的網域中,用於容錯和更新,可將兩者同時無法使用的可能性降到最低。 如果發生重大資料中心中斷,虛擬機器仍可能一起關閉。 在這些極少數情況下,您會遺失資料。
使用 Redis 資料持續性和異地複寫,以更妥善地保護您的資料免於這些基礎結構失敗。