Rabbitmq 相關介紹之單機普通模式集羣配置

1、說明:php

說到集羣,你們應該都不陌生,爲了提升性能須要配置集羣,而在有的時候,咱們須要在測試環境先測試而後灰度上線,因此這裏介紹在一臺服務器上配置rabbitmq集羣html

2、rabbitmq集羣模式node

一、普通模式:rabbitmq默認的集羣模式nginx

RabbitMQ集羣中節點包括內存節點、磁盤節點。內存節點就是將全部數據放在內存,磁盤節點將數據放在磁盤上。若是在投遞消息時,打開了消息的持久化,那麼即便是內存節點,數據仍是安全的放在磁盤。那麼內存節點的性能只能體如今資源管理上,好比增長或刪除隊列(queue),虛擬主機(vrtual hosts),交換機(exchange)等,發送和接受message速度同磁盤節點同樣。一個集羣至少要有一個磁盤節點。一個rabbitmq集羣中能夠共享user,vhost,exchange等,全部的數據和狀態都是必須在全部節點上覆制的,對於queue根據集羣模式不一樣,應該有不一樣的表現。在集羣模式下只要有任何一個節點可以工做,RabbitMQ集羣對外就能提供服務。web

默認的集羣模式,queue建立以後,若是沒有其它policy,則queue就會按照普通模式集羣。對於Queue來講,消息實體只存在於其中一個節點,A、B兩個節點僅有相同的元數據,即隊列結構,但隊列的元數據僅保存有一份,即建立該隊列的rabbitmq節點(A節點),當A節點宕機,你能夠去其B節點查看,./rabbitmqctl list_queues發現該隊列已經丟失,但聲明的exchange還存在。瀏覽器

當消息進入A節點的Queue中後,consumer從B節點拉取時,RabbitMQ會臨時在A、B間進行消息傳輸,把A中的消息實體取出並通過B發送給consumer,因此consumer應平均鏈接每個節點,從中取消息。該模式存在一個問題就是當A節點故障後,B節點沒法取到A節點中還未消費的消息實體。若是作了隊列持久化或消息持久化,那麼得等A節點恢復,而後纔可被消費,而且在A節點恢復以前其它節點不能再建立A節點已經建立過的持久隊列;若是沒有持久化的話,消息就會失丟。這種模式更適合非持久化隊列,只有該隊列是非持久的,客戶端才能從新鏈接到集羣裏的其餘節點,並從新建立隊列。假如該隊列是持久化的,那麼惟一辦法是將故障節點恢復起來。安全

爲何RabbitMQ不將隊列複製到集羣裏每一個節點呢?這與它的集羣的設計本意相沖突,集羣的設計目的就是增長更多節點時,能線性的增長性能(CPU、內存)和容量(內存、磁盤)。固然RabbitMQ新版本集羣也支持隊列複製(有個選項能夠配置)。好比在有五個節點的集羣裏,能夠指定某個隊列的內容在2個節點上進行存儲,從而在性能與高可用性之間取得一個平衡(應該就是指鏡像模式)。bash

二、鏡像模式:把須要的隊列作成鏡像隊列,存在於多個節點,屬於RabbitMQ的HA方案服務器

該模式解決了上述問題,其實質和普通模式不一樣之處在於,消息實體會主動在鏡像節點間同步,而不是在consumer取數據時臨時拉取。該模式帶來的反作用也很明顯,除了下降系統性能外,若是鏡像隊列數量過多,加之大量的消息進入,集羣內部的網絡帶寬將會被這種同步通信大大消耗掉。因此在對可靠性要求較高的場合中適用,一個隊列想作成鏡像隊列,須要先設置policy,而後客戶端建立隊列的時候,rabbitmq集羣根據「隊列名稱」自動設置是普通集羣模式或鏡像隊列。具體以下:cookie

隊列經過策略來使能鏡像。策略能在任什麼時候刻改變,rabbitmq隊列也近可能的將隊列隨着策略變化而變化;非鏡像隊列和鏡像隊列之間是有區別的,前者缺少額外的鏡像基礎設施,沒有任何slave,所以會運行得更快。

爲了使隊列稱爲鏡像隊列,你將會建立一個策略來匹配隊列,設置策略有兩個鍵「ha-mode和 ha-params(可選)」。ha-params根據ha-mode設置不一樣的值,下面表格說明這些key的選項,以下圖:

wKiom1m6QULj22AsAADOEuCVFCQ937.jpg

3、普通集羣模式安裝配置

官方文檔https://www.rabbitmq.com/clustering.html

一、環境
CentOS 6.7    IP 172.16.100.94   x86_64
二、軟件包版本:
erlang-20.0.4-1.el6.x86_64.rpm
rabbitmq-server-3.6.12-1.el6.noarch.rpm
三、安裝
#rpm -ivh  erlang-20.0.4-1.el6.x86_64.rpm
#yum install socat  -y   # rabbitmq-server依賴次軟件包
#rpm -ivh rabbitmq-server-3.6.12-1.el6.noarch.rpm
四、啓動3個進程(模擬3臺不一樣的node)
#RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 /etc/init.d/rabbitmq-server start 
#RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit2 /etc/init.d/rabbitmq-server start 
#RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit3 /etc/init.d/rabbitmq-server start 
查看啓動狀況
#netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name     
tcp        0      0 0.0.0.0:25672               0.0.0.0:*                   LISTEN      25527/beam.smp      
tcp        0      0 0.0.0.0:25673               0.0.0.0:*                   LISTEN      26425/beam.smp            
tcp        0      0 0.0.0.0:25674               0.0.0.0:*                   LISTEN      27310/beam.smp      
tcp        0      0 0.0.0.0:4369                0.0.0.0:*                   LISTEN      25191/epmd                 
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1778/sshd                          
tcp        0      0 :::5672                     :::*                        LISTEN      25527/beam.smp      
tcp        0      0 :::5673                     :::*                        LISTEN      26425/beam.smp      
tcp        0      0 :::5674                     :::*                        LISTEN      27310/beam.smp               
tcp        0      0 :::4369                     :::*                        LISTEN      25191/epmd          
tcp        0      0 :::22                       :::*                        LISTEN      1778/sshd  
五、結束進程命令
#rabbitmqctl -n rabbit1 stop
#rabbitmqctl -n rabbit2 stop
#rabbitmqctl -n rabbit3 stop
六、查看狀態:
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost]}]},
 {running_nodes,[rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit1@localhost,[]}]}]
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit2@localhost]}]},
 {running_nodes,[rabbit2@localhost]},
 {cluster_name,<<"rabbit2@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]}]}]
#rabbitmqctl -n rabbit3 cluster_status
Cluster status of node rabbit3@localhost
[{nodes,[{disc,[rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost]},
 {cluster_name,<<"rabbit3@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]}]}]
七、開始配置
停掉rabbit2節點的應用
#rabbitmqctl -n rabbit2 stop_app
Stopping rabbit application on node rabbit2@localhost
將rabbit2節點加入到rabbit1@localhost
#rabbitmqctl -n rabbit2 join_cluster rabbit1@localhost
Clustering node rabbit2@localhost with rabbit1@localhost
啓動rabbit2應用節點
#rabbitmqctl -n rabbit2 start_app
Starting node rabbit2@localhost
查看集羣狀態
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost]}]},
 {running_nodes,[rabbit2@localhost,rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]},{rabbit1@localhost,[]}]}]
 
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost]}]},
 {running_nodes,[rabbit1@localhost,rabbit2@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit1@localhost,[]},{rabbit2@localhost,[]}]}]
能夠看到無論是以哪個節點的身份去查,集羣中都有節點rabbit1和rabbit2
#############################################3
如今加入rabbit3
首先停掉rebbit3節點的應用
# rabbitmqctl -n rabbit3 stop_app
Stopping rabbit application on node rabbit3@localhost

# rabbitmqctl -n rabbit3 join_cluster rabbit2@localhost
Clustering node rabbit3@localhost with rabbit2@localhost
啓動
# rabbitmqctl -n rabbit3 start_app
Starting node rabbit3@localhost
查看集羣狀態
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost,rabbit2@localhost,rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]},
          {rabbit2@localhost,[]},
          {rabbit1@localhost,[]}]}]
注:已經加入羣集的節點能夠隨時中止,而且宕機對集羣來講也是沒事的,在這兩種狀況下,集羣的其
餘部分繼續運行不受影響,而且節點在從新啓動時會自動「遇上」其餘集羣節點。

4、對集羣進行測試:

咱們假設關閉rabbit1和rabbit3,在每個步驟檢查集羣狀態
一、關閉rabbit1節點
#rabbitmqctl -n rabbit1 stop             
Stopping and halting node rabbit1@localhost
二、查看集羣狀態
# rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost,rabbit2@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]},{rabbit2@localhost,[]}]}]    
能夠看到rabbit1節點已經再也不running_noeds中了,可是依然在disc列表!
#rabbitmqctl -n rabbit3 cluster_status
Cluster status of node rabbit3@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit2@localhost,rabbit3@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]},{rabbit3@localhost,[]}]}]
############################################################
#rabbitmqctl -n rabbit3 stop    #關閉rabbit3 節點
Stopping and halting node rabbit3@localhost
三、查看集羣狀態
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit2@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]}]}]
四、如今開啓關閉的節點rabbit1 和rabbit3 
#RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit1 /etc/init.d/rabbitmq-server start
#RABBITMQ_NODE_PORT=5674 RABBITMQ_NODENAME=rabbit3 /etc/init.d/rabbitmq-server start

五、再查看集羣狀態
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost,rabbit2@localhost,rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]},
          {rabbit2@localhost,[]},
          {rabbit1@localhost,[]}]}]
能夠看到3個節點都已是running狀態了。

六、爲rabbit1節點添加用戶名
#rabbitmqctl -n rabbit1 add_user admin admin123
#rabbitmqctl -n rabbit1 set_user_tags admin administrator
#rabbitmqctl -n rabbit1 set_permissions -p / admin  ".*" ".*" ".*"
七、開啓web管理界面
#rabbitmq-plugins -n rabbit1 enable rabbitmq_management   #會開啓15672端口
在瀏覽器訪問  輸入第6步設置的用戶名和密碼,界面以下:

wKiom1m6TNjzFGlbAADdAuD1MoU197.jpg

注:rabbit2和rabbit3之因此是×××狀態,紅色小箭頭也解釋了。由於咱們是在一臺服務器模擬的3個節點,rabbitmq_management界面啓動以後,端口是15672,只啓動了一個,再啓動rabbit2的時候,提示端口被佔用,目前不知道如何爲管理界面指定不一樣的端口,後面會繼續研究……

5、退出集羣和重啓集羣

一、退出集羣
當節點再也不成爲集羣中的一部分時,須要從集羣中明確刪除節點,咱們以rabbit3節點爲例子:
#rabbitmqctl -n rabbit3 stop_app
#rabbitmqctl -n rabbit3 reset
#rabbitmqctl -n rabbit3 start_app
查詢狀態
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost]}]},
 {running_nodes,[rabbit2@localhost,rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]},{rabbit1@localhost,[]}]}]
####################################################
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost]}]},
 {running_nodes,[rabbit1@localhost,rabbit2@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit1@localhost,[]},{rabbit2@localhost,[]}]}]
#####################################################
#rabbitmqctl -n rabbit3 cluster_status
Cluster status of node rabbit3@localhost
[{nodes,[{disc,[rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost]},
 {cluster_name,<<"rabbit3@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]}]}]
能夠看到節點3已經被移除了集羣!
#####################################################
咱們也能夠遠程刪除節點,例如當必須處理一個無響應的節點的時候,能夠從rabbit2@localhost中刪除rabbit1@localhost         
#rabbitmqctl -n rabbit1 stop_app          #首先停掉rabbit1節點

#rabbitmqctl -n rabbit2 forget_cluster_node rabbit1@localhost #從集羣中移除rabbit1
Removing node rabbit1@localhost from cluster

注意,rabbit1仍然認爲它與rabbit2是屬於一個集羣,當嘗試啓動它的時候將致使錯誤,咱們將須要
重置它,以便可以再次啓動它,以下:
#rabbitmqctl -n rabbit1 start_app
Starting node rabbit1@localhost
BOOT FAILED
===========
Error description:
   {error,{inconsistent_cluster,"Node rabbit1@localhost thinks it's clustered with node rabbit2@localhost, but rabbit2@localhost disagrees"}}
Log files (may contain more information):
   /var/log/rabbitmq/rabbit1.log
   /var/log/rabbitmq/rabbit1-sasl.log

Stack trace:
   [{rabbit_mnesia,check_cluster_consistency,0,
                   [{file,"src/rabbit_mnesia.erl"},{line,598}]},
    {rabbit,'-start/0-fun-0-',0,[{file,"src/rabbit.erl"},{line,273}]},
    {rabbit,start_it,1,[{file,"src/rabbit.erl"},{line,417}]},
    {rpc,'-handle_call_call/6-fun-0-',5,[{file,"rpc.erl"},{line,197}]}]

Error: {error,{inconsistent_cluster,"Node rabbit1@localhost thinks it's clustered with node rabbit2@localhost, but rabbit2@localhost disagrees"}}

#rabbitmqctl -n rabbit1 reset     #重置rabbit1節點
Resetting node rabbit1@localhost
#rabbitmqctl -n rabbit1 start_app #再開啓就不會報錯了
Starting node rabbit1@localhost
而後查看移除集羣以後的狀態
#rabbitmqctl -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost]}]},
 {running_nodes,[rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit1@localhost,[]}]}]
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit2@localhost]}]},
 {running_nodes,[rabbit2@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]}]}]
#rabbitmqctl -n rabbit3 cluster_status
Cluster status of node rabbit3@localhost
[{nodes,[{disc,[rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost]},
 {cluster_name,<<"rabbit3@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]}]}]
注:cluster_status命令如今顯示做爲獨立RabbitMQ brokers運行的全部三個節點.可是有一點須要注意
rabbit2節點保留了集羣的殘留狀態,而rabbit1和rabbit3是新近初始化的brokers。若是咱們想要從新
初始化rabbit2節點,操做以下:
#rabbitmqctl -n rabbit2 stop_app 
#rabbitmqctl -n rabbit2 reset 
#rabbitmqctl -n rabbit2 start_app
以後再查看,rabbit2就是一個新初始化的節點了,以下:
#rabbitmqctl -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit2@localhost]}]},
 {running_nodes,[rabbit2@localhost]},
 {cluster_name,<<"rabbit2@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]}]}]
 
二、集羣重啓 
當集羣重啓時,最後一個掛掉的節點應該第一個重啓,若是沒有這樣作,節點將等待30秒鐘,以便最後
一個disc節點從新聯機,並隨後失敗。
若是最後一個脫機的節點沒法恢復,則可使用forget_cluster_node命令將其從集羣中刪除。若是集羣
因特殊緣由(好比斷電),而不知道哪一個節點最後一個掛掉。可用如下方法重啓,使其再次可引導,先
在一個節點上執行,以下:
#rabbitmqctl force_boot
#service rabbitmq-server start
在其餘節點上執行
#service rabbitmq-server start

查看cluster狀態是否正常(要在全部節點上查詢)。
#rabbitmqctl cluster_status
若是有節點沒加入集羣,能夠先退出集羣,而後再從新加入集羣。

注意:上述方法不適合內存節點重啓,內存節點重啓的時候是會去磁盤節點同步數據,若是磁盤節點沒
起來,內存節點一直失敗。

6、解決單機集羣管理界面出現×××的問題(第四步驟最後)

在官網上看到了如何在一臺服務器配置三個節點,而且將其配置成集羣,以下步驟:
一、啓動三個節點
RABBITMQ_NODE_PORT=5672 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15672}]" RABBITMQ_NODENAME=rabbit1 /etc/init.d/rabbitmq-server start
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit2 /etc/init.d/rabbitmq-server start
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit3 /etc/init.d/rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.
二、查看端口
# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:25672               0.0.0.0:*                   LISTEN      17282/beam.smp      
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      125867/php-fpm      
tcp        0      0 0.0.0.0:25673               0.0.0.0:*                   LISTEN      17911/beam.smp      
tcp        0      0 0.0.0.0:25674               0.0.0.0:*                   LISTEN      20203/beam.smp      
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      125204/nginx        
tcp        0      0 0.0.0.0:4369                0.0.0.0:*                   LISTEN      17041/epmd          
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      3172/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1324/master         
tcp        0      0 :::5672                     :::*                        LISTEN      17282/beam.smp      
tcp        0      0 :::5673                     :::*                        LISTEN      17911/beam.smp      
tcp        0      0 :::5674                     :::*                        LISTEN      20203/beam.smp      
tcp        0      0 :::4369                     :::*                        LISTEN      17041/epmd          
tcp        0      0 :::22                       :::*                        LISTEN      3172/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1324/master         
三、配置集羣
#rabbitmqctl -n rabbit2 stop_app

#rabbitmqctl -n rabbit2 join_cluster rabbit1@localhost   #將rabbit2節點加入到rabbit1

#rabbitmqctl -n rabbit2 start_app

四、查看
#rabbitmqctl  -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost]}]},
 {running_nodes,[rabbit2@localhost,rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit2@localhost,[]},{rabbit1@localhost,[]}]}]
 
五、繼續添加集羣節點
#rabbitmqctl -n rabbit3 stop_app

#rabbitmqctl -n rabbit3 join_cluster rabbit2@localhost   #將rabbit3節點加入rabbit2

#rabbitmqctl -n rabbit3 start_app

六、查看集羣狀態
#rabbitmqctl  -n rabbit1 cluster_status
Cluster status of node rabbit1@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost,rabbit2@localhost,rabbit1@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]},
          {rabbit2@localhost,[]},
          {rabbit1@localhost,[]}]}]
          
#rabbitmqctl  -n rabbit2 cluster_status
Cluster status of node rabbit2@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit3@localhost,rabbit1@localhost,rabbit2@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit3@localhost,[]},
          {rabbit1@localhost,[]},
          {rabbit2@localhost,[]}]}]
          
#rabbitmqctl  -n rabbit3 cluster_status
Cluster status of node rabbit3@localhost
[{nodes,[{disc,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]}]},
 {running_nodes,[rabbit1@localhost,rabbit2@localhost,rabbit3@localhost]},
 {cluster_name,<<"rabbit1@localhost">>},
 {partitions,[]},
 {alarms,[{rabbit1@localhost,[]},
          {rabbit2@localhost,[]},
          {rabbit3@localhost,[]}]}]
七、啓動三個節點的rabbitmq-management界面
#rabbitmq-plugins -n rabbit1 enable rabbitmq_management
The following plugins have been enabled:
  amqp_client
  cowlib
  cowboy
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management
Applying plugin configuration to rabbit1@localhost... started 6 plugins.

#rabbitmq-plugins -n rabbit2 enable rabbitmq_management
Plugin configuration unchanged.
Applying plugin configuration to rabbit2@localhost... started 6 plugins.

#rabbitmq-plugins -n rabbit3 enable rabbitmq_management
Plugin configuration unchanged.
Applying plugin configuration to rabbit3@localhost... started 6 plugins.

而後能夠看到1567二、1567三、15674端口都起來了。

八、在rabbit1節點上建立用戶
rabbitmqctl -n rabbit1 add_user admin admin123
rabbitmqctl -n rabbit1 set_user_tags admin administrator
rabbitmqctl -n rabbit1 set_permissions -p / admin  ".*" ".*" ".*"
注意:節點1設置完以上這些以後,在集羣內的機器都會同步此配置,可是/etc/rabbitmq/rabbitmq.config文件不會同步。
查看vhost(/)容許哪些用戶訪問
#rabbitmqctl -n rabbit1 list_permissions -p /    #節點rabbit2和rabbit3查詢出的信息是同樣的
Listing permissions in vhost "/"
guest   .*      .*      .*
admin   .*      .*      .*
配置容許遠程訪問的用戶,rabbitmq的guest用戶默認不容許遠程主機訪問
#cat rabbitmq.config
[
{rabbit, [{tcp_listeners, [5672]}, {loopback_users, ["admin"]}]}
].
查看集羣建立了那些用戶:
#rabbitmqctl -n rabbit1 list_users
Listing users
admin   [administrator]
guest   [administrator]
刪除guest用戶:
#rabbitmqctl -n rabbit1 delete_user guest
Deleting user "guest"

而後在瀏覽器訪問,以下圖:

wKioL1nAqsaQzpAOAAEqd7gNafQ983.jpg

注意:集羣中的節點disc表示爲磁盤模式,ram表示爲內存模式。默認是disc磁盤模式,而一個集羣中最少要有一個磁盤節點。

下面咱們將rabbit2和rabbit3節點改成ram模式,操做以下

#rabbitmqctl -n rabbit2 stop_app

修改rabbit2節點disc模式爲ram模式
#rabbitmqctl -n rabbit2 change_cluster_node_type ram
Turning rabbit2@localhost into a ram node

啓動rabbit2節點
#rabbitmqctl -n rabbit2 start_app
Starting node rabbit2@localhost

節點rabbit3操做和rabbit2同樣!
########################################
注意:也能夠在加入集羣的時候設置節點模式
#rabbitmqctl -n rabbit1 stop_app
#rabbitmqctl -n rabbit2 join_cluster rabbit1@localhost --ram
#rabbitmqctl -n rabbit1 start_app

刷新管理頁面,會看到模式改變了,rabbit1是disc模式,rabbit2和rabbit3是ram模式,以下圖:

wKioL1nAr2rBNkQYAAEPkclRIrw036.jpg

注意事項:

一、cookie在全部節點上必須徹底同樣,同步時必定要注意。

二、erlang是經過主機名來鏈接服務,必須保證各個主機名之間能夠ping通。能夠經過編輯/etc/hosts來手工添加主機名和IP對應關係。若是主機名ping不通,rabbitmq服務啓動會失敗。

三、若是queue是非持久化queue,則若是建立queue的那個節點失敗,發送方和接收方能夠建立一樣的queue繼續運做。但若是是持久化queue,則只能等建立queue的那個節點恢復後才能繼續服務。

四、在集羣元數據有變更的時候須要有disk node在線,可是在節點加入或退出的時候全部的disk node必須所有在線。若是沒有正確退出disk node,集羣會認爲這個節點當掉了,在這個節點恢復以前不要加入其它節點。

參考地址:http://www.ywnds.com/?p=4741

7、rabbitmq遇到的問題

一、rabbitmq管理界面沒法啓動

#rabbitmq-plugins disable rabbitmq_management  
Error: The following plugins could not be found:
  rabbitmq_management
執行#rabbitmq-plugins set rabbitmq_management  而後再執行disable或者enable就ok了

二、rabbitmq集羣配置好以後,主機的hostname不能輕易修改,若是修改了,就會報錯提示節點找不到,由於rabbitmq集羣是以hostname爲節點建立的。


不足之處,請多多指出。

相關文章
相關標籤/搜索