本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
持續連線問題
疑難排解使用 ElastiCache 的持續連線問題時,必須驗證下列項目:
主題
安全群組是保護 ElastiCache 用戶端 (EC2 執行個體、 AWS Lambda 函數、Amazon ECS 容器等) 和 ElastiCache 快取的虛擬防火牆。安全群組具有狀態,這表示允許傳入或傳出流量之後,該流量的回應將在該特定安全群組的內容中自動授權。
具狀態功能需要安全群組追蹤所有授權的連線,而且追蹤的連線數有限額。如果達到限額,新的連線將會失敗。請參閱疑難排解一節,以取得如何識別用戶端或 Elasticache 端是否已達到限制的說明。
您可以將單一安全群組同時指派給用戶端和 ElastiCache 叢集,或為兩者分別指派單獨的安全群組。
針對這兩種情況,您都需要允許來源 ElastiCache 連接埠上的 TCP 傳出流量,並允許同一連接埠上的傳入流量傳送至 ElastiCache。Memcached 的預設連接埠為 11211,Valkey 或 Redis OSS 的預設連接埠為 6379。根據預設,安全群組允許所有對外流量。在此情況下,只需要目標安全群組中的傳入規則。
如需詳細資訊,請參閱 用於存取 Amazon VPC 中 ElastiCache 叢集的存取模式 。
網路 ACL
網路存取控制清單 (ACL) 是無狀態規則。必須允許雙向 (傳入和傳出) 的流量才能成功。網路 ACL 會指派給子網路,而非特定資源。可以將相同的 ACL 指派給 ElastiCache 和用戶端資源,特別是如果它們位於相同的子網路中。
根據預設,網路 ACL 允許所有流量。不過,您可以自訂為拒絕或允許流量。此外,ACL 規則的評估會依序進行,這表示符合流量的數字最小規則將會予以允許或拒絕。允許 Valkey 或 Redis OSS 流量的最低組態為:
用戶端網路 ACL:
-
傳出規則:
-
Rule number (規則編號):最好低於任何拒絕規則;
-
Type (類型):Custom TCP Rule (自訂 TCP 規則);
-
Protocol (通訊協定):TCP
-
Port Range (連接埠範圍):1024-65535
-
Source (來源):0.0.0.0/0 (或 ElastiCache 叢集子網路。請記得,使用特定 IP 可能會在容錯移轉或擴展叢集時產生問題)
-
Allow/Deny (允許/拒絕):Allow (允許)
如需詳細資訊,請參閱 網路 ACL 。
類似於網路 ACL,每個子網路也可以有不同的路由表。如果用戶端和 ElastiCache 叢集位於不同的子網路中,請確定其路由表允許它們彼此連線。
較複雜的環境 (涉及多個 VPC、動態路由或網路防火牆) 可能會變得難以疑難排解。請參閱 網路連線能力驗證 ,確認您的網路設定是否適當。
DNS 解析
ElastiCache 提供以 DNS 名稱為基礎的服務端點。可用的端點為
Configuration
、
Primary
、
Reader
及
Node
端點。如需詳細資訊,請參閱
尋找連線端點
。
在修改容錯移轉或叢集的情況下,與端點名稱相關聯的地址可能會變更且會自動更新。
自訂 DNS 設定 (亦即不使用 VPC DNS 服務) 可能不知道 ElastiCache 提供的 DNS 名稱。請確認您的系統可以使用系統工具 (像是
dig
(如下所示) 或
nslookup
) 來成功解析 ElastiCache 端點。
$ dig +short example.xxxxxx.ng.0001.use1.cache.amazonaws.com example-001.xxxxxx.0001.use1.cache.amazonaws.com. 1.2.3.4
您也可以透過 VPC DNS 服務強制執行名稱解析:
$ dig +short example.xxxxxx.ng.0001.use1.cache.amazonaws.com @169.254.169.253 example-001.tihewd.0001.use1.cache.amazonaws.com. 1.2.3.4
透過伺服器端診斷識別問題
來自 ElastiCache 引擎的 CloudWatch 指標和執行時間資訊,是用來識別潛在連線問題來源的常見來源或資訊。優質的分析資料通常從下列項目開始:
-
CPU 用量:Valkey 和 Redis OSS 是多執行緒應用程式。但是每個命令的執行發生在單個 (主) 執行序中。因此,ElastiCache 提供指標
CPUUtilization和EngineCPUUtilization。EngineCPUUtilization提供專用於 Valkey 或 Redis OSS 程序的 CPU 使用率,以及所有 vCPUsCPUUtilization的使用量。具有多個 vCPU 的節點的CPUUtilization和EngineCPUUtilization值一般會不同,後者通常較高。出現高EngineCPUUtilization,可能是由於需要大量 CPU 時間才能完成的請求或複雜作業數量增加所造成。您可以透過以下項目來識別兩者:-
CacheHits和CacheMisses:成功請求或沒有在快取中找到有效項目的請求之數目。如果未命中與命中的比率很高,表示應用程式正在對無效果的請求浪費時間和資源。 -
SetTypeCmds和GetTypeCmds:這些指標與EngineCPUUtilization相關,有助於了解寫入請求 (由SetTypeCmds測量) 或讀取請求 (由GetTypeCmds測量) 的負載是否明顯高。如果負載主要是讀取作業,使用多個僅供讀取複本可以在多個節點之間平衡請求,並撥出主節點用於寫入作業。在停用叢集模式的叢集中,可以使用 ElastiCache 讀取者端點,在應用程式中建立額外的連線組態以使用僅供讀取複本。如需詳細資訊,請參閱 尋找連線端點 。讀取作業必須提交至這個額外的連線。寫入作業將透過一般主要端點完成。在啟用叢集模式的情況下,建議您使用原生支援僅供讀取複本的程式庫。使用正確的旗標,程式庫將能夠自動探索叢集拓撲、複本節點、透過 READONLY Valkey 或 Redis OSS 命令啟用讀取操作,並將讀取請求提交至複本。
-
連線數增加:
-
CurrConnections和NewConnections:CurrConnection是收集資料點時的已建立連線數,而NewConnections會顯示這段期間內建立的連線數。建立和處理連線意味著可觀的 CPU 額外負荷。此外,成立新連線所需的 TCP 三向交握會對整體回應時間產生負面影響。
一個每分鐘有數以千計
NewConnections的 ElastiCache 節點,表示成立的連線只供幾個命令使用,這並非最佳做法。保持連線的成立狀態,並重複使用這些連線來進行新作業是最佳實務。當用戶端應用程式支援並妥善實作連線集區或持續連線時,此情況有可能實現。使用連線集區時,currConnections數不會有很大的變化,而NewConnections應盡可能壓低。Valkey 和 Redis OSS 透過少量 currConnections 提供最佳效能。讓 CurrConnection 數量維持在大約數十或數百個,可最大限度壓低資源的使用量,以支援個別連線,例如供連線使用的用戶端緩衝區和 CPU 週期。 -
網路輸送量:
-
判斷頻寬:ElastiCache 節點的網路頻寬與節點大小成比例。由於應用程式具有不同的特性,結果可能會根據工作負載而有所不同。舉例來說,小型請求率高的應用程式,對 CPU 使用率造成的影響往往高於網路輸送量,而索引鍵較大則會造成網路使用率較高。因此,建議您使用實際工作負載來測試節點,以便更深入了解限制。
模擬來自應用程式的負載會提供更準確的結果。但是,基準化分析工具可讓您更妥善了解限制。
-
針對請求主要都是讀取的情況,使用複本進行讀取作業將能減輕主節點上的負載。如果使用案例主要是寫入,則使用許多複本將會提高網路使用量。針對寫入主節點的每個位元組,系統會將 N 個位元組傳送到複本 (N 即複本的數量)。寫入密集型工作負載的最佳實務是使用啟用叢集模式的 ElastiCache for Redis OSS,以便跨多個碎片平衡寫入,或擴展到具有更多網路功能的節點類型。
-
CloudWatch 指標
NetworkBytesIn和NetworkBytesOut分別提供傳入或傳出節點的資料量。ReplicationBytes則適用於資料複寫專屬的流量。如需詳細資訊,請參閱 網路相關限制 。
-
複雜命令:Redis OSS 命令會在單一執行緒上提供,這表示請求會依序提供。單一緩慢命令可能會影響其他請求和連線,最終導致逾時。使用作用於多個值、索引鍵或資料類型的命令時必須小心。根據參數的數量或其輸入或輸出值的大小,可能會封鎖或終止連線。
一個惡名昭彰的例子是
KEYS命令。它會掃描整個 Keyspace,搜尋指定的模式,並在其執行過程中阻止其他命令的執行。Redis OSS 使用「Big O」表示法來描述其命令複雜性。索引鍵命令帶有 O(N) 時間複雜度,N 是資料庫中索引鍵的數量。因此,索引鍵數越多,命令執行速度就會越慢。
KEYS可能會以不同的方式造成問題:如果沒有使用搜尋模式,該命令將會傳回所有可用的索引鍵名稱。在具有數千個或數百萬個項目的資料庫中,系統會建立巨大的輸出並淹沒網路緩衝區。如果使用搜尋模式,則只會將符合該模式的索引鍵傳回用戶端。但是,引擎仍然會掃描整個 Keyspace 搜尋它,且完成命令的時間相同。
KEYS的替代方案是SCAN命令。它會反覆運算 Keyspace,限制在特定數量的項目中執行反覆運算,避免延長引擎上區塊的執行時間。掃描具有
COUNT參數,用來設定反覆運算區塊的大小。預設值為 10 (每個反覆運算 10 個項目)。根據資料庫中項目數的不同,
COUNT值小的區塊需執行更多的反覆運算才能完成完整掃描,而較大的值每次反覆運算時會讓引擎維持忙碌狀態更久。小計數值會使SCAN執行速度較慢,而較大的值可能會對KEYS造成上述相同問題。範例是以計數值 10 執行
SCAN命令,將需要在具有 1 百萬個索引鍵的資料庫上進行 100,000 次重複作業。如果平均網路封包來回時間為 0.5 毫秒,則傳輸請求會花費大約 50,000 毫秒 (50 秒)。另一方面,如果計數值為 100,0000,則需要執行單次反覆運算,且傳輸只會花 0.5 毫秒。不過,引擎會完全封鎖其他作業,直到該命令完成掃描所有的 Keyspace。
除了
KEYS以外,如果未正確使用,其他幾個命令可能有害。若要查看所有命令及其個別時間複雜性的清單,請前往 Valkey 和 Redis OSS 命令 。潛在問題範例:
-
Lua 指令碼:Valkey 和 Redis OSS 提供內嵌 Lua 解譯器,允許在伺服器端執行指令碼。Valkey 和 Redis OSS 上的 Lua 指令碼是在引擎層級執行,依定義為原子,這表示指令碼執行時不允許執行其他命令或指令碼。Lua 指令碼可讓您直接在引擎上執行多個命令、決策演算法、資料剖析等。雖然這類指令碼的不可部分完成特性和卸載應用程式的機會很誘人,但將指令碼用於小型作業時必須小心。在 ElastiCache 上,Lua 指令碼的執行時間限制為 5 秒。未寫入 Keyspace 的指令碼將在 5 秒過後自動終止。為了避免資料損毀和不一致,如果指令碼執行沒有在 5 秒內完成,且執行期間有任何寫入,節點便會容錯移轉。 交易
是保證 Redis OSS 中多個相關金鑰修改一致性的替代方案。交易允許執行一個命令區塊,觀察現有的索引鍵修改項目。如果觀察的任何索引鍵在交易完成之前有所變更,系統會捨棄所有修改。 -
大量刪除項目:
DEL命令接受多個參數,這些參數是要刪除的索引鍵名稱。刪除作業會同步進行,如果參數清單很大,或是包含大型清單、集合、排序集合或雜湊 (包含多個子項目的資料結構),則需花費大量的 CPU 時間。換句話說,如果單一索引鍵有許多元素,即使只是刪除單一索引鍵,也可能需要花相當長的時間。的替代方案DEL是UNLINK,這是可用的非同步命令,因為 Redis OSS 4。UNLINK必須DEL盡可能優先於 。從 ElastiCache for Redis OSS 6x 開始,lazyfree-lazy-user-del參數會讓DEL命令的行為與啟用UNLINK時類似。如需詳細資訊,請參閱 Redis OSS 6.0 參數變更。 -
對多個索引鍵上產生作用的命令:先前提到的
DEL是接受多個參數的命令,且其執行時間將直接與此成正比。不過,Redis OSS 提供更多類似運作的命令。範例為MSET和MGET允許一次插入或檢索多個字串索引鍵。使用它們可能有助於減少許多個別SET或GET命令的固有網路延遲。不過,廣泛的參數清單會影響 CPU 使用率。雖然單獨 CPU 使用率並不是連線問題的原因,但花太多時間對多個索引鍵處理單一或幾個命令,可能會造成其他請求失敗,並增加整體 CPU 使用率。
索引鍵的數量和大小會影響命令的複雜性,進而影響完成時間。
可以作用於多個索引鍵的其他命令範例有:
HMGET、HMSET、MSETNX、PFCOUNT、PFMERGE、SDIFF、SDIFFSTORE、SINTER、SINTERSTORE、SUNION、SUNIONSTORE、TOUCH、ZDIFF、ZDIFFSTORE、ZINTER或ZINTERSTORE。 -
作用於多種資料類型的命令:Redis OSS 也提供作用於一或多個金鑰的命令,無論其資料類型為何。ElastiCache for Redis OSS 提供
KeyBasedCmds監控此類命令的指標。此指標會加總在所選期間內執行下列命令的次數:-
EXISTS -
OBJECT -
PTTL -
RANDOMKEY -
TTL -
TYPE -
EXPIRE -
EXPIREAT -
MOVE -
PERSIST -
PEXPIRE -
PEXPIREAT -
UNLINK (O(N)用於回收記憶體。但是,記憶體回收任務發生在單獨一個執行序中,且不會阻止引擎
-
-
-
根據資料類型而不同的複雜性時間:
-
DEL -
DUMP -
RENAME視為具有 O(1) 複雜性的命令,但在DEL內部執行。執行時間會依重新命名索引鍵的大小而變動。 -
RENAMENX -
RESTORE -
SORT
大雜湊:雜湊是一種資料類型,允許單個索引鍵具有多個鍵值子項目。每個雜湊都可以存放 4.294.967.295 個項目,且大雜湊上的作業可能會變得非常昂貴。與
KEYS
類似,雜湊具有帶有 O(N) 時間複雜度的
HKEYS
命令,N 是雜湊中的項目數。
HSCAN
必須優先於
HKEYS
以避免長時間執行命令。
HDEL
、
HGETALL
、
HMGET
、
HMSET
和
HVALS
命令應在大雜湊上謹慎使用。