隨筆 - 41  文章 - 7  trackbacks - 0
          <2016年6月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          在本章節(jié)中我們將覆蓋:
          1. 創(chuàng)建一個(gè)本地服務(wù)器集群
          2. 創(chuàng)建一個(gè)簡(jiǎn)單集群
          3. 自動(dòng)添加一個(gè)RabbitMQ 集群
          4. 引入消息負(fù)載均衡器
          5. 創(chuàng)建集群客戶端
          介紹
          RabbitMQ提供了各種各樣的特性以及集群功能.
          通過(guò)使用集群,一組適當(dāng)配置的主機(jī)的行為與單個(gè)broker實(shí)例一樣,但集群帶有下面的目的:
          1. 高可用性: 如果一個(gè)節(jié)點(diǎn)宕機(jī)了,分布式broker仍然能接受和處理消息.這方面內(nèi)容會(huì)在Chapter 7,Developing High-availability Applications中深入探討.
          2. 可伸縮的消息負(fù)載:消息路由在集群節(jié)點(diǎn)間是分布式的.
          3. 連接客戶端的伸縮性:每個(gè)節(jié)點(diǎn)都可以用來(lái)處理可用客戶端的某部分子集.
          TIP
          RabbitMQ集群節(jié)點(diǎn)應(yīng)該在LAN內(nèi). RabbitMQ 集群不能很好的容忍網(wǎng)絡(luò)分化,因?yàn)榫W(wǎng)絡(luò)分化期間,每個(gè)節(jié)點(diǎn)都是單獨(dú)工作的,目前還沒有機(jī)制來(lái)防止所謂的"split-brain syndrome" (可在 http://en.wikipedia.org/wiki/Consensus_(computer_science)找到解決這個(gè)問(wèn)題的參數(shù)).在本地網(wǎng)絡(luò)中, RabbitMQ使用短超時(shí)來(lái)確定兄弟節(jié)點(diǎn)的可用性。更多信息,可參考http://www.rabbitmq.com/nettick.html.

          RabbitMQ集群中所有節(jié)點(diǎn)除了隊(duì)列外,可以共享虛擬主機(jī),用戶,交換器的定義,物理上它們只存在于創(chuàng)建的節(jié)點(diǎn)內(nèi). 另一方面,它們是全局定義的,可通過(guò)集群的任何節(jié)點(diǎn)進(jìn)行連接。
          如果一個(gè)客戶端從還沒有創(chuàng)建隊(duì)列的節(jié)點(diǎn)上生產(chǎn)或消費(fèi)消息,其性能會(huì)降低,因?yàn)榭蛻舳诵枰鄠€(gè)跳躍才能到達(dá)物理上持有隊(duì)列的節(jié)點(diǎn)。


          TIP
          默認(rèn)情況下,隊(duì)列不會(huì)在集群節(jié)點(diǎn)間復(fù)制,因此當(dāng)出現(xiàn)節(jié)點(diǎn)故障時(shí),你可能會(huì)丟失數(shù)據(jù).可參考Chapter 7Developing High-availability Applications 來(lái)解決這個(gè)問(wèn)題。

          在章節(jié)中,我們將展示RabbitMQ集群伸縮性方面的例子,同時(shí)也會(huì)展示設(shè)計(jì)集群AMQP客戶端的正確方法.

          創(chuàng)建一個(gè)本地服務(wù)器集群
          本地集群指的是在同一臺(tái)主機(jī)上將多個(gè)RabbitMQ實(shí)例以單一集群的方式進(jìn)行配置。
          實(shí)際上,在產(chǎn)品環(huán)境中,通常來(lái)說(shuō),這沒有多大用處,因?yàn)?/span>
          它不提供任何可伸縮性和可靠性改進(jìn). 然而,創(chuàng)建本地集群來(lái)測(cè)試配置是相當(dāng)用的,如:開發(fā)PC。
          準(zhǔn)備
          為了付諸實(shí)施,我們需要安裝有RabbitMQ,并能正常運(yùn)行。即使嚴(yán)格上意義來(lái)不是必要的,我們也會(huì)安裝管理插件,就如Chapter 3Managing RabbitMQ中展示的一樣.在這種情況下,我們需要為每個(gè)broker指定不同的web控制臺(tái)TCP端口.
          如何做
          要?jiǎng)?chuàng)建一個(gè)本地集群,我們需要執(zhí)行下面的步驟:
          1. 從root shell (Linux)中,使用下面的命令來(lái)啟動(dòng)另一個(gè)RbbitMQ實(shí)例:
          env RABBITMQ_NODENAME=node01 RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]"
          rabbitmq-server -detached
          2. 使用下面的命令將此實(shí)例加入到默認(rèn)那個(gè)節(jié)點(diǎn):
          rabbitmqctl -n node01 stop_app
          rabbitmqctl -n node01 join_cluster rabbit@$HOSTNAME
          rabbitmqctl -n node01 start_app
          3. 使用下面的命令來(lái)檢查運(yùn)行的集群狀態(tài):
          rabbitmqctl cluster_status
          4. 使用下面的命令退出集群,并回歸到單獨(dú)節(jié)點(diǎn)狀態(tài):
          rabbitmqctl -n node01 stop_app
          rabbitmqctl -n node01 reset
          rabbitmqctl -n node01 start_app

          如何工作
          通過(guò)覆蓋某些配置選項(xiàng),可在同臺(tái)機(jī)器上運(yùn)行多個(gè)RabbitMQ 服務(wù)器實(shí)例. 尤其是在已經(jīng)安裝了broker的情況下,新安裝的broker必須強(qiáng)制指定不同的broker端口(默認(rèn)為5672)以及管理插件端口(默認(rèn)為15672)。
          這可以通過(guò)修改環(huán)境變量來(lái)完成(步驟1).目前,可用的RabbitMQ環(huán)境變量如下:
          1. RABBITMQ_MNESIA_BASE
          2. RABBITMQ_LOG_BASE
          3. RABBITMQ_NODENAME
          4. RABBITMQ_NODE_IP_ADDRESS
          5. RABBITMQ_NODE_PORT
          你可以在shell提示窗口中,輸入下面的命令來(lái)查看rabbitmqserver指南頁(yè)面中所有前面變量的詳細(xì)描述:
          man rabbitmq-server
          在這里,我們?cè)O(shè)置了node名稱,TCP端口,以及一些自定義參數(shù):
          RABBITMQ_NODENAME=node01
          RABBITMQ_NODE_PORT=5673
          RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]"

          TIP
          在Windows中,步驟1中的命令可通過(guò)在命令行中進(jìn)行設(shè)置.你可以將下面的腳本拷貝到一個(gè).bat文件中來(lái)達(dá)到此目的:
          set RABBITMQ_NODENAME=%1
          set RABBITMQ_NODE_PORT=%2
          set RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,%3}]" "SBIN_FULL_PATH_HERE\rabbitmq-server" -detached

          此時(shí),第二臺(tái)服務(wù)器相對(duì)于第一臺(tái)服務(wù)器來(lái)說(shuō),仍然是獨(dú)立運(yùn)行的。我們必須運(yùn)行步驟2中的三個(gè)命令,這樣兩個(gè)服務(wù)器才會(huì)綁定到同一個(gè)集群中。

          TIP
          在 Windows中,你需要使用 %COMPUTERNAME% 來(lái)代替$HOSTNAME.

          通過(guò)在集群環(huán)境中運(yùn)行提供的例子,你可以很容易地進(jìn)行檢查.節(jié)點(diǎn)上創(chuàng)建的以及代碼中使用的交換器將會(huì)復(fù)制到新添加的節(jié)點(diǎn)上,反之亦然. 可單獨(dú)訪問(wèn)http://localhost:15672 和 http://localhost:15673 管理插件來(lái)了解此種情況。
          另外, 你也可以使用-n選項(xiàng)來(lái)指定特定節(jié)點(diǎn)來(lái)執(zhí)行rabbitmqctl命令,就像步驟2和步驟4中展示的一樣. 
          如果你不使用-n選項(xiàng),命令會(huì)直接在默認(rèn)rabbitmq節(jié)點(diǎn)上執(zhí)行.
          更多
          兩個(gè)節(jié)點(diǎn)神奇般地可以互相說(shuō)話了,這要多虧它們共享了相同的Erlang cookie,因?yàn)樗鼈冊(cè)谕慌_(tái)機(jī)器上.
          事實(shí)上,多個(gè)不同RabbitMQ實(shí)例與任何Erlang分布式程序一樣,都會(huì)使用基本認(rèn)證方案.兩個(gè)應(yīng)用程序?qū)嵗芟嗷ネㄐ?,它們必須有相同?span style="background-color: inherit;">Erlang cookie(一個(gè)包含任意數(shù)據(jù)的文件).它可以是字符串,GUID,或者是你能想到的任何東西.
          TIP
          Erlang cookie事實(shí)是上一個(gè)密鑰,如果沒有適當(dāng)?shù)谋Wo(hù), Erlang則不允許使用,并且不會(huì)工作.你可以為其設(shè)置適當(dāng)?shù)臋?quán)限,如下所示:
          chmod 400 .erlang.cookie

          你可在http://www.erlang.org/doc/getting_started/conc_prog.html#id67454找到更多關(guān)于Erlang cookies的信息.
          在不同主機(jī)上搭建集群中,必須強(qiáng)制性在各個(gè)主機(jī)上使用相同的Erlang cookie,在后續(xù)食譜中我們將看到這方面的內(nèi)容。


          創(chuàng)建一個(gè)簡(jiǎn)單集群
          設(shè)置一個(gè)RabbitMQ集群也就是幾分鐘的事情,只需要配置幾個(gè)步驟,高可用集群就可以部署運(yùn)行。
          事實(shí)上,相對(duì)于本地集群,它更容易,可參考創(chuàng)建本地集群食譜,因?yàn)槊總€(gè)節(jié)點(diǎn)都會(huì)使用標(biāo)準(zhǔn)端口設(shè)置
          .
          準(zhǔn)備
          要準(zhǔn)備此食譜,你至少需要安裝在兩臺(tái)主機(jī)上安裝RabbitMQ實(shí)例,并將它們配置為獨(dú)立broker.
          TIP
          要使集群能正常工作,必須確保所有主機(jī)上的RabbitMQ和Erlang是一致的.

          主機(jī)可以是物理機(jī),也可以是云實(shí)例,還可以是虛擬機(jī)器.

          TIP
          Amazon Web Services (AWS) 預(yù)先安裝的RabbitMQ通常都是過(guò)期的,我們建議安裝主流的Linux AMI,然后安裝最新的RabbitMQ版本,可參考(http://www.rabbitmq.com/download.html).

          如何做
          在下面的步驟中,我們將節(jié)點(diǎn)命名為node01node02node03.作為一種選擇,你可以使用你當(dāng)前的主機(jī)名稱,從而可以越過(guò)步驟1到4.
          1. 如果節(jié)點(diǎn)已經(jīng)運(yùn)行,通過(guò)下面的命令來(lái)停止RabbitMQ server:
          service rabbitmq-server stop
          2. 在node01上, 在/etc/hosts中追加所有IP名稱綁定,如下所示(將你的IP地址放在這里):
          10.0.0.1 node01
          10.0.0.2 node02
          ...
          3. 從node1中拷貝下面的文件到所有其它節(jié)點(diǎn)上,以保證有相同的主機(jī)名稱定義:
          scp /etc/hosts 10.0.0.2:/etc/hosts
          scp /etc/hosts 10.0.0.3:/etc/hosts
          ...
          4. 在所有節(jié)點(diǎn)上設(shè)置本地主機(jī)名稱(每個(gè)服務(wù)器都設(shè)為不同的主機(jī)名稱):
          echo node01 > /etc/hostname
          hostname –F /etc/hostname
          然后,我們配置RabbitMQ.
          5. 從node01中拷貝RabbitMQ Erlang cookie到其它所有節(jié)點(diǎn)上:
          scp /var/lib/rabbitmq/.erlang.cookie node02:/var/lib/rabbitmq/.erlang.cookie
          scp /var/lib/rabbitmq/.erlang.cookie node03:/var/lib/rabbitmq/.erlang.cookie
          ...
          6. 重啟所有節(jié)點(diǎn)上的RabbitMQ server:
          service rabbitmq-server start
          7. 將所有節(jié)點(diǎn)加入到node01.在除node01的所有節(jié)點(diǎn)上,運(yùn)行下面的命令:
          rabbitmqctl stop_app
          rabbitmqctl join_cluster --ram rabbit@node01
          rabbitmqctl start_app

          此時(shí),集群已能正常運(yùn)行了.我們可以執(zhí)行一些更多的命令:
          1. 檢查集群狀態(tài):
          rabbitmqctl cluster_status
          2. 修改node02的節(jié)點(diǎn)類型:
          rabbitmqctl stop_app
          rabbitmqctl change_cluster_node_type disc
          rabbitmqctl stat_app
          3. 讓集群忘了node02,它是從node01來(lái)執(zhí)行的:
          rabbitmqctl forget_cluster_node rabbit@node02
          4. 讓刪除的node02忘記其集群狀態(tài).在node02上使用下面的命令:
          rabbitmqctl stop_app
          rabbitmqctl reset
          rabbitmqctl start_app

          如何工作
          集群中的所有服務(wù)器必須通過(guò)主機(jī)名來(lái)互相感知,這是很重要的,因?yàn)镮P地址對(duì)于RabbitMQ來(lái)說(shuō)還不夠。因此,你必須為所有服務(wù)器配置/etc/hosts (或者配置windows中類似的hosts文件。
          TIP
          所有節(jié)點(diǎn)都需要使用短主機(jī)(short hostnames)來(lái)尋址. 如果你試圖使用全限定域名(FQDN), RabbitMQ可能不能正常工作。

          使用外部名稱服務(wù)器也是可以的,但在這種情況下,集群需要對(duì)它進(jìn)行依賴. 通常的慣例是在集群的前端設(shè)置了一個(gè)名稱服務(wù)器,并依賴靜態(tài)主機(jī)信息來(lái)配置集群。
          在所有節(jié)點(diǎn)配置之后,需要對(duì)它們進(jìn)行同步,以在其它服務(wù)器上共享同一個(gè)cookie. cookie文件可包含任意的字符串,以在節(jié)點(diǎn)間實(shí)現(xiàn)簡(jiǎn)單地相互認(rèn)證。(步驟5)


          TIP
          通過(guò)指定-n選項(xiàng),也可以配置Erlang cookie來(lái)讓rabbitmqctl與遠(yuǎn)程節(jié)點(diǎn)一同工作.

          此時(shí),可能過(guò)下面的命令來(lái)創(chuàng)建集群:
          rabbitmqctl join_cluster --ram rabbit@node01
          如果我們正確地執(zhí)行了所有步驟,我們可以得到下面的輸出:
          Clustering node rabbit@node02 with rabbit@node01 ...
          ...done.
          通過(guò)使用 --ram 選項(xiàng),我們將RabbitMQ 節(jié)點(diǎn)類型聲明為RAM.RAM類型的節(jié)點(diǎn)不會(huì)在磁盤上保存信息,它只是比磁盤節(jié)點(diǎn)(默認(rèn)節(jié)點(diǎn)類型)更快速.
          在RabbitMQ集群的介紹中,至少在集群中有一個(gè)節(jié)點(diǎn)的類型為磁盤節(jié)點(diǎn).這樣,在服務(wù)器重啟或某個(gè)磁盤節(jié)點(diǎn)出現(xiàn)故障時(shí),所有配置(交換器,隊(duì)列等)才會(huì)安全。


          TIP
          實(shí)際上,由于你已在所有節(jié)點(diǎn)上拷貝了Erlang cookies,因此你可以通過(guò)-n選項(xiàng),可在node01上來(lái)執(zhí)行指定節(jié)點(diǎn)上的所有操作:
          rabbitmqctl -n rabbit@node02 stop_app
          rabbitmqctl -n rabbit@node02 join_cluster rabbit@node01
          rabbitmqctl -n rabbit@node02 start_app


          更多
          為了大型集群上準(zhǔn)備這種配置,通常最佳實(shí)踐是使用分布式shell前端.
          最初, dsh只能應(yīng)用于IBM AIX,但在現(xiàn)代的Linux系統(tǒng)中,你可以找到pdsh和pdcp (通常在pdsh包中)命令來(lái)執(zhí)行同樣的操作。
          你也可以在老的或window上使用相似的前端工作(如dancer工具:http://www.netfort.gr.jp/~dancer/software/dsh.html.en).
          另外,你也可以使用你喜歡的集群管理軟件來(lái)執(zhí)行相同的操作.


          也可參考
          你可在http://www.rabbitmq.com/clustering.html找到更多關(guān)于集群指南的信息.

          自動(dòng)添加一個(gè)RabbitMQ集群
          通常情況下,當(dāng)服務(wù)器啟動(dòng)時(shí),我們需要準(zhǔn)備加入集群的操作系統(tǒng)鏡像.通過(guò)一些腳本,我們可以很容易地實(shí)現(xiàn)這種任務(wù),但RabbitMQ提供了更簡(jiǎn)單的更優(yōu)雅的方法。在本食譜中,我們將進(jìn)行介紹。
          準(zhǔn)備
          為了準(zhǔn)備這個(gè)食譜,我們至少兩臺(tái)已經(jīng)安裝RabbitMQ的主機(jī),并將它們配置為獨(dú)立broker.同時(shí),這些主機(jī)還應(yīng)該有相同版本的RabbitMQ 和 Erlang.
          如何做
          在本食譜中,我們啟動(dòng)了兩個(gè)高可用性RabbitMQ核心broker,它們滿足集群正常工作,具備高可靠性的最小條件 。然后,我們將其它所有節(jié)點(diǎn)配置為自動(dòng)配置(通過(guò)在rabbitmq.config文件中編寫配置)。
          1. 配置服務(wù)器主機(jī)名已在Creating a simple cluster 食譜的步驟1 到 4中看過(guò)了.
          2. 為所有服務(wù)器配置相同的Erlang cookie.
          3. 在節(jié)點(diǎn)node01和node02上啟動(dòng)RabbitMQ,并根據(jù)它們來(lái)創(chuàng)建一個(gè)集群,正如前面食譜中看過(guò)的
          .
          4.如果節(jié)點(diǎn)已經(jīng)被使用了,重設(shè)所有其它節(jié)點(diǎn)并停止,就像下面這樣:
          rabbitmqctl stop_app
          rabbitmqctl reset
          rabbitmqctl start_app
          5. 在所有其它節(jié)點(diǎn)上,設(shè)置RabbitMQ配置文件rabbitmq.config內(nèi)容(最后的圓點(diǎn)是配置文件的一部分):
          [{rabbit,
          [{cluster_nodes, {['rabbit@node01', 'rabbit@node02'],
          ram}}]}].
          6. 在所有節(jié)點(diǎn)上重啟RabbitMQ,如下所示:
          service rabbitmq-server start

          如何工作
          這種配置最適合在預(yù)先部署OS鏡像和RabbitMQ. 這些鏡像可以在不傷害現(xiàn)有集群的情況下進(jìn)行部署和使用.
          RabbitMQ在啟動(dòng)時(shí),會(huì)讀取
           rabbitmq.config文件. RabbitMQ將忽略該節(jié)點(diǎn)的集群自動(dòng)配置,除非它是一個(gè)完全干凈的狀態(tài), 也就是要啟用集群自動(dòng)配置,需要滿足下面兩個(gè)條件中的任何一個(gè):
          1. RabbitMQ實(shí)例已經(jīng)被重置和停止,正如步驟4中所展示的一樣 
          2. RabbitMQ實(shí)例已經(jīng)安裝且從沒有啟動(dòng)過(guò)
          在后一種情況中,你不需要執(zhí)行步驟6,只需要將RabbitMQ配置文件放置到正確的位置,然后再啟動(dòng)RabbitMQ (如果我們是以鏡像方式來(lái)運(yùn)行的,那么它將在服務(wù)器啟動(dòng)時(shí),自動(dòng)運(yùn)行),隨后游戲就結(jié)束了。
          TIP
          默認(rèn)的RabbitMQ配置文件稱為rabbitmq.config,其位置根據(jù)安裝時(shí)配置是變化的.下面是典型的位置:
          1. /etc/rabbitmq/ (大多數(shù)分發(fā)是這樣)
          2. Rabbitmqdir/etc/rabbimq/ (Mac OSX)
          3. %APPDATA%\RabbitMQ\ (Windows)


          一旦節(jié)點(diǎn)啟動(dòng)了,它就會(huì)重復(fù)地嘗試連接指定節(jié)點(diǎn),作為步驟5中列表節(jié)點(diǎn)元組的第一個(gè)元素.只要它成功連上了節(jié)點(diǎn)列表中的一個(gè),它就會(huì)以RAM節(jié)點(diǎn)加入到集群中,即作為元組的第二個(gè)元素 (或者你也可以指定一個(gè)磁盤節(jié)點(diǎn)).

          介紹消費(fèi)者負(fù)載均衡器 
          為了有一個(gè)多節(jié)點(diǎn)的RabbitMQ集群, clients必須知道所有的IP地址,如果集群配置是動(dòng)態(tài)的,clients應(yīng)該收到任何變化的通知。
          此外, clients可以使用一些方法聯(lián)系很少負(fù)載的clients.
          通常的解決方案是在集群的前端增加一個(gè)負(fù)載均衡器.
          負(fù)載均衡器可以硬件解決方案或軟件包,可在一般器上進(jìn)行安裝和配置.而且,也有多種不同的負(fù)載均衡技術(shù)
          , 下面是最相關(guān)的:
          1. Round-robin name servers
          2. TCP load balancers
          TCP 負(fù)載均衡器可作為:
          1. Proxy: 在這種情況下,所有連接的接受和執(zhí)行都在負(fù)載均衡器自身上執(zhí)行
          2. Direct Server Return (DSR): 只接受連接的初始化 (SYN),然后讓客戶端與服務(wù)器在后端直接連接,而不再進(jìn)行干預(yù)(明顯的優(yōu)勢(shì)在于伸縮性和性能)
          這并不是全部,但更深入的細(xì)節(jié)已經(jīng)超出了本書的范圍. 針對(duì)我們的目的來(lái)說(shuō),我們會(huì)使用TCP 軟件負(fù)載均衡器-Crossroads (http://crossroads.e-tunity.com/).
          當(dāng)其安裝后,clients將會(huì)對(duì)它進(jìn)行連接,它會(huì)將連接轉(zhuǎn)發(fā)到后端RabbitMQ服務(wù)器,正如下圖所示:

          準(zhǔn)備
          在本食譜中,我們需要三臺(tái)機(jī)器;兩臺(tái)用于RabbitMQ集群,一個(gè)用于安裝負(fù)載均衡器.
          在這種情況下,如果clients是從Internet發(fā)起連接的話,前面兩臺(tái)服務(wù)器不需要公網(wǎng)IP地址,負(fù)載均衡器有公網(wǎng)IP就足夠了
          .

          如何做
          在這個(gè)例子中,我們采用了兩個(gè)Linux Debian (IP為 192.168.10.2、192.168.10.3) 來(lái)作 RabbitMQ服務(wù)器,一臺(tái)Linux Centos作Crossroads (with IP 192.168.10.1).
          使用兩臺(tái)機(jī)器來(lái)創(chuàng)建 RabbitMQ集群的例子,我們已經(jīng)在創(chuàng)建簡(jiǎn)單集群食譜中看過(guò)了.
          下面的步驟只針對(duì)Centos 機(jī)器(192.168.10.1):
          1. 為了編譯Crossroads, 你需要 C++ 編譯器和GNU make. 同時(shí)你也需要系統(tǒng)標(biāo)準(zhǔn)C包;執(zhí)行下面的命令來(lái)準(zhǔn)備機(jī)器:
          yum groupinstall "Development Tools"
          2. 然后, 執(zhí)行wget http://crossroads.e-tunity.com/downloads/crossroads-stable.tar.gz 下載最新的Crossroads的穩(wěn)定版本到你的源碼目錄中(如: /usr/local/src/),
          3. 使用下面的解壓命令:
          tar xvzf crossroads-stable.tar.gz
          4. 進(jìn)入解壓目錄,cd crossroads-2.74, 執(zhí)行make install, 然后等待… 最后會(huì)出現(xiàn)下面的截屏:

          5. 為RabbitMQ配置負(fù)載均衡器:
          xr -v --server tcp:0:5672 --backend 192.168.10.2:5672 --backend 192.168.10.3:5672 2>&1 >> /var/log/xr-rmq.log &
          6. 如果你啟用了RabbitMQ web管理插件(參考 Chapter 3,Managing RabbitMQ),你也可以為其創(chuàng)建一個(gè)負(fù)載均衡器:
          xr -v --server tcp:0:80 --backend 192.168.10.2:15672 --backend 192.168.10.3:15672 2>&1 >> /var/log/xr-web.log &
          7. 在瀏覽器中打開http://192.168.10.1.

          如何工作
          在創(chuàng)建簡(jiǎn)單集群之后(步驟1),我們安裝并配置了負(fù)載均衡器;對(duì)于Crossroads,我們假設(shè)你使用的是Centos Linux distribution.跟隨步驟2到5,你可以編譯和安裝Crossroads, 然后你可以配置負(fù)載均衡器角色。最初,我們使用下面的命令來(lái)運(yùn)行crossroads的負(fù)載均衡器(步驟6):
          xr -v --server tcp:0:5672 --backend 192.168.10.2:5672 
          --backend 192.168.10.3:5672
          2>&1 >> /var/log/xr-rmq.log &
          xr –v server tcp:0:5672命令將5672端口(RabbitMQ默認(rèn)TCP端口)與服務(wù)器TCP監(jiān)聽器進(jìn)行了關(guān)聯(lián)--backend 參數(shù) 用于重定向連接,在我們這里,將會(huì)重定向到192.168.10.2:5672 and 192.168.10.3:5672.
          我們使用>>/var/log/xr-rmq.log將輸出寫到日志文件中.
          為了從負(fù)載均衡器訪問(wèn)web管理插件,在步驟7中,我們使用15672端口又執(zhí)行另一個(gè)XR服務(wù)器.
          Crossroads 可使用不同的分發(fā)算法,但默認(rèn)情況下,它使用簡(jiǎn)單的 round-robin 算法,這就是說(shuō),連接會(huì)均勻地重定向到每個(gè)后端服務(wù)器上。
          此時(shí),你可以使用crossroadsIP代替服務(wù)器IP地址來(lái)運(yùn)行任何的RabbitMQ client示例.連接會(huì)自動(dòng)地轉(zhuǎn)發(fā)到后端brokers上.
          在下章節(jié)中,我們將看到負(fù)載均衡器的使用和其它高可用方案.

          更多 
          Crossroads是簡(jiǎn)單地Linux負(fù)載均衡器,可參考http://crossroads.etunity.com/documentation.xr 來(lái)了解全部信息。 另一種廣泛地負(fù)載均衡方案是HAProxy (http://haproxy.1wt.eu/)
          也可參考
          可閱讀章節(jié)-從客戶端來(lái)連接集群(http://www.rabbitmq.com/clustering.html)來(lái)了解詳情.
          創(chuàng)建集群客戶端
          當(dāng)你創(chuàng)建了簡(jiǎn)單集群后,客戶端需要指定多個(gè)broker地址來(lái)連接broker.在本食譜中,我們將看到在RabbitMQ Java client中,如何使用多個(gè)地址來(lái)連接broker.
          注意:與集群前端負(fù)載均衡器不同,在那里并不需要指定多個(gè)地址,只需要指定前端均衡器地址即可。

          準(zhǔn)備
          你需要Java 1.6+和Apache Maven.
          如何做
          首先,你需要一個(gè)簡(jiǎn)單集群
          然后,你可以使用下面的代碼來(lái)進(jìn)行連接:
          Address[] addrArr = new Address[]{ new Address("node01",portnode1), new Address("node02", portnode2)};
          connection = factory.newConnection(addrArr);

          如何工作
          在RabbitMQ包中,你可以傳遞多個(gè)host/IP給連接工廠.這種特性可用于小型和大型場(chǎng)景.例如,如果你有兩個(gè)節(jié)點(diǎn),并且你想避免使用DNS或負(fù)載均衡器,那么你可以直接在client中傳遞所有的broker地址. client會(huì)嘗試連接第一個(gè)地址,如果第一個(gè)地址連接失敗,client會(huì)在不拋出異常的情況下,繼續(xù)嘗試連接下一個(gè)地址。
          同樣的方案可應(yīng)用于更為復(fù)雜的架構(gòu).如,假設(shè)你有下面兩個(gè)主機(jī):
          1. myrmqcluster_production.internal.com
          2. myrmqcluster_maintenance.internal.com
          客戶端總是會(huì)連接production系統(tǒng),但如果production 系統(tǒng)正在維護(hù),clients會(huì)連接第二個(gè)地址.

          更多
          實(shí)際上,在沒有RabbitMQ集群的情況下,你也可以使用這種連接方法.在源碼Chapter06/Recipe06中,我們創(chuàng)建了一種虛擬算法來(lái)負(fù)載連接。 在這種情況下,你完全可以構(gòu)建兩個(gè)獨(dú)立的RabbitMQ實(shí)例.
          也可參考
          在下面的章節(jié)中,我們將看到如何通過(guò)混合集群,HA策略,客戶端技術(shù)來(lái)創(chuàng)建一個(gè)HA client.

          posted on 2016-06-15 20:54 胡小軍 閱讀(1951) 評(píng)論(2)  編輯  收藏 所屬分類: RabbitMQ

          FeedBack:
          # re: RabbitMQ-CookBook-Chapter6-Developing Scalable Applications 2016-06-17 00:27 fav
          學(xué)習(xí)中  回復(fù)  更多評(píng)論
            
          # re: RabbitMQ-CookBook-Chapter6-Developing Scalable Applications 2016-06-24 23:14 胡小軍
          @fav
          最近比較忙,今天晚上才把后面的翻譯完。有什么翻譯不對(duì)的地方,還請(qǐng)多多指教。希望在RabbitMQ的路上,大家一起前行。  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 娱乐| 长泰县| 南昌县| 聂荣县| 海伦市| 乐东| 陆丰市| 苏尼特左旗| 顺昌县| 托里县| 宜春市| 西平县| 东台市| 玉林市| 彭水| 隆尧县| 巴中市| 离岛区| 石家庄市| 桦甸市| 密山市| 无棣县| 宁河县| 栾城县| 东宁县| 古浪县| 顺平县| 乐山市| 乐安县| 库尔勒市| 潍坊市| 青田县| 民勤县| 夹江县| 玉田县| 漯河市| 深水埗区| 许昌县| 和龙市| 图木舒克市| 永登县|