2015-08-03 167 views
0

我有一個Redis集羣,客戶端通過虛擬IP通過HAPRoxy連接到。 Redis羣集有三個節點(每個節點與正在運行的sentinel實例共享相同的服務器)。Redis集羣通過HAProxy

我的問題是,當我的客戶端在發送請求時從羣集節點收到「MOVED」錯誤/消息時,它是否在連接時第二次繞過HAProxy,因爲它已經提供了IP:端口MOVEd消息已發佈?如果不是,HAProxy如何第二次知道將其發送到正確的節點?

我只需要了解這是如何工作的。

回答

0

如果你想在Redis的集羣節點前使用HAProxy的,你將需要:

  1. 建立一個HAProxy的每個主/從設備對,及導線上的東西時,更新HAProxy的故障發生,以及可能攔截拓撲相關的命令以插入虛擬IP而不是節點本身具有的IP並通過拓撲命令/響應報告。

  2. 自定義HAProxy教它如何成爲羣集感知的Redis客戶端,因此實際的客戶端根本不知道羣集。這意味着教會它Redis協議,存儲羣集的拓撲信息,並根據消費者代碼訪問的密鑰選擇要查詢的節點。

隨着Redis的集羣客戶端必須能夠訪問每個節點的羣集。選項2中的兩個選項是「更容易」的選項,但在這一點上我不會推薦。

可以想象,您可以使用VIP作爲「獲取拓撲信息的第一位」IP,但我懷疑您會遇到嚴重的問題,因爲原始IP不會被正確報告爲點頭處理數據。爲此,您可以簡單地使用循環DNS並避免該問題,或者使用內置的「這裏是集羣IP列表(或名稱?)」來初始化連接配置。

最簡單且最不可能成爲問題的路線是「完全原生」,只需將羣集中的每個節點完全直接訪問給客戶端,而不使用HAProxy。

+0

真正的比爾(不是克林頓),我已經配置HAProxy,並且它與redis集羣工作正常。我唯一需要知道的是 - 當客戶端在發送請求時從集羣節點獲取「MOVED」錯誤/消息時,是否在連接時第二次繞過HAProxy,因爲它已提供IP:端口當MOVEd消息發佈時? –

+0

正如我所說HAProxy不知道有關Redis的任何信息,因此它只會代理數據,除非您教授它,否則無法在API級別與Redis羣集進行交互。我可以保證,您的HAProxy不能「與Redis Cluster一起正常工作」,但您尚未看到問題。 –

+0

真正的Bill,所以當Redis集羣中的一個節點收到來自客戶端的請求後,發送一個「MOVED」消息,該請求用於駐留在另一個節點上的散列槽時,客戶端如何發送知道如何將其發送到右側第二次節點爲相同的請求嗎?在第二個請求(在MOVED消息之後),請求是否仍然需要通過代理? –