跳至內容

如何對 ElastiCache Redis 用戶端中的錯誤訊息進行疑難排解?

2 分的閱讀內容
0

當我使用 Redis 用戶端連線到 Amazon ElastiCache Redis 叢集時收到錯誤訊息。

解決方法

「連線由對方重設」錯誤

當 Redis 伺服器終止連線時,您會收到下列錯誤訊息:

「java.io.IOException: 連線由對方重設
io.netty.channel.unix.Errors$NativeIoException: readAddress(..) 失敗: 連線由對方重設」

此錯誤可能源自伺服器或用戶端。

如果您收到來自伺服器的錯誤,請執行下列動作來解決問題:

  • 檢查基礎硬體或網路問題。
  • 執行 CLIENT LIST 命令以檢查用戶端輸出緩衝區配額。如需詳細資訊,請參閱 Redis 網站上的 CLIENT LIST叢集參數群組中的參數定義 ElastiCache 中的用戶端輸出緩衝區配額。
  • 檢查 ElastiCache 參數群組中的逾時值是否達到其配額。

如果您收到來自用戶端的錯誤,請執行下列動作來解決問題:

  • 檢查應用程式中的逾時設定是否過低。
  • 查看 Redis 用戶端程式庫的官方文件或支援頁面,以了解與連線重設相關的已知錯誤。
  • 確認您擁有最新版本的 Redis 用戶端。
  • 如果您為叢集開啟了 TLS,請確認您已在用戶端上設定加密。

「連線遭拒」或「無法連線至 Redis」錯誤

當伺服器拒絕連線時,您會收到下列錯誤訊息:

「JedisConnectionException:java.net.ConnectException: 連線遭拒
原因:io.netty.channel.AbstractChannel$AnnotatedConnectException:
連線遭拒
ECONNREFUSED
org.springframework.data.redis.RedisConnectionFailureException: 無法連線到 Redis org.redisson.client.RedisConnectionException: 無法連線到 Redis 伺服器 ###」

若要解決此問題,請確認以下事項:

**注意:**您可以使用 tcpdump 等工具來分析連線嘗試。

「連線逾時」錯誤

當連線逾時時,您會收到以下錯誤訊息:

「redis.exceptions.TimeoutError: 連線伺服器逾時 io.netty.channel.ConnectTimeoutException:連線逾時 org.redisson.client.RedisTimeoutException: 無法取得連線!」

連線逾時錯誤可能是持續性的,也可能是間歇性的。

如果逾時錯誤仍然存在,請執行下列動作來解決問題:

  • 確認網路連線和組態,以確認與 ElastiCache Redis 叢集的連線。
  • 確認您指定了正確的 Redis 端點

若要對持續逾時錯誤進行疑難排解,請參閱持續連線問題

如果逾時錯誤是間歇性的,請執行下列動作來解決問題:

「讀取逾時」錯誤

當命令未在您設定的逾時值內完成時,您會收到以下錯誤訊息:

「StackExchange.Redis.RedisTimeoutException: 執行 GET 逾時 (5000 毫秒) io.lettuce.core.RedisCommandTimeoutException: 命令逾時 org.springframework.data.redis.RedisConnectionFailureException:java.net.SocketTimeoutException: 讀取逾時 redis.clients.jedis.exceptions.JedisConnectionException:java.net.SocketTimeoutException: 讀取逾時」

當 Redis 執行緒處理複雜或長時間執行的命令時,就會發生此錯誤。

若要解決此錯誤,請執行下列動作:

  • 檢查記憶體、CPU、網路或連線資源限制
  • 確認用戶端沒有資源限流。
  • 檢查問題發生時延遲是否很高
  • 檢查是否有阻塞 Redis 引擎的長時間執行命令,因為 Redis 是單一執行緒引擎,一次只能處理一個查詢。如需說明,請參閱 Redis 網站上的 SLOWLOG GET
  • 檢查每單位時間內是否有過多的命令。如需說明,請參閱 Redis 網站上的 INFO

「操作逾時」錯誤

當連線閒置的時間超過您設定的逾時值時,您會收到下列錯誤訊息:

「io.lettuce.core.RedisException:java.io.IOException: 操作逾時」

由於下列原因,您可能會收到操作逾時錯誤:

  • ElastiCache 叢集負載高,無法及時處理命令。
  • 網路流量超過叢集或用戶端的頻寬配額。

若要解決此錯誤,請執行下列動作:

「需要 NOAUTH 驗證」錯誤

當您連線到需要驗證但未提供有效憑證的 Redis 伺服器時,您會收到需要 NOAUTH 驗證錯誤訊息。

若要解決此錯誤,請執行下列動作:

  • 提供正確的使用者名稱和密碼以連線到叢集。
  • 確認用戶端程式庫組態和連線字串具有正確的語法。

「已達到 ERR 用戶端數目上限」錯誤

當叢集節點達到其最大連線配額時,您會收到已達到 ERR 用戶端數目上限錯誤訊息。

若要解決此錯誤,請執行下列動作:

  • 檢查 CurrConnections 指標,並確認其是否在 maxclients 配額範圍內。如需詳細資訊,請參閱 Redis 網站上的並行連線的用戶端數上限
  • 使用連線集區來重複使用連線。
  • 在用戶端組態中設定適當的逾時值。
  • 將用戶端設定為在進行讀取作業時直接連線至讀取複本,以將負載分配到叢集的各個節點上。

「載入中 Redis 正在將資料集載入到記憶體中」錯誤

當您連線到正在啟動或進行複本同步處理期間,將其資料集載入記憶體的節點時,您會收到下列錯誤訊息:

「載入中 Redis 正在將資料集載入到記憶體中 (錯誤) 載入中 Redis 正在將資料集載入記憶體中」

最佳做法是實作退避機制。如需詳細資訊,請參閱 Redis 叢集用戶端探索和指數退避一節,該節位於最佳做法: Redis 用戶端和 Amazon ElastiCache for Redis 中。

「當使用的記憶體 > 'maxmemory' 時,不允許使用 OOM 命令」錯誤

maxmemory 參數設定 Redis 節點可用於資料儲存的記憶體數量上限。

當記憶體使用量超過 maxmemory 配額時,Redis 將套用您在參數群組中設定的 maxmemory-policy。根據 maxmemory-policy,Redis 會移出金鑰或傳回 OOM 命令不允許錯誤。

若要解決此錯誤,請執行下列動作:

  • 根據您的應用程式要求設定 maxmemory-policy 來移出金鑰。
  • 當記憶體使用量持續超過配額時,請將叢集升級為更大的節點類型。

「請求中的 CROSSLOT 金鑰未根據雜湊值對應到相同插槽」錯誤

當您在已開啟叢集模式且具有不同雜湊槽的叢集上執行多金鑰作業時,您會收到 CROSSSLOT 錯誤。

若要解決此問題,請參閱如何解決在 ElastiCache (Redis OSS) 自設叢集上使用多金鑰作業時,收到的 CROSSLOT 錯誤?

「CLUSTERDOWN 叢集已關閉」錯誤

當節點停止回應時,叢集變為無法使用,並且您會收到叢集已關閉錯誤訊息。

若要解決此錯誤,請執行下列動作:

「READONLY 您無法對唯讀複本進行寫入」錯誤

以下是當您嘗試寫入已設定為讀取複本的 Redis 節點時,收到錯誤的原因:

  • 您的應用程式直接連線到讀取複本。
  • 應用程式中的 DNS 快取將流量路由到舊的主要節點。

若要解決此問題,請參閱如何對在 ElastiCache for Redis 自設叢集中容錯移轉後,收到的 READONLY 錯誤進行疑難排解?

「MOVED [slot] [IP address] [port]」錯誤

MOVED 重新導向訊息包含所請求金鑰之節點的雜湊插槽、IP 位址和連接埠:

「-MOVED 3999 127.0.0.1:6381」

以下是您可能會收到 MOVED 錯誤的原因:

  • 用戶端嘗試存取不在連線節點上雜湊插槽中的金鑰。
  • 您為叢集開啟了叢集模式,但用戶端無法感知叢集。
  • 您的讀取複本沒有唯讀標誌。
  • 您的用戶端具有過時的叢集資訊,例如碎片或節點數量變更。

若要解決此問題,請執行以下動作:

AWS 官方已更新 8 個月前