具有 TLS 的 Redis Sentinel - 如何取得節點 FQDN 而不是 IP?

具有 TLS 的 Redis Sentinel - 如何取得節點 FQDN 而不是 IP?

這可能是伺服器故障或堆疊溢位問題,我還不確定:

我設定了一個簡單的三節點 Redis 系統,其中包含一個主節點和兩個副本節點,並使用 Redis Sentinel 管理故障轉移。 Redis 和 Sentinel 網路流量使用 Redis 內建 TLS 支援和常規 CA 頒發的憑證來保護。

每個 Sentinel 實例都配置為公佈其主機名稱並解析 DNS:

sentinel resolve-hostnames yes
sentinel announce-hostnames yes
sentinel announce-ip "redistest2.mydomain.com"

我們有一個使用 Servicestack 的 Web 服務來連線到 Sentinel 實例。只要我們不驗證TLS 憑證和主機名,一切都會正常運作:Web 服務可以看到Redis Sentinel 偵聽器,當我們終止目前的Master 時,Redis 叢集會對新的Master 進行投票,Web 服務會切換到Redis Sentinel 偵聽器。

然而,雖然原始主節點報告其 FQDN,但兩個備份節點似乎僅向 ServiceStack 報告其 IP 位址。

Sentinel 日誌摘錄顯示備份節點似乎使用其主機名稱:

28011:X 15 Feb 2023 15:23:10.817 * +sentinel sentinel <hex-string> redistest2.mydomain.com 26379 @ redistest redistest1.mydomain.com 6379
28011:X 15 Feb 2023 15:23:10.821 * Sentinel new configuration saved on disk
28011:X 15 Feb 2023 15:23:10.897 * +sentinel sentinel <other-hex-string> redistest3.mydomain.com 26379 @ redistest redistest1.mydomain.com 6379
28011:X 15 Feb 2023 15:23:10.901 * Sentinel new configuration saved on disk

然而 ServiceStack 堅持它只接收從伺服器群組返回的伺服器 IP 位址:

Starting with sentinel.
Sentinel hosts: redistest1.mydomain.com:26379?ssl=true, redistest2.mydomain.com:26379?ssl=true, redistest3.mydomain.com:26379?ssl=true
Sentinel created
Host filter set.
Hostfilter: redistest1.mydomain.com:6379
Hostfilter: 10.100.60.72:6379
Hostfilter: 10.100.60.73:6379
RedisManager started.
Redis sentinel info: redistest primary: redistest1.mydomain.com:6379, replicas: 10.100.60.72:6379, 10.100.60.73:6379
Hostfilter: 10.100.60.72:6379
Hostfilter: 10.100.60.73:6379
Ping error with read only client: ServiceStack.Redis.RedisException: [14:23:47.626] Unable to Connect: sPort: 0, Error: One or more errors occurred.
(...)
---> System.AggregateException: One or more errors occurred. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

我還可以在 Redis 和/或 Sentinel 配置方面做些什麼來確保 ServiceStack 接收 Redis 節點的實際主機名,以便我們正確驗證所使用的憑證?

答案1

ServiceStack 日誌包含了出錯原因的必要線索:Sentinel 完全執行了它應該執行的操作,但 Redis 備份節點是透過 IP 位址引用的。

與 Sentinel 在設定語句中傳回包含 FQDN 的字串類似sentinel announce-ip,Redis 也可以對設定語句執行相同的操作replica-announce-ip

解決方案是將以下行新增到所有備份主機上的 Redis 設定檔中:

replica-announce-ip servername.mydomain.com

在這種情況下,伺服器名稱當然是執行該特定備份節點的電腦的主機名稱。

相關內容