CentOS7實現RabbitMQ高可用集羣

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/

1

注:到這裏爲止,咱們建立好了一個簡單的聚合集羣。默認狀況下,集羣中的隊列存在於集羣中單個節點上,這要看建立隊列時聲明在那個節點上建立,而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 自動同步,沒有這個配置的話則須要手動同步數據

2

-> 在管理控制檯中設置policy

導航 -> Admin -> Policies -> Add/Update a policy

3

注:

  1. > 當整個集羣down掉時,最 後一個down機的節點必須第一個啓動到在線狀態,若是不是這樣,節點會等待30s等最後的磁盤節點恢復狀態,而後失敗。若是最後下線的節點不能上線,能夠經過forget_cluster_node 指令來踢出集羣。
  2. > 若是全部的節點不受控制的同時宕機,好比掉電,會進入全部的節點都會認爲其餘節點比本身宕機的要晚,即本身先宕機,這種狀況下可使用force_boot指令來啓動一個節點。
相關文章
相關標籤/搜索