2012-05-11 54 views
3

我想使用HAProxy作爲負載平衡器。我想把兩個rabbitmq服務器放在haproxy後面。 rabbitmq服務器都在EC2的不同實例上。我通過以下this reference配置HAProxy服務器。我工作,但問題是消息不會以循環模式發佈。消息只在一臺服務器上發佈。我的要求是否有不同的配置?爲rabbitmq配置HAProxy

我在/etc/haproxy/haproxy.cfg configureation

listen rabbitmq 0.0.0.0:5672 
    mode tcp 
    stats enable 
    balance roundrobin 
    option tcplog 
    no option clitcpka 
    no option srvtcpka 
    server rabbit01 46.XX.XX.XX:5672 check 
    server rabbit02 176.XX.XX.XX:5672 check 
listen web-service *:80 
      mode http 
     balance roundrobin 
     option httpchk HEAD/HTTP/1.0 
     option httpclose 
     option forwardfor 
     option httpchk OPTIONS /health_check.html 
     stats enable 
     stats refresh 10s 
     stats hide-version 
     stats scope . 
     stats uri  /lb?stats 
     stats realm LB2\ Statistics 
     stats auth admin:Adm1nn 

更新:

我已經做這方面的一些[R & d,發現HAProxy的是循環賽上的連接rabbitmq服務器。例如:如果我請求10個連接,那麼它會循環遍歷我的2個rabbitmq服務器上的10個連接併發布消息。

但問題是我想輪循消息,而不是連接它應該由HAProxy服務器管理。即如果我一次發送1000 msg到HAProxy,那麼500 msg應該去兔子服務器1,500 msg應該去兔子服務器2。我必須遵循什麼樣的配置?

更新:

我還與leastconn測試的平衡,但在意外HAProxy的行爲。我已經在serverfault.com

+0

當你說它的工作原理,但消息只發布在一臺服務器上,當然這表明它不工作?從HAProxy機器可以與兩個服務器建立AMQP連接?我注意到他們在不同的網絡上,你可以發佈統計頁面的屏幕截圖,以便我們看到HAProxy正在做什麼。順便說一下,你的目標是什麼?如果通過扇出交換可能更好地管理某些內容,則使用HAProxy將RR消息發送到不同的服務器。 –

+0

史蒂夫馬丁。感謝您的回覆。我的HAproxy服務器能夠連接兩個Rabbitmq服務器。我的目標是連接應該由HAProxy管理。例如,如果我在HAProxy後面有2個兔子服務器併發布1000條消息,那麼500 msg應該放入rabbit1,並且500 msg應該保留。如果我在HAProxy服務器中動態添加rabbitmq服務器,HAP應該在所有的兔子服務器之間進行分配。目前我正在忍受的是所有1000 msg在rabbit1中,而不是在兩者中。 –

+0

啊,只是仔細看看你的HAP配置。您將兩臺服務器都配置爲「備份」。將在答案中發佈建議... –

回答

5

得到的消息發佈到交換這將路線的隊列。

您可能沒有使用{「x-ha-policy」,「all」}配置您的隊列。根據交換路由在兩個節點上工作的事實,這可能是你所缺少的。

注意:Pre Rabbit 3.0會聲明一個帶有x-ha-policy參數的隊列,它將被鏡像。使用rabbit 3.0,你需要應用一個策略(ha-mode = all)。您可以通過api或api工具(rabbitmqctl,management gui)設置策略。即

rabbitmqctl set_policy -p '/' MirrorAllQueues '.+' '{"ha-mode": "all"}'

+1

建議您詳細說明如何以這種方式配置隊列。 – JoshDM

0

上發佈了這個問題。從服務器定義中刪除'備份'。

備份服務器是在所有其他服務器關閉時使用的備份服務器。將所有服務器指定爲backup而不使用option allbackups可能會產生不利後果。

你的配置的相關部分更改爲以下:

listen rebbitmq *:5672 
     mode tcp 
     balance roundrobin 
     stats enable 
     option forwardfor 
     option tcpka 
     server web2 46.XX.XX.XXX:5672 check inter 5000 
     server web1 176.XX.XX.XX:5672 check inter 5000 
+0

哦,也擺脫'選項forwardfor',因爲這只是真正有意義的http –

+0

謝謝史蒂夫馬丁。已經嘗試過。但未能實現目標。我更新了問題中的配置代碼。 –

+0

HAP統計頁面對它與Rabbit服務器的連接說了些什麼? –

2

的AMQP協議被設計成使用持續連接,這意味着你不會得到每AMQP的消息一個新的連接(以避免不斷地重新連接的開銷)。這意味着負載平衡器(如HAProxy)無法有效平衡您的消息 - 它只能幫助平衡您的連接

因此,你不能達到你所說的目標。但是,如果您的實際目標是將消息平均分配給那些RabbitMQ實例的消費者,則可以使用Karsten描述的羣集,或者您可以使用federation

聯合會設置:

首先,你需要啓用聯盟插件:

rabbitmq-plugins enable rabbitmq_federation 
rabbitmq-plugins enable rabbitmq_federation_management 

然後爲每個服務器的登錄到RabbitMQ的網頁UI作爲管理員轉到管理>「聯合會上游「>」添加新的上游「並將其他服務器添加爲上游。

現在您需要爲每個想要聯合的交換/隊列定義策略。我只設法讓聯盟在隊列中工作,所以我會先嚐試一下。轉到管理>「策略」>「添加/更新策略」並添加一個針對您想要聯合的隊列的策略。