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"

協定

雖然建議在生產環境中使用 RESP,但也支援行內命令