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

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          概述

          RabbitMQ broker是一個(gè)或多個(gè)Erlang節(jié)點(diǎn)的邏輯分組,多個(gè)運(yùn)行的RabbitMQ應(yīng)用程序可共享用戶,虛擬主機(jī),隊(duì)列,交換機(jī),綁定以及運(yùn)行時(shí)參數(shù)。有時(shí)我們將多個(gè)節(jié)點(diǎn)的集合稱為集群。

          什么是復(fù)制?

          RabbitMQ broker操作所需的所有數(shù)據(jù)/狀態(tài)都可以在多個(gè)節(jié)點(diǎn)間復(fù)制. 例外是消息隊(duì)列,默認(rèn)情況下它駐留在一個(gè)節(jié)點(diǎn), 盡管它們對(duì)所有節(jié)點(diǎn)來(lái)說(shuō),是可見的,可達(dá)的.要在集群中跨節(jié)點(diǎn)復(fù)制隊(duì)列,可參考high availability 文檔(注意,你仍然先需要一個(gè)工作集群).

          主機(jī)名解析需求

          RabbitMQ節(jié)點(diǎn)彼此之間使用域名,要么是簡(jiǎn)短的,要么是全限定的(FQDNs). 因此,集群中所有成員的主機(jī)名都必須是可解析的,也可用于機(jī)器上的命令行工具,如rabbitmqctl.

          主機(jī)名解析可使用任何一種標(biāo)準(zhǔn)的操作系統(tǒng)提供方法:

          • DNS 記錄
          • 本地主機(jī)文件(e.g. /etc/hosts)
          在更加嚴(yán)格的環(huán)境中,DNS記錄或主機(jī)文件修改是受限的,不可能的或不受歡迎的, Erlang VM可通過(guò)使用替代主機(jī)名解析方法來(lái)配置, 如一個(gè)替代的DNS服務(wù)器,一個(gè)本地文件,一個(gè)非標(biāo)準(zhǔn)的主機(jī)文件位置或一個(gè)混合方法. 這些方法可以與標(biāo)準(zhǔn)操作主機(jī)名解析方法一起協(xié)同工作。

          要使用FQDNs, 參考RABBITMQ_USE_LONGNAME in the Configuration guide.

          集群構(gòu)成

          集群可以通過(guò)多種方式來(lái)構(gòu)建:

          一個(gè)集群的構(gòu)成可以動(dòng)態(tài)修改. 所有RabbitMQ brokers開始都是以單個(gè)節(jié)點(diǎn)來(lái)運(yùn)行的. 這些節(jié)點(diǎn)可以加入到集群中, 隨后也可以脫離集群再次成為單一節(jié)點(diǎn)。

          故障處理

          RabbitMQ brokers 可以容忍個(gè)別節(jié)點(diǎn)故障. 節(jié)點(diǎn)可以隨意地啟動(dòng)和關(guān)閉,只要在已知關(guān)閉的時(shí)間內(nèi)能夠聯(lián)系到集群節(jié)點(diǎn).

          RabbitMQ 集群有多種模式來(lái)處理網(wǎng)絡(luò)分化, 主要是一致性方向. 集群是在LAN中使用的,不推薦在WAN中運(yùn)行集群. Shovel 或 Federation 插件對(duì)于跨WAN連接brokers ,有更好的解決方案. 注意 Shovel 和 Federation 不等同于集群.

          磁盤和內(nèi)存節(jié)點(diǎn)

          節(jié)點(diǎn)可以是磁盤節(jié)點(diǎn),也可以是內(nèi)存節(jié)點(diǎn)。多數(shù)情況下,你希望所有的節(jié)點(diǎn)都是磁盤節(jié)點(diǎn),但RAM節(jié)點(diǎn)是一種特殊情況,它可以提高集群中隊(duì)列和,交換機(jī),綁定的性能. 當(dāng)有疑問(wèn)時(shí),最好只使用磁盤節(jié)點(diǎn)。

          集群文字記錄(Transcript)

          下面是通過(guò)三臺(tái)機(jī)器-rabbit1rabbit2rabbit3來(lái)設(shè)置和操作RabbitMQ集群的文字記錄.

          我們假設(shè)用戶已經(jīng)登錄到這三臺(tái)機(jī)器上,并且都已經(jīng)在機(jī)器上安裝了RabbitMQ,以及rabbitmq-server 和rabbitmqctl 腳本都已經(jīng)在用戶的PATH環(huán)境變量中.

          This transcript can be modified to run on a single host, as explained more details below.

          節(jié)點(diǎn)(以及CLI工具)之間如何來(lái)認(rèn)證: Erlang Cookie

          RabbitMQ 節(jié)點(diǎn)和CLI 工具(如rabbitmqctl) 使用cookie來(lái)確定每個(gè)節(jié)點(diǎn)之間是否可以通信. 兩個(gè)節(jié)點(diǎn)之間要能通信,它們必須要有相同的共享密鑰Erlang cookie. cookie只是具有字母數(shù)字特征的字符串。只要你喜歡,它可長(zhǎng)可短. 每個(gè)集群節(jié)點(diǎn)必須有相同的cookie.

          當(dāng)RabbitMQ 服務(wù)器啟動(dòng)時(shí),Erlang VM 會(huì)自動(dòng)地創(chuàng)建一個(gè)隨機(jī)的cookie文件. 最簡(jiǎn)單的處理方式是允許一個(gè)節(jié)點(diǎn)來(lái)創(chuàng)建文件,然后再將這個(gè)文件拷貝到集群的其它節(jié)點(diǎn)中。

          在 Unix 系統(tǒng)中, cookie的通常位于/var/lib/rabbitmq/.erlang.cookie 或$HOME/.erlang.cookie.

          在Windows中, 其位置在C:\Users\Current User\.erlang.cookie(%HOMEDRIVE% + %HOMEPATH%\.erlang.cookie) 或C:\Documents and Settings\Current User\.erlang.cookie, 對(duì)于RabbitMQ Windows service其位置在C:\Windows\.erlang.cookie。如果使用了Windows service ,  cookie可被放于這兩個(gè)位置中.

          作為替代方案,你可以在 rabbitmq-server 和 rabbitmqctl 腳本中調(diào)用erl時(shí),插入"-setcookie cookie"選項(xiàng).

          當(dāng)cookie未配置時(shí) (例如,不相同), RabbitMQ 會(huì)記錄這樣的錯(cuò)誤"Connection attempt from disallowed node" and "Could not auto-cluster".

          啟動(dòng)獨(dú)立節(jié)點(diǎn)

          集群可通過(guò)重新配置,而將現(xiàn)有RabbitMQ 節(jié)點(diǎn)加入到集群配置中. 因此第一步是以正常的方式在所有節(jié)點(diǎn)上啟動(dòng)RabbitMQ:

          rabbit1$ rabbitmq-server -detached 
          rabbit2$ rabbitmq-server -detached
          rabbit3$ rabbitmq-server -detached

          這會(huì)創(chuàng)建三個(gè)獨(dú)立的RabbitMQ brokers, 每個(gè)節(jié)點(diǎn)一個(gè),可通過(guò)cluster_status命令來(lái)驗(yàn)證:

          rabbit1$ rabbitmqctl cluster_status 
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}] ...done.
          rabbit3$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit3 ... [{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}] ...done.

          rabbitmq-server shell腳本來(lái)啟動(dòng)RabbitMQ broker的節(jié)點(diǎn)名稱是rabbit@shorthostname,在這里,短節(jié)點(diǎn)名稱是小寫的(如上面的rabbit@rabbit1). 如果在windows上,你使用rabbitmq-server.bat批處理文件來(lái)啟動(dòng),短節(jié)點(diǎn)名稱是大寫的(如:rabbit@RABBIT1). 當(dāng)你輸入節(jié)點(diǎn)名稱時(shí),不論是大寫還是小寫的,這些字符串都必須精確匹配。

          創(chuàng)建集群

          為了把這三個(gè)節(jié)點(diǎn)構(gòu)建到一個(gè)集群中,我們可以告訴其中的兩個(gè)節(jié)點(diǎn), 假設(shè)為rabbit@rabbit2 和 rabbit@rabbit3, 將加入到第三個(gè)節(jié)點(diǎn)的集群中,這第三個(gè)節(jié)點(diǎn)假設(shè)為rabbit@rabbit1.

          首先我們將rabbit@rabbit2加入到rabbit@rabbit1的集群中. 要做到這一點(diǎn),我們必須在rabbit@rabbit2 上停止RabbitMQ應(yīng)用程序,并將其加入到rabbit@rabbit1 集群中, 然后再重啟RabbitMQ 應(yīng)用程序. 

          注意:加入集群會(huì)隱式地重置節(jié)點(diǎn), 因此這會(huì)刪除此節(jié)點(diǎn)上先前存在的所有資源和數(shù)據(jù).(如何備份數(shù)據(jù))

          rabbit2$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit2 ...done.
          rabbit2$ rabbitmqctl join_cluster rabbit@rabbit1
          Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
          rabbit2$ rabbitmqctl start_app
          Starting node rabbit@rabbit2 ...done.

          在每個(gè)節(jié)點(diǎn)上通過(guò)運(yùn)行cluster_status 命令,我們可以看到兩個(gè)節(jié)點(diǎn)已經(jīng)加入了集群:

          rabbit1$ rabbitmqctl cluster_status 
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}] ...done.

          現(xiàn)在我們將rabbit@rabbit3節(jié)點(diǎn)加入到同一個(gè)集群中. 操作步驟同上面的一致,除了這次我們選擇rabbit2來(lái)加入集群,但這并不重要:

          rabbit3$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit3 ...done.
          rabbit3$ rabbitmqctl join_cluster rabbit@rabbit2
          Clustering node rabbit@rabbit3 with rabbit@rabbit2 ...done.
          rabbit3$ rabbitmqctl start_app
          Starting node rabbit@rabbit3 ...done.

          在任何一個(gè)節(jié)點(diǎn)上通過(guò)運(yùn)行cluster_status命令,我們可以看到三個(gè)節(jié)點(diǎn)已經(jīng)加入了集群:

          rabbit1$ rabbitmqctl cluster_status 
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit3,rabbit@rabbit2,rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit3,rabbit@rabbit1,rabbit@rabbit2]}] ...done.
          rabbit3$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit3 ... [{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit2,rabbit@rabbit1]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}] ...done.

          通過(guò)上面的步驟,當(dāng)集群運(yùn)行的時(shí)候,我們可以在任何時(shí)候?qū)⑿碌墓?jié)點(diǎn)加入到集群中.

          重啟集群節(jié)點(diǎn)

          注意,加入到集群中的節(jié)點(diǎn)可在任何時(shí)候停止, 對(duì)于崩潰來(lái)說(shuō)也沒(méi)有問(wèn)題. 在這兩種情況下,集群剩余的節(jié)點(diǎn)將不受影響地繼續(xù)操作,當(dāng)它們重啟的時(shí)候,這些崩潰的節(jié)點(diǎn)會(huì)再次自動(dòng)追趕上其它的集群節(jié)點(diǎn)。

          我們關(guān)閉了節(jié)點(diǎn)rabbit@rabbit1和rabbit@rabbit3,并在每步觀察集群的狀態(tài):

          rabbit1$ rabbitmqctl stop 
          Stopping and halting node rabbit@rabbit1 ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit3,rabbit@rabbit2]}] ...done.
          rabbit3$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit3 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit3]}] ...done.
          rabbit3$ rabbitmqctl stop
          Stopping and halting node rabbit@rabbit3 ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit2]}] ...done.

          譯者注:關(guān)閉了rabbit1節(jié)點(diǎn)后,運(yùn)行的節(jié)點(diǎn)已經(jīng)沒(méi)有rabbit1節(jié)點(diǎn)了

          現(xiàn)在我們?cè)俅螁?dòng)節(jié)點(diǎn),并檢查集群狀態(tài):

          rabbit1$ rabbitmq-server -detached 
          rabbit1$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}] ...done.
          rabbit3$ rabbitmq-server -detached
          rabbit1$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}] ...done.
          rabbit3$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit3 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1,rabbit@rabbit3]}] ...done.

          這里有一些重要的警告:

          • 當(dāng)整個(gè)集群崩潰的時(shí)候, 最后一個(gè)崩潰的節(jié)點(diǎn)必須第一個(gè)上線.如果不是這樣,節(jié)點(diǎn)將會(huì)等待最后一個(gè)磁盤節(jié)點(diǎn)30秒以確認(rèn)其重新上線,否則就會(huì)失敗. 如果最后一個(gè)下線的節(jié)點(diǎn),不能再重新上線,那么它可能會(huì)使用forget_cluster_node命令來(lái)從集群中刪除 - 查閱 rabbitmqctl頁(yè)面來(lái)了解更多信息.
          • 如果所有集群節(jié)點(diǎn)都在同一個(gè)時(shí)間內(nèi)停止且不受控制(如斷電)。在這種情況下,你可以在某個(gè)節(jié)點(diǎn)上使用force_boot命令使其再次成為可啟動(dòng)的-查閱 rabbitmqctl頁(yè)面來(lái)了解更多信息.

          脫離集群

          當(dāng)節(jié)點(diǎn)不再是集群的一部分時(shí),可以明確地將其從集群中刪除. 首先我們將節(jié)點(diǎn)rabbit@rabbit3從集群中刪除, 以使其回歸獨(dú)立操作.要做到這一點(diǎn),需要在rabbit@rabbit3節(jié)點(diǎn)上停止RabbitMQ 應(yīng)用程序,重設(shè)節(jié)點(diǎn),并重啟RabbitMQ應(yīng)用程序.

          rabbit3$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit3 ...done.
          rabbit3$ rabbitmqctl reset
          Resetting node rabbit@rabbit3 ...done.
          rabbit3$ rabbitmqctl start_app
          Starting node rabbit@rabbit3 ...done.

          在節(jié)點(diǎn)上運(yùn)行cluster_status 命令來(lái)確認(rèn)rabbit@rabbit3節(jié)點(diǎn)現(xiàn)在已不再是集群的一部分,并且會(huì)獨(dú)自操作:

          rabbit1$ rabbitmqctl cluster_status 
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}] ...done.
          rabbit3$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit3 ... [{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}] ...done.

          我們也可以遠(yuǎn)程地刪除節(jié)點(diǎn),這是相當(dāng)有用的,舉例來(lái)說(shuō),當(dāng)處理無(wú)反應(yīng)的節(jié)點(diǎn)時(shí).舉例來(lái)說(shuō),我們可以從 rabbit@rabbit2中刪除rabbit@rabbi1.

          rabbit1$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit1 ...done.
          rabbit2$ rabbitmqctl forget_cluster_node rabbit@rabbit1
          Removing node rabbit@rabbit1 from cluster ... ...done.

          注意,rabbit1仍然認(rèn)為它與rabbit2處在一個(gè)集群中,但嘗試啟動(dòng)時(shí)會(huì)出現(xiàn)一個(gè)錯(cuò)誤.這時(shí),我們需要對(duì)其進(jìn)行重置以使其能再次啟動(dòng).

          rabbit1$ rabbitmqctl start_app 
          Starting node rabbit@rabbit1 ... Error: inconsistent_cluster: Node rabbit@rabbit1 thinks it's clustered with node rabbit@rabbit2, but rabbit@rabbit2 disagrees
          rabbit1$ rabbitmqctl reset
          Resetting node rabbit@rabbit1 ...done.
          rabbit1$ rabbitmqctl start_app Starting node rabbit@mcnulty ... ...done.

          現(xiàn)在, cluster_status 命令會(huì)顯示三個(gè)節(jié)點(diǎn)都是獨(dú)立節(jié)點(diǎn),并且操作是獨(dú)立的:

          rabbit1$ rabbitmqctl cluster_status 
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1]}]},{running_nodes,[rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2]}] ...done.
          rabbit3$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit3 ... [{nodes,[{disc,[rabbit@rabbit3]}]},{running_nodes,[rabbit@rabbit3]}] ...done.

          注意:rabbit@rabbit2節(jié)點(diǎn)仍然殘留有集群的狀態(tài)(譯者注:怎么看出來(lái)的呢?), 但是 rabbit@rabbit1 和rabbit@rabbit3 節(jié)點(diǎn)是新鮮的RabbitMQ brokers.如果我們想重新初始化rabbit@rabbit2節(jié)點(diǎn),我們可以按其它節(jié)點(diǎn)的步驟來(lái)操作:

          rabbit2$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit2 ...done.
          rabbit2$ rabbitmqctl reset
          Resetting node rabbit@rabbit2 ...done.
          rabbit2$ rabbitmqctl start_app
          Starting node rabbit@rabbit2 ...done.

          升級(jí)集群

          當(dāng)從主版本或小版本進(jìn)行升級(jí)時(shí) (如:從3.0.x 到3.1.x,或從2.x.x 到3.x.x),或者是升級(jí)Erlang時(shí), 整個(gè)集群在升級(jí)時(shí)必須記下來(lái)(taken down) (因?yàn)榧翰粫?huì)像這樣來(lái)運(yùn)行多個(gè)混合的版本). 當(dāng)從補(bǔ)丁版本升級(jí)到另一個(gè)時(shí)(如:從3.0.x 到3.0.y)時(shí),這種情況是不會(huì)出現(xiàn)的;這些版本在集群中是可以混合使用的(例外是3.0.0不能與 3.0.x 系列后的版本混合).

          在主版本與小版本之間升級(jí)時(shí),RabbitMQ有必要的話會(huì)自動(dòng)更新其持久化數(shù)據(jù). 在集群中,此任務(wù)是由第一個(gè)磁盤節(jié)點(diǎn)來(lái)啟動(dòng)的("upgrader"節(jié)點(diǎn)). 因此在升級(jí)RabbitMQ集群時(shí),你不需要嘗試先啟動(dòng)RAM節(jié)點(diǎn),任何啟動(dòng)的RAM節(jié)點(diǎn)都會(huì)發(fā)生錯(cuò)誤,并且不能啟動(dòng).

          雖然不是嚴(yán)格必須的,但使用磁盤節(jié)點(diǎn)來(lái)作為升級(jí)節(jié)點(diǎn)通常是好的主意,最后停止那個(gè)節(jié)點(diǎn)。

          自動(dòng)升級(jí)只適用于2.1.1及其之后的版本,如果你有更早的集群 ,你必須重新構(gòu)建升級(jí).

          單臺(tái)機(jī)器上的集群

          在某些情況下,在一臺(tái)機(jī)器上運(yùn)行RabbitMQ節(jié)點(diǎn)的集群是有用的(試驗(yàn)性質(zhì)). 

          要在一臺(tái)機(jī)器上運(yùn)行多個(gè)RabbitMQ節(jié)點(diǎn),必須確保節(jié)點(diǎn)含有不同的節(jié)點(diǎn)名稱,數(shù)據(jù)存儲(chǔ)路徑,日志文件位置,綁定到不同的端口,并包含那些插件使用的端口等等 .參考配置指南中的RABBITMQ_NODENAMERABBITMQ_NODE_PORT, 和 RABBITMQ_DIST_PORT文檔 ,以及 File and Directory Locations guide指南中的 RABBITMQ_MNESIA_DIRRABBITMQ_CONFIG_FILE, and RABBITMQ_LOG_BASE。

          你可以在同一個(gè)主機(jī)上通過(guò)重復(fù)調(diào)用rabbitmq-server(rabbitmq-server.bat on Windows)來(lái)手動(dòng)地啟動(dòng)多個(gè)節(jié)點(diǎn) . 例如:

          $ RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached 
          $ RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=hare rabbitmq-server -detached
          $ rabbitmqctl -n hare stop_app
          $ rabbitmqctl -n hare join_cluster rabbit@`hostname -s`
          $ rabbitmqctl -n hare start_app

          這會(huì)設(shè)置兩個(gè)節(jié)點(diǎn)的集群,這兩個(gè)節(jié)點(diǎn)都是磁盤節(jié)點(diǎn). 注意,如果你想打開非AMQP的其它端口,你需要通過(guò)命令行進(jìn)行配置

          $ RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit rabbitmq-server -detached 
          $ RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=hare rabbitmq-server -detached

          主機(jī)名稱變更

          RabbitMQ節(jié)點(diǎn)使用主機(jī)名來(lái)相互通信.因此,所有節(jié)點(diǎn)名稱都集群中的節(jié)點(diǎn)應(yīng)該都能被解析.對(duì)于像 rabbitmqctl這樣的工具來(lái)說(shuō),也是如此.

          除此之外,默認(rèn)情況下,RabbitMQ使用當(dāng)前系統(tǒng)的主機(jī)名稱來(lái)命名數(shù)據(jù)庫(kù)目錄.如果主機(jī)名變了,將會(huì)創(chuàng)建一個(gè)空的數(shù)據(jù)庫(kù).為避免數(shù)據(jù)丟失,應(yīng)該總是設(shè)置一個(gè)固定的,可解析的主機(jī)名稱。無(wú)論何時(shí),只要主機(jī)名變化了,你就必須要重啟RabbitMQ:

          $ /etc/init.d/rabbitmq-server restart

          類似的效果可通過(guò)使用 rabbit@localhost作為broker節(jié)點(diǎn)名稱來(lái)達(dá)到。這個(gè)解決方案的影響是集群將不會(huì)工作,因?yàn)檫x中的主機(jī)名不能被遠(yuǎn)程主機(jī)所解析。當(dāng)從遠(yuǎn)程主機(jī)調(diào)用時(shí),類似地rabbitmqctl命令也會(huì)失敗. 免遭此缺點(diǎn)的復(fù)雜方案是使用DNS,如:如果運(yùn)行EC2,則使用 Amazon Route 53 。如果你想使用節(jié)點(diǎn)名稱的全限定主機(jī)名(RabbitMQ 默認(rèn)使用短名稱),那么可使用DNS解析, 可設(shè)置環(huán)境變量 RABBITMQ_USE_LONGNAME=true.


          防火墻節(jié)點(diǎn)

          當(dāng)在一個(gè)數(shù)據(jù)中心或可靠網(wǎng)絡(luò)時(shí),帶防火墻的集群節(jié)點(diǎn)是存在的,但這些節(jié)點(diǎn)通常被防火墻隔離。再一次聲明,當(dāng)各節(jié)點(diǎn)之間的網(wǎng)絡(luò)連接不穩(wěn)定時(shí),集群不建議在WAN在使用

          在多數(shù)配置中,你需要打開4369和25672端口以使用集群正常工作.

          Erlang 使用Port Mapper Daemon (epmd) 來(lái)解析集群中的節(jié)點(diǎn)名稱. 默認(rèn)epmd端口是4369,但它可以通過(guò)ERL_EPMD_PORT環(huán)境變量進(jìn)行修改.所有的節(jié)點(diǎn)都必須使用同一個(gè)端口。詳細(xì)信息可參考Erlang epmd manpage.

          一旦分布式Erlang節(jié)點(diǎn)通過(guò)empd解析后,其它節(jié)點(diǎn)將會(huì)嘗試直接通信。默認(rèn)地通信端口比RABBITMQ_NODE_PORT (即,默認(rèn)是25672)高了20000. 這可以通過(guò)RABBITMQ_DIST_PORT 環(huán)境變量修改

          跨集群Erlang版本

          集群中所有節(jié)點(diǎn)必須運(yùn)行相同版本的Erlang.

          從客戶端連接集群

          客戶端可以正常連接到集群中的任意節(jié)點(diǎn),如果那個(gè)節(jié)點(diǎn)發(fā)生故障了 ,只要有剩余集群節(jié)點(diǎn)幸存,當(dāng)客戶端發(fā)現(xiàn)在關(guān)閉的連接時(shí),它就能夠重新連接到剩余幸存的集群節(jié)點(diǎn)上。一般來(lái)說(shuō),將節(jié)點(diǎn)主機(jī)名稱或IP地址放到客戶端程序是極其不明智的,這會(huì)導(dǎo)致缺乏靈活性,并需要客戶端程序重新編輯,編譯,重新配置以適應(yīng)集群配置變化或者集群節(jié)點(diǎn)變化。相反,我們建議采用更抽象的方法: 如有簡(jiǎn)短TTL配置的動(dòng)態(tài)DNS服務(wù)或普通的TCP負(fù)載均衡器. 一般來(lái)說(shuō),這方面的管理集群內(nèi)連接節(jié)點(diǎn)是超出了RabbitMQ本身的范圍,我們建議使用其他技術(shù)專門設(shè)計(jì)來(lái)解決這些問(wèn)題。

          內(nèi)存節(jié)點(diǎn)集群

          內(nèi)存節(jié)點(diǎn)只在內(nèi)存中保存其元數(shù)據(jù)。它不會(huì)像磁盤節(jié)點(diǎn)將元數(shù)據(jù)寫入到磁盤中,但它們擁有更好的性能。 然而,也應(yīng)該注意到,由于持久化隊(duì)列數(shù)據(jù)總是存儲(chǔ)在磁盤上的,其性能提升只會(huì)影響資源管理(如: 添加/刪除隊(duì)列,交換機(jī),或虛擬主機(jī)), 但不會(huì)影響發(fā)布或消費(fèi)的速度.

          內(nèi)存節(jié)點(diǎn)是一個(gè)高級(jí)使用例子;當(dāng)設(shè)置你的第一個(gè)集群時(shí),你應(yīng)該不使用它們。你應(yīng)該用足夠的磁盤節(jié)點(diǎn)來(lái)處理冗余需求,然后如果有必要,再用內(nèi)存節(jié)點(diǎn)進(jìn)行擴(kuò)展.

          集群中只含有內(nèi)存節(jié)點(diǎn)是相當(dāng)脆弱的,如果集群停止了,你將不能再次啟動(dòng),并且會(huì)導(dǎo)致數(shù)據(jù)丟失。RabbitMQ在許多情況下,會(huì)阻止創(chuàng)建只包含內(nèi)存節(jié)點(diǎn)的集群,但不能完全阻止。

          (譯者注:在集群構(gòu)建中,最好有兩個(gè)或以上的磁盤節(jié)點(diǎn),然后再考慮使用內(nèi)存節(jié)點(diǎn)進(jìn)行擴(kuò)展)

          創(chuàng)建內(nèi)存節(jié)點(diǎn)

          當(dāng)節(jié)點(diǎn)加入集群時(shí),我們可將其聲明為內(nèi)存節(jié)點(diǎn). 我們可以通過(guò)使用像先前rabbitmqctl join_cluster命令再加--ram標(biāo)志來(lái)達(dá)到目的:

          rabbit2$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit2 ...done.
          rabbit2$ rabbitmqctl join_cluster --ram rabbit@rabbit1
          Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
          rabbit2$ rabbitmqctl start_app Starting node rabbit@rabbit2 ...done.


          rabbit1$ rabbitmqctl cluster_status 
          Cluster status of node rabbit@rabbit1 ... [{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}] ...done.
          rabbit2$ rabbitmqctl cluster_status
          Cluster status of node rabbit@rabbit2 ... [{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]}, {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}] ...done.

          改變節(jié)點(diǎn)類型

          我們可以將節(jié)點(diǎn)的類型從磁盤修改為內(nèi)存,反之亦然. 假設(shè)我們想反轉(zhuǎn)rabbit@rabbit2 和 rabbit@rabbit1的節(jié)點(diǎn)類型,即先將內(nèi)存節(jié)點(diǎn)轉(zhuǎn)換為磁盤節(jié)點(diǎn),隨后再將其從磁盤節(jié)點(diǎn)轉(zhuǎn)換為內(nèi)存節(jié)點(diǎn).要做到這點(diǎn),我們可以使用change_cluster_node_type命令. 首先節(jié)點(diǎn)必須先停止.

          rabbit2$ rabbitmqctl stop_app 
          Stopping node rabbit@rabbit2 ...done. rabbit2$
          rabbitmqctl change_cluster_node_type disc
          Turning rabbit@rabbit2 into a disc node ... ...done. Starting node rabbit@rabbit2 ...done.
          rabbit1$
          rabbitmqctl stop_app
          Stopping node rabbit@rabbit1 ...done.
          rabbit1$
          rabbitmqctl change_cluster_node_type ram
          Turning rabbit@rabbit1 into a ram node ...
          rabbit1$
          rabbitmqctl start_app
          Starting node rabbit@rabbit1 ...done.
          posted on 2016-06-05 19:53 胡小軍 閱讀(3961) 評(píng)論(0)  編輯  收藏 所屬分類: RabbitMQ
          主站蜘蛛池模板: 昆山市| 皋兰县| 保德县| 林西县| 宣化县| 华池县| 福建省| 额济纳旗| 新乡县| 同仁县| 政和县| 满城县| 莫力| 宝清县| 定兴县| 中超| 麻城市| 南木林县| 长宁县| 古蔺县| 邯郸县| 遵义市| 临朐县| 高安市| 淄博市| 陆良县| 如东县| 大新县| 黄山市| 乌兰县| 开江县| 台东市| 连江县| 天等县| 班戈县| 包头市| 晋州市| 灵台县| 高陵县| 朝阳县| 承德市|