恢復連線

重試命令

設定用戶端連線以指數輪詢來重試命令。 如需詳細資訊,請參閱重試指導方針

測試復原

使用重新開機來模擬修補,以測試系統在連線中斷下的復原能力。 如需有關測試效能的相關資訊,請參閱效能測試

Linux 型用戶端應用程式的 TCP 設定

在某些 Linux 版本中,預設 TCP 設定可能會導致 Redis 伺服器連線失敗時間超過 13 分鐘。 如果連線未正常關閉,預設設定可防止用戶端應用程式偵測關閉的連線,並自動還原它們。

在網路連線中斷或 Redis 伺服器離線以進行非計劃性維護的情況下,可能會發生重新建立連線失敗的情況。

建議使用這些 TCP 設定:

設定
net.ipv4.tcp_retries2 5

如需此案例的詳細資訊,請參閱在 Linux 上執行時,長達 15 分鐘不會重新建立連線。 雖然此討論與 StackExchange.Redis 程式庫有關,但 Linux 上執行的其他用戶端程式庫也會受到影響。 說明仍然有用,通用於其他程式庫。

搭配使用 ForceReconnect 與 StackExchange.Redis

在罕見情況下,StackExchange.Redis 在連線中斷之後無法重新連線。 在這些情況下,重新啟動用戶端或建立新的 ConnectionMultiplexer 可解決問題。 建議您使用單一 ConnectionMultiplexer 模式,同時允許應用程式定期強制重新連線。 看一下與應用程式使用的架構和平台最相符的快速入門範例專案。 您可以在我們的快速入門中看到此程式碼模式的範例。

ConnectionMultiplexer 的使用者必須處理因處置舊錯誤而可能發生的任何 ObjectDisposedException 錯誤。

RedisConnectionExceptionsRedisSocketExceptions 呼叫 ForceReconnectAsync()。 您也可以對RedisTimeoutExceptions 呼叫 ForceReconnectAsync(),但僅限於使用寬裕的 ReconnectMinIntervalReconnectErrorThreshold 時。 否則,在因為已超載而逾時的伺服器上,建立新的連線可能導致連鎖失敗。

設定適當的逾時

關於連線復原,必須考慮兩個逾時值:連線逾時命令逾時

連接逾時

connect timeout 是用戶端等候與 Redis 伺服器建立連線的時間。 將用戶端程式庫設定為使用五秒的 connect timeout,讓系統即使在較高的 CPU 狀況下,也有足夠的時間連線。

較小的 connection timeout 值無法保證在該時間範圍內建立連線。 如果出現問題 (高用戶端 CPU、高伺服器 CPU 等),則較短的 connection timeout 值會導致連線嘗試失敗。 這種行為通常會雪上加霜。 較短的逾時會強制系統重新開始嘗試重新連線,導致「連線 -> 失敗 -> 重試」迴圈,不但沒幫助,反而使問題惡化。

命令逾時

大部分的用戶端程式庫都有另一個逾時設定,即 command timeouts,這是用戶端等候 Redis 伺服器回應的時間。 雖然建議初始設定少於五秒,但請根據您的情況和儲存在快取中的值大小,以考慮將 command timeout 設定為較高或較低。

如果 command timeout 太小,則連線可能不穩定。 但如果 command timeout 太大,則應用程式可能必須等很久,才知道命令是否會逾時。

避免用戶端連線尖峰

在連線中斷之後重新連線時,避免同時建立許多連線。 就像短的連線逾時可能導致中斷較久一樣,同時開始許多重新連線嘗試也會增加伺服器負載,並使得所有用戶端花更長時間才成功重新連線。

如果您要重新連線許多用戶端執行個體,請考慮交錯安排新的連線,以避免連線的用戶端數目激增。

注意

當您使用 StackExchange.Redis 用戶端程式庫時,請在連接字串中將 abortConnect 設定為 false。 建議由 ConnectionMultiplexer 處理重新連線。 如需詳細資訊,請參閱 StackExchange.Redis 最佳做法

避免殘留連線

快取會限制每個快取層的用戶端連線數目。 請確定用戶端應用程式重新建立連線時會關閉並移除舊的連線。

進階維護通知

使用通知來悉熟即將進行維護。 如需詳細資訊,請參閱是否可以在計劃性維護之前通知我

排程維護時段

調整快取設定以順應維護。 如需建立維護期間以降低快取任何負面影響的詳細資訊,請參閱 更新通道和排程更新

復原的更多設計模式

針對復原套用設計模式。 如需詳細資訊,請參閱如何確保應用程式的復原性

閒置逾時

Azure Cache for Redis閒置連線有 10 分鐘的逾時。 10 分鐘的逾時可讓伺服器自動清除用戶端應用程式孤立的連線或連線。 大部分 Redis 用戶端程式庫都有內建的功能可定期傳送 heartbeatkeepalive 命令,以防止連線關閉,即使用戶端應用程式沒有要求也一樣。

如果連線閒置 10 分鐘有任何風險,請將 keepalive 間隔設定為小於 10 分鐘的值。 如果您的應用程式使用沒有原生功能的 keepalive 用戶端程式庫,您可以定期傳送 PING 命令,在應用程式中實作它。