共用方式為


針對 Azure Managed Redis 中的資料遺失問題進行疑難排解

本文說明如何診斷 Azure 受控 Redis 中可能發生的實際或感知資料遺失。

備註

本指南中的一些疑難排解步驟包括執行 Redis 命令和監控效能指標的指示。 如需詳細資訊,請參閱 相關內容中的文章。

遺失部分金鑰

Azure 受控 Redis 不會在將金鑰儲存在記憶體中之後隨機刪除金鑰。 它會因為到期原則、收回原則或明確的金鑰刪除命令而移除金鑰。 使用 CLI 執行這些命令。 寫入 Azure 受控 Redis 執行個體中主要節點的金鑰可能無法立即在複本上使用。 資料會以非同步的方式從主要伺服器複寫到複本,且以非封鎖的模式進行。

如果金鑰從快取中消失,請檢查下列可能的原因:

原因 說明
金鑰到期日 由於在金鑰上設定了超時,因此會移除金鑰。
金鑰收回 當記憶體不足時,會移除金鑰。
金鑰刪除 用戶端會執行明確的刪除命令來移除金鑰。
非同步複寫 由於資料複寫延遲,複本上無法使用金鑰。

金鑰到期日

Azure Managed Redis 會在經過金鑰逾時時間後自動移除該金鑰。 如需 Redis 金鑰到期的詳細資訊,請參閱 EXPIRE 命令文件。 您也可以使用 SETSETEX、GETSET 及其他 *STORE 指令來設定逾時值。

若要查看有多少金鑰已過期,請使用 INFO 指令。 Stats 區段會顯示到期金鑰的總數。 Keyspace 區段提供具有逾時和平均逾時值的金鑰數目相關資訊。


# Stats

expired_keys:46583

# Keyspace

db0:keys=3450,expires=2,avg_ttl=91861015336

檢查快取的診斷計量,以查看金鑰遺失的時間和收回金鑰的峰值之間是否有關聯性。

金鑰收回

Azure 受控 Redis 需要記憶體空間來儲存資料。 它會在需要時移除按鍵以釋放記憶體。 當 INFO 命令中的 used_memoryused_memory_rss 值接近設定的 maxmemory 設定時,Azure Managed Redis 會根據快取原則,開始從記憶體中收回金鑰。

使用 INFO 命令來監控被移除金鑰的數量:

# Stats

evicted_keys:13224

金鑰刪除

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 伺服器無法使用。

金鑰排清

用戶端可以呼叫 FLUSHDBFLUSHALL 命令,從 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 資料持續性和異地複寫,以更妥善地保護您的資料免於這些基礎結構失敗。