天天看點

Windows 下搭建RabbitMQ叢集

RabbitMQWindows叢集操作

3、分别在每個叢集機器上面配置hosts檔案,裡面是機器的IP位址和機器的名稱

例如:192.168.1.26 rabbitmqwin1

           192.168.1.40 rabbitmqwin2

4、叢集時需要保證erlang的cookie各個機器一緻,否則無法通信。

任意選擇一台叢集中的機器,進入到C:\Windows目錄下,找到.erlang.cookie檔案,複制該檔案并替換其他各個機器,再把該檔案複制到每台叢集機器的目錄:C:\Users\Administrator  下。保證所有機器下面的這兩個目錄下的cookie檔案内容一緻。

5、指令行方式

将各節點的rabbitmq服務開啟: rabbitmq-service start 

選擇其中一個節點将其停止: rabbitmqctl stop_app

将步驟2中的機器加入叢集: rabbitmqctl join_cluster (--ram) rabbit@hostname

(ram 為記憶體節點, 預設情況下為disc磁盤節點) 注意此時的node在windows機器下面是大寫的。

開啟rabbitmq服務: rabbitmqctl start_app

檢視叢集狀況: rabbitmqctl cluster_status

*以上是單個節點加入叢集的方式,隻要一個節點加入到叢集中的任何一個節點,該節點就算是加入到了叢集中.

6、自動化叢集

2  關閉所有節點的服務: rabbitmqctl stop_app, rabbitmqctl reset, rabbitmqctl stop

2  在各節點機器下C:\Users\Administrator\AppData\Roaming\RabbitMQ 建立rabbitmq.config檔案, 内容為

[{rabbit, [{cluster_nodes, {['rabbit@hostname', 'rabbit@hostname'], disc}}]}].

該配置方式和指令行一樣,可以一次将所有節點都寫在配置中,也可以隻寫叢集中的一個節點,disc也可改為ram

2  啟動所有節點: rabbitmq-server –detached

2  檢視叢集狀況: rabbitmqctl cluster_status

 在鏡像狀況下檢視隊列的Mater-Slave關系

rabbitmqctl -n [nodename] list_queues name pid slave_pids

在鏡像狀況下檢視隊列的Mater-Slave關系及隊列的同步狀況

rabbitmqctl -n [nodename] list_queues name pid slave_pids synchronised_slave_pids

更多指令請看:

<a href="http://www.rabbitmq.com/man/rabbitmqctl.1.man.html" target="_blank">http://www.rabbitmq.com/man/rabbitmqctl.1.man.html</a>

Windows下的rabbitmq的開啟與停止也可以在計算機服務中進行手動的開啟和停止的。盡量不要用自帶的服務,可以使其停止。

 erlang profiler tool:

 C:\Program Files\erl5.10.1\lib\observer-1.3\priv\bin

隊列鏡像

鏡像的意義:

因為叢集隻是将各個node的中繼資料複制到各個node,但是每個node的queue及其内容不會複制過去,是以當發生某個node down了,那麼這個節點的隊列内容就丢失了,而鏡像則是将queue中的内容複制到設定的其他node中。

Mirrio Queue Behavior

2.1    一個隊列鏡像會在各個node中建立master-slave隊列,一旦master中的隊列接   收到了消息,則該消息會同步到slave的隊列中,并且保證順序一緻。

2.2    如果鏡像隊列的slave node挂了,那麼client不會有什麼影響或收到通知

2.3    如果鏡像隊列的master node挂了,那麼其中一個slave會自動接替為master,并會發生如下變化:

2.3.1          最老的那個slave會被提升為master,因為它最有可能包含最多的master消息,如果之前沒有同步,則master中的部分消息會丢失.

2.3.2          Slave node會認為之前所有的consumers突然斷線,結果就是它會将所有已發出但是還沒收到确認的消息重新發送出去,可能consumers已經接收過了,但是對于new master來說,它别無選擇。

2.3.3          如果consumer client支援Consumer Cancellation Notifications擴充,那麼将會接收一個通知,表明他們訂閱的鏡像隊列已經突然取消了。這時應該re-consume new master的鏡像隊列,需要重新和存活下來的叢集node建立連接配接。

2.3.4          對于re-comsume 來說,有可能會接收到之前接收過的消息

2.4    Publish client 仍然會接收到confirm消息即便是master(或任何slave)在消息釋出後和confirm消息在發送過程中fail了。

2.5    鏡像隊列支援Confirm和Transactions,當鏡像隊列中所有的節點的隊列都得到應用之後,confirm或transactions才會被認為成功。

未同步的Slaves

一個新的node加入到cluster後,該node中的隊列是空的,不包含任何已有的隊列中的内容,目前,沒有對已有内容的同步協定。隻能從加入之後開始同步接收到的消息。當之前已有的消息都被取走以後,那麼該隊列才會被認為是和master中的相關隊列同步了。是以建議在配置鏡像之前就先将各個node加入到cluster,這樣就能確定所有Node中的鏡像隊列都是已同步的。

可以通過以下指令檢視已同步的slaves:

Rabbitmqctl list_queues name slave_pids synchronised_slave_pids

開始和停止node

如果停止了包含鏡像master隊列的node, 那麼其他的slave會被提升為master。如果繼續停止,則最後一個node(支援持久化)停止後,它的鏡像隊列的内容會在該node重新開機以後恢複,但是如果這時重新開機了其他的node,則那麼node會重新加入鏡像隊列,不過它們本地所包含的内容或被丢棄,就好像它們是新加入的一樣。

配置鏡像

隊列通過policy開啟鏡像功能。在任何時候可以修改policy,也可以先建立非鏡像隊列,然後讓它變成鏡像隊列,反之亦然。非鏡像隊列相比鏡像隊列會運作得更快,因為它不包含額外的鏡像基礎結構。

ha-mode

ha-params

Result

all

比對policy的隊列會在所有的node中建立鏡像,當一個新的node加入,自動在該node中建立那個比對的隊列

exactly

數量

在指定數量的nodes中建立比對policy隊列鏡像。如果cluster中node個數少于指定數量,則同all.如果多于指定數量,并且其中包含鏡像的node挂了,那麼不會在其他沒有建立鏡像的node中建立鏡像

nodes

node names

在指定名字的node中建立比對policy隊列的鏡像。如果cluster中不包含任何指定的node,不會引發錯誤。如果指定的node在隊列聲明時都不線上,那麼隊列将會在client連接配接的那個node上建立。

      案例:

      建立一個名字以ha.開頭的隊列的鏡像到叢集中所有的nodes中

rabbitmqctl

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'

rabbitmqctl (Windows)

rabbitmqctl set_policy ha-all "^ha\." "{""ha-mode"":""all""}"

HTTP API

PUT /api/policies/%2f/ha-all {"pattern":"^ha\.", "definition":{"ha-mode":"all"}}

Web UI

Navigate to Admin &gt; Policies &gt; Add / update a policy.

Enter "ha-all" next to Name, "^ha\." next to Pattern, and "ha-mode" = "all" in the first line next to Policy.

Click Add policy.

       建立一個名字以two.開頭的隊列的鏡像到叢集中任意2個nodes中:

rabbitmqctl set_policy ha-two "^two\." \

   '{"ha-mode":"exactly","ha-params":2}'

rabbitmqctl set_policy ha-two "^two\." ^

   "{""ha-mode"":""exactly"",""ha-params"":2}"

PUT /api/policies/%2f/ha-two {"pattern":"^two\.", "definition":{"ha-mode":"exactly", "ha-params":2}}

Enter "ha-two" next to Name and "^two\." next to Pattern.

Enter "ha-mode" = "exactly" in the first line next to Policy, then "ha-params" = 2 in the second line, and set the type on the second line to "Number".

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1886596,如需轉載請自行聯系原作者

繼續閱讀