Redis
Envoy 可以作為 Redis 代理,在叢集中的實例之間分割命令。在此模式下,Envoy 的目標是維持可用性和分割容錯,而不是一致性。這是將 Envoy 與 Redis Cluster 比較時的關鍵點。Envoy 設計為盡力而為的快取,這表示它不會嘗試調解不一致的資料或維持叢集成員的全局一致視圖。它還支援根據不同的工作負載的存取模式、驅逐或隔離需求,將命令路由到不同的上游叢集。
Redis 專案提供了關於 Redis 分割的完整參考。請參閱「分割:如何在多個 Redis 實例之間分割資料」。
Envoy Redis 的功能:
Redis 協定編解碼器。
基於雜湊的分割。
Redis 交易支援。
Ketama 分佈。
詳細的命令統計資料。
主動與被動的健康檢查。
雜湊標籤。
前綴路由。
獨立的下游用戶端和上游伺服器驗證。
鏡像所有請求或僅寫入請求的請求。
控制 讀取請求路由。這僅適用於 Redis Cluster。
計劃中的未來增強功能:
額外的計時統計資料。
斷路。
針對分散式命令的請求摺疊。
複製。
內建的重試。
追蹤。
組態
有關篩選器組態的詳細資訊,請參閱 Redis 代理篩選器 組態參考。
對應的叢集定義應該使用 環形雜湊負載平衡 來組態。
如果需要主動健康檢查,則應將叢集組態為自訂健康檢查,該檢查組態為 Redis 健康檢查器。
如果需要被動健康檢查,也請組態 離群值偵測。
為了被動健康檢查的目的,連線逾時、命令逾時和連線關閉會對應到 5xx。來自 Redis 的所有其他回應都計為成功。
Redis Cluster 支援
Envoy 提供了對 Redis Cluster 的支援。
當使用 Envoy 作為 Redis Cluster 的 sidecar 代理時,服務可以使用任何語言實作的非叢集 Redis 用戶端連接到代理,就好像它是一個單一節點 Redis 實例一樣。Envoy 代理會追蹤叢集拓撲,並根據 規範將命令傳送到叢集中正確的 Redis 節點。諸如從複本讀取之類的高級功能也可以新增到 Envoy 代理中,而不是更新每種語言的 redis 用戶端。
Envoy 代理透過將定期的 叢集插槽命令傳送到叢集中的隨機節點來追蹤叢集的拓撲,並維護以下資訊
已知節點的清單。
每個分片的 Primaries。
進入或離開叢集的節點。
Envoy 代理支援透過 cluster slots
命令回應中的 IP 位址和主機名稱來識別節點。如果無法解析 Primary 主機名稱,Envoy 會定期重試解析所有節點,直到成功為止。無法解析複本只會跳過該複本。另一方面,如果設定了enable_redirection 選項,並且收到包含主機名稱的 MOVED 或 ASK 回應,則 Envoy 不會自動執行 DNS 查詢,而是將錯誤逐字傳遞給用戶端。若要讓 Envoy 執行 DNS 查詢並追蹤重新導向,您需要在連線集區設定下組態 DNS 快取選項dns_cache_config。如需有關如何啟用重新導向的 DNS 查詢的組態範例,請參閱篩選器組態參考。
有關拓撲組態的詳細資訊,請參閱 Redis Cluster v3 API 參考。
每個 Redis 叢集都有自己的額外統計資料樹狀結構,根目錄為 cluster.<name>.redis_cluster.,包含以下統計資料
名稱 |
類型 |
描述 |
---|---|---|
max_upstream_unknown_connections_reached |
計數器 |
重新導向後未建立連線到未知主機的上游連線的總次數,因為已達到連線集區的 max_upstream_unknown_connections 限制 |
upstream_cx_drained |
計數器 |
在關閉之前耗盡作用中請求的上游連線總數 |
upstream_commands.upstream_rq_time |
直方圖 |
所有類型請求的上游請求時間的直方圖 |
可以透過設定enable_command_stats 來啟用每個叢集的命令統計資料。
名稱 |
類型 |
描述 |
---|---|---|
upstream_commands.[command].success |
計數器 |
特定 Redis 命令的成功請求總數 |
upstream_commands.[command].failure |
計數器 |
特定 Redis 命令的失敗或取消請求總數 |
upstream_commands.[command].total |
計數器 |
特定 Redis 命令的請求總數(成功和失敗的總和) |
upstream_commands.[command].latency |
直方圖 |
特定 Redis 命令的請求延遲 |
交易
支援交易 (MULTI)。它們的使用方式與一般 Redis 沒有不同:您使用 MULTI 開始交易,並使用 EXEC 執行交易。在交易中,僅支援 Envoy 支援的命令(請參閱下文)和單鍵命令,即不支援 MGET 和 MSET。支援 DISCARD 命令。
在 Redis Cluster 模式下工作時,Envoy 會將交易中的所有命令轉送到處理交易中第一個基於金鑰的命令的節點。使用者有責任確保交易中的所有金鑰都對應到相同的雜湊插槽,因為命令不會被重新導向。
支援的命令
在協定層級,支援管道。盡可能使用管道以獲得最佳效能。
在命令層級,Envoy 僅支援可以可靠雜湊到伺服器的命令。AUTH、PING 和 ECHO 是唯一的例外。如果已組態下游密碼,則 AUTH 會由 Envoy 在本機處理,並且在驗證成功之前,不會處理任何其他命令。如果設定了外部驗證提供者,Envoy 會改為將驗證引數傳送到外部服務,並根據驗證回應採取行動。如果下游密碼與外部驗證一起設定,則驗證仍將在外部完成,並且下游密碼會用於上游驗證。如果為叢集組態了上游驗證密碼,Envoy 會在連線到上游伺服器時透明地發出 AUTH 命令。Envoy 會立即使用 PONG 回應 PING。不允許使用 PING 的引數。Envoy 會立即使用命令引數回應 ECHO。所有其他支援的命令都必須包含金鑰。支援的命令在功能上與原始 Redis 命令相同,但在失敗情況下可能不同。
如需有關每個命令使用方式的詳細資訊,請參閱官方 Redis 命令參考。
命令 |
群組 |
---|---|
AUTH |
驗證 |
ECHO |
連線 |
PING |
連線 |
QUIT |
連線 |
DEL |
通用 |
DISCARD |
交易 |
DUMP |
通用 |
EXEC |
交易 |
EXISTS |
通用 |
EXPIRE |
通用 |
EXPIREAT |
通用 |
PERSIST |
通用 |
PEXPIRE |
通用 |
PEXPIREAT |
通用 |
PTTL |
通用 |
RESTORE |
通用 |
TOUCH |
通用 |
TTL |
通用 |
TYPE |
通用 |
UNLINK |
通用 |
GEOADD |
地理位置 |
GEODIST |
地理位置 |
GEOHASH |
地理位置 |
GEOPOS |
地理位置 |
GEORADIUS_RO |
地理位置 |
GEORADIUSBYMEMBER_RO |
地理位置 |
HDEL |
雜湊 |
HEXISTS |
雜湊 |
HGET |
雜湊 |
HGETALL |
雜湊 |
HINCRBY |
雜湊 |
HINCRBYFLOAT |
雜湊 |
HKEYS |
雜湊 |
HLEN |
雜湊 |
HMGET |
雜湊 |
HMSET |
雜湊 |
HSCAN |
雜湊 |
HSET |
雜湊 |
HSETNX |
雜湊 |
HSTRLEN |
雜湊 |
HVALS |
雜湊 |
PFADD |
HyperLogLog |
PFCOUNT |
HyperLogLog |
LINDEX |
清單 |
LINSERT |
清單 |
LLEN |
清單 |
LPOP |
清單 |
LPUSH |
清單 |
LPUSHX |
清單 |
LRANGE |
清單 |
LREM |
清單 |
LSET |
清單 |
LTRIM |
清單 |
MULTI |
交易 |
RPOP |
清單 |
RPUSH |
清單 |
RPUSHX |
清單 |
PUBLISH |
發布/訂閱 |
EVAL |
指令碼 |
EVALSHA |
指令碼 |
SADD |
集合 |
SCARD |
集合 |
SISMEMBER |
集合 |
SMEMBERS |
集合 |
SPOP |
集合 |
SRANDMEMBER |
集合 |
SREM |
集合 |
SSCAN |
集合 |
WATCH |
字串 |
ZADD |
排序的集合 |
ZCARD |
排序的集合 |
ZCOUNT |
排序的集合 |
ZINCRBY |
排序的集合 |
ZLEXCOUNT |
排序的集合 |
ZRANGE |
排序的集合 |
ZRANGEBYLEX |
排序的集合 |
ZRANGEBYSCORE |
排序的集合 |
ZRANK |
排序的集合 |
ZREM |
排序的集合 |
ZREMRANGEBYLEX |
排序的集合 |
ZREMRANGEBYRANK |
排序的集合 |
ZREMRANGEBYSCORE |
排序的集合 |
ZREVRANGE |
排序的集合 |
ZREVRANGEBYLEX |
排序的集合 |
ZREVRANGEBYSCORE |
排序的集合 |
ZREVRANK |
排序的集合 |
ZPOPMIN |
排序的集合 |
ZPOPMAX |
排序的集合 |
ZSCAN |
排序的集合 |
ZSCORE |
排序的集合 |
APPEND |
字串 |
BITCOUNT |
字串 |
BITFIELD |
字串 |
BITPOS |
字串 |
DECR |
字串 |
DECRBY |
字串 |
GET |
字串 |
GETBIT |
字串 |
GETDEL |
字串 |
GETRANGE |
字串 |
GETSET |
字串 |
INCR |
字串 |
INCRBY |
字串 |
INCRBYFLOAT |
字串 |
MGET |
字串 |
MSET |
字串 |
PSETEX |
字串 |
SET |
字串 |
SETBIT |
字串 |
SETEX |
字串 |
SETNX |
字串 |
SETRANGE |
字串 |
STRLEN |
字串 |
XACK |
串流 |
XADD |
串流 |
XAUTOCLAIM |
串流 |
XCLAIM |
串流 |
XDEL |
串流 |
XLEN |
串流 |
XPENDING |
串流 |
XRANGE |
串流 |
XREVRANGE |
串流 |
XTRIM |
串流 |
BF.ADD |
布隆篩選器 |
BF.CARD |
布隆篩選器 |
BF.EXISTS |
布隆篩選器 |
BF.INFO |
布隆篩選器 |
BF.INSERT |
布隆篩選器 |
BF.LOADCHUNK |
布隆篩選器 |
BF.MADD |
布隆篩選器 |
BF.MEXISTS |
布隆篩選器 |
BF.RESERVE |
布隆篩選器 |
BF.SCANDUMP |
布隆篩選器 |
失效模式
如果 Redis 拋出錯誤,我們會將該錯誤作為命令的回應傳遞。Envoy 將來自 Redis 的錯誤數據類型回應視為正常回應,並將其傳遞給呼叫者。
Envoy 也可能產生自身的錯誤來回應客戶端。
錯誤 |
含義 |
---|---|
沒有上游主機 |
環形雜湊負載平衡器在為該鍵選擇的環形位置上沒有可用的健康主機。 |
上游失效 |
後端在逾時期間內沒有回應或關閉了連線。 |
無效請求 |
命令因數據類型或長度問題而被命令分割器的第一階段拒絕。 |
不支援的命令 |
該命令未被 Envoy 識別,因此無法提供服務,因為它無法雜湊到後端伺服器。 |
完成時發生 n 個錯誤 |
如果收到任何錯誤,會回傳加總回應(例如 DEL)的碎片化命令接收到的錯誤總數。 |
上游協定錯誤 |
一個碎片化的命令接收到意外的數據類型,或後端回傳不符合 Redis 協定的回應。 |
命令的參數數量錯誤 |
某些命令會在 Envoy 中檢查參數數量是否正確。 |
NOAUTH 需要驗證。 |
由於已設定下游驗證密碼或外部驗證,但客戶端未成功驗證,因此該命令被拒絕。 |
ERR 無效密碼 |
由於密碼無效,驗證命令失敗。 |
ERR <外部訊息> |
驗證命令在外部驗證提供者上失敗。 |
ERR 客戶端發送 AUTH,但未設定密碼 |
收到驗證命令,但未設定下游驗證密碼或外部驗證提供者。 |
在 MGET 的情況下,每個無法擷取的鍵都會產生錯誤回應。例如,如果我們擷取五個鍵,其中兩個鍵的後端逾時,我們將會收到每個鍵的錯誤回應,而不是值。
$ redis-cli MGET a b c d e
1) "alpha"
2) "bravo"
3) (error) upstream failure
4) (error) upstream failure
5) "echo"