2017-04-05 72 views
3

我試圖建立一個谷歌的TCP內部負載平衡器檢測Redis的主人。在這個lb後面的實例組由在端口6379上偵聽的redis-server進程組成。在這些redis實例中,只有其中一個是master。健康檢查從谷歌TCP負載平衡器

問題:添加TCP運行狀況檢查以檢測redis主設備,並使lb僅將所有流量轉移到redis主設備。

方法: 增加了TCP健康檢查端口6379. 爲了發送命令role到Redis的服務器進程和解析響應,我正在使用的健康檢查提供的可選PARAMS。請檢查截圖here

結果:健康檢查失敗的所有。如果我刪除可選的請求/響應參數,健康檢查開始傳遞所有參數。

調試

  1. 連送到LB使用netcat的和發出的命令role,將其作爲預期開始*3(對主)和*5(用於從站)的響應。
  2. 登錄到實例並停止redis-server進程。使用nc -l -p 6379開始在端口6379上進行偵聽,以檢查實例端在健康檢查中究竟收到了什麼。它確實收到role\r\n
  3. 步驟2中,重新啓動redis的服務器之後和在redis的-CLI跑MONITOR命令,觀看由該方法接收的命令的日誌。這裏沒有日誌role。 這意味着,例如在接收通過TCP的數據(role\r\n),但不被處理redis的-CLI接收到的(按照MONITOR命令)或別的東西正在發生。請幫忙。
+0

你有沒有設法弄清楚? – shaharmor

+0

你的redis服務器在哪個IP上監聽?僅限外部IP或僅限內部IP或0.0.0.0? – Dagang

+0

作爲一種變通方法,您可以嘗試在實例中運行的6380代理收聽並轉發流量到Redis的服務器上127.0.0.1:6379? – Dagang

回答

5

不幸的是,GCP的TCP健康檢查在響應中可以檢查的內容相當有限。從https://cloud.google.com/sdk/gcloud/reference/compute/health-checks/create/tcp

--response=RESPONSE 
An optional string of up to 1024 characters that the health checker expects to receive from the instance. If the response is not received exactly, the health check probe fails. If --response is configured, but not --request, the health checker will wait for a response anyway. Unless your system automatically sends out a message in response to a successful handshake, only configure --response to match an explicit --request. 

注意在幫助信息詞 「準確」。響應必須與提供的字符串完全匹配。在響應中不能指定要搜索的部分字符串。

正如你可以看到https://redis.io/commands/role,Redis的的ROLE命令返回一串文字。雖然子串「主」存在於響應,它也有一堆,將從設置到設置不同的其他文字的(基於從站,它們的地址等的數量)。

你一定要提高與GCP對響應正則表達式匹配功能請求。在此之前,可能的解決方法是在每臺執行本地「redis-cli role | grep master」命令的主機上都有一個小型web應用程序,並返回響應。然後可以配置運行狀況檢查以監視此Web應用程序。

+0

感謝您的答案和解決方法。你對健康檢查的反應匹配的限制的觀察是正確的,我也注意到了。實際上,tcp lb創建屏幕中的幫助文本顯示 - 「一個可選的ASCII值,它將與接收到的數據的開頭匹配。默認情況下響應是空的,這意味着任何響應都表明健康。「這使我相信它可能只是通過匹配響應的開始而工作,所以我想通過試驗來驗證。 – Yadvendar

+0

但在追蹤期間,觀察到意外的行爲,併成爲我在此發佈問題的原因。請注意我的調試點3,我指出應該記錄'role'命令。 – Yadvendar

+0

@Yadvendar,您運行的是REDIS的哪個版本。在2.8.12中增加了「角色」命令。如果您的版本較舊,則不支持該命令,因此不會被記錄。 –

相關問題