CentOS安裝RabbitMQ集羣node
一、有3臺已安裝RabbitMQ的機器web
192.168.38.133 rabbitmq1
192.168.38.137 rabbitmq2
192.168.38.138 rabbitmq3
二、設置hosts解析,全部節點配置相同服務器
# vi /etc/hosts 192.168.38.133 rabbitmq1 192.168.38.137 rabbitmq2 192.168.38.138 rabbitmq3
三、設置節點間認證的cookiecookie
[root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.38.137:~ [root@rabbitmq1 ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.38.138:~
四、分別啓動獨立的單機版rabbitmq broker節點:app
[root@rabbitmq1 ~]# rabbitmq-server -detached [root@rabbitmq2 ~]# rabbitmq-server -detached [root@rabbitmq3 ~]# rabbitmq-server -detached
五、查看broker的集羣狀態:spa
[root@rabbitmq1 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq1 ... [{nodes,[{disc,[rabbit@rabbitmq1]}]}, {running_nodes,[rabbit@rabbitmq1]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq1,[]}]}]
六、建立broker集羣,爲了把集羣中的3個節點聯繫起來,咱們把137和138分別加入到133的集羣。先在137上stop rabbitmq,而後加到133的集羣(join cluster會隱式的重置該節點,並刪除該節點上全部的資源和數據),而後查看集羣狀態裏有了2個node。code
[root@rabbitmq2 ~]# rabbitmqctl stop_app [root@rabbitmq2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq1 [root@rabbitmq2 ~]# rabbitmqctl start_app [root@rabbitmq2 ~]# rabbitmqctl cluster_status #這時候會出現兩個節點 Cluster status of node rabbit@rabbitmq2 ... [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]}]}, {running_nodes,[rabbit@rabbitmq1,rabbit@rabbitmq2]}, {cluster_name,<<"rabbit@rabbitmq1">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq1,[]},{rabbit@rabbitmq2,[]}]}] 138服務器同理,加入集羣中
七、修改集羣的名字爲rabbit@rabbitmq1_cluster(默認是第一個node的名字):orm
[root@rabbitmq1 ~]# rabbitmqctl set_cluster_name rabbit@rabbitmq1_cluster
八、重啓集羣:經過rabbitmqctl stop、rabbitmq-server -detached來重啓集羣,觀察集羣的運行狀態變化server
九、刪除集羣節點,當一個節點不屬於這個集羣的時候,咱們須要刪除它,能夠經過本地或者遠程的方式rabbitmq
[root@rabbitmq2 ~]# rabbitmqctl stop_app [root@rabbitmq2 ~]# rabbitmqctl reset [root@rabbitmq2 ~]# rabbitmqctl start_app [root@rabbitmq2 ~]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq2 ... [{nodes,[{disc,[rabbit@rabbitmq2]}]}, {running_nodes,[rabbit@rabbitmq2]}, {cluster_name,<<"rabbit@rabbitmq2">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq2,[]}]}]
十、經過管理控制檯鏈接集羣,進行建立隊列、發佈消息、建立用戶、建立policy等
http://192.168.38.133:15672/
注:到這裏爲止,咱們建立好了一個簡單的聚合集羣。默認狀況下,集羣中的隊列存在於集羣中單個節點上,這要看建立隊列時聲明在那個節點上建立,而exchange和binding則默認存在於集羣中全部節點。在stop_app或者stop掉broker以後在133節點的上隊列,重啓133的app或broker以後,雖然集羣工做正常,但133上隊列中消息會被清空(queue仍是存在的)。對於生產環境而已,這確定是不可接受的,若是不能保證隊列的高可用,那麼作集羣的意義也不太大了,還好rabbitmq支持Highly Available Queues,下面介紹queue的HA。
十一、Queue HA配置,隊列能夠經過鏡像來提升可用性,HA依賴rabbitmq cluster,因此隊列鏡像也不適合WAN部署,每一個被鏡像的隊列包含一個master和一個或者多個slave,當master因任何緣由故障時,最老的slave被提高爲新的master。發佈到隊列的消息被複制到全部的slave上,消費者不管鏈接哪一個節點,都會鏈接到master;若是master確認要刪除消息,那麼全部slave就會刪除隊列中消息。隊列鏡像能夠提供queue的高可用性,但不能分擔負載,由於全部參加的節點都作全部的工做。
十二、配置隊列鏡像,經過policy來配置鏡像,策略可在任什麼時候候建立,好比先建立一個非鏡像的隊列,而後在鏡像,反之亦然。鏡像隊列和非鏡像隊列的區別是非鏡像隊列沒有slaves,運行速度也比鏡像隊列快。設置策略而後設置ha-mode,3中模式:all、exactly、nodes。每一個隊列都有一個home node,叫作queue master node
-> 設置policy,以ha.開頭的隊列將會被鏡像到集羣其餘全部節點,一個節點掛掉而後重啓後須要手動同步隊列消息
[root@rabbitmq1 ~]# rabbitmqctl set_policy -p AAA ha-allqueue "^ha\." '{"ha-mode":"all"}'
->設置policy,以ha.開頭的隊列將會被鏡像到集羣其餘全部節點,一個節點掛掉而後重啓後會自動同步隊列消息(生產環境建議採用這個方式)
[root@rabbitmq1 ~]# rabbitmqctl set_policy -p AAA ha-allqueue "^ha\." '{"ha-mode":"all","ha-sync-mode":"automatic"}' 註釋:AAA 是VHost名稱, ha-allqueue 是策略名稱, ^ha\. 是匹配ha.開頭的隊列,若是隻有^的話就是匹配全部隊列都會自動同步數據 ha-mode:all是同步到全部節點, ha-sync-mode:automatic 自動同步,沒有這個配置的話則須要手動同步數據
-> 在管理控制檯中設置policy
導航 -> Admin -> Policies -> Add/Update a policy
注: