我想解決 Amazon ElastiCache for Redis 中重新導向至碎片的主要節點而不是複本節點的 Redis 用戶端讀取請求。
簡短說明
ElastiCache for Redis 叢集中的任何節點都可以接收來自 Redis 用戶端的查詢。當用戶端傳送讀取和寫入查詢到複本節點時,節點會檢查要求是單金鑰還是多金鑰操作。單金鑰或多金鑰操作必須屬於碎片的相同散列槽位。依預設,已開啟叢集模式的複本節點會將所有讀取和寫入要求重新導向至主節點。讀取和寫入請求會重新導向至屬於金鑰散列槽位之碎片的權威主節點。如果碎片屬於散列槽位,並且先啟動 readonly 命令,則複本節點只完成讀取請求。只有在用戶端先發出 readonly 時,複本節點才會處理讀取請求。如果未先傳送 readonly 請求,則複本節點會將請求重新導向到主節點。
解決方法
為確保您的 Redis 用戶端讀取請求由複本節點讀取,請完成下列步驟:
-
登入您的叢集,然後設定金鑰。範例:
172.31.21.72:6379> set key8 "This is testing for readonly"
-> Redirected to slot [13004] located at 172.31.21.72:6379
OK
172.31.21.72:6379>
-
連線至複本節點。確保發出 readonly 命令。範例: **注意:**下列範例顯示未先傳送的 readonly 命令,且請求會重新導向至主節點。
172.31.30.175:6379> info replication
# Replication
role:slave
master_host:172.31.21.72
master_port:6379
master_link_status:up
172.31.30.175:637> CLUSTER KEYSLOT key8
(integer) 13004
172.31.30.175:637> get key8
(error) MOVED 13004 172.31.21.72:6379
172.31.30.175:637> get key8
-> Redirected to slot [13004] located at 172.31.21.72:6379
"This is testing for readonly"
172.31.21.72:6379>
注意: 當 Redis 叢集用戶端無法處理無法處理主節點的重新導向請求時,就會發生前述範例中顯示的 MOVED 錯誤。如需關於 MOVED 錯誤的詳細資訊,請參閱 Redis 網站上的 MOVED 重新導向。
範例:
**注意:**下列範例顯示先傳送的 readonly 命令。這允許複本節點處理請求,而不會將請求重新導向到主節點。
172.31.30.175:6379> readonly
OK
172.31.30.175:6379> get key8
"This is testing for readonly"
172.31.30.175:6379>
**注意:**確保在用戶端第一次連線到節點時發出 readonly 命令。只有在用戶端從相同節點讀取金鑰之前,該命令才會處於作用中狀態。如果用戶端連線到相同或不同的碎片中的另一個複本節點,請確定已發出 readonly 命令。