為了簡單就用三臺服務器搭建,其中192.168.1.197為磁盤節(jié)點浑测,其他服務器為內(nèi)存節(jié)點嗤无,前面一篇文章說了rabbitmq的安裝這里就直接講配置了
主機1:192.168.1.197
主機2:192.168.1.111
主機3:192.168.1.160
1、在三臺主機上分別修改host文件
vim /etc/hosts
加上以下內(nèi)容
192.168.1.197 rabbit1
192.168.1.111 rabbit2
192.168.1.160 rabbit3
2傀履、復制主機1的cookie 到主機2和主機3
Rabbitmq的集群是依賴于erlang的集群來工作的搀玖,所以必須先構建起erlang的集群環(huán)境。Erlang的集群中各節(jié)點是通過一個magic cookie來實現(xiàn)的庶骄,這個cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中毁渗,文件是400的權限。所以必須保證各節(jié)點cookie保持一致单刁,否則節(jié)點之間就無法通信
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.1.111:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@192.168.1.160:/var/lib/rabbitmq/
3灸异、重啟rabbitmq
systemctl restart rabbitmq-server.service
4、連接集群
在主機2和主機3上分別執(zhí)行,其中--ram代表是內(nèi)存節(jié)點羔飞,如果希望是磁盤節(jié)點則不用加--ram肺樟,在rabbitmq集群中,至少需要一個磁盤節(jié)點
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app
5逻淌、查看集群
rabbitmqctl cluster_status
Rabbit模式大概分為以下三種:單主機模式么伯、普通集群模式、鏡像集群模式
單主機模式:
RabbitMQ服務運行在單獨的一臺主機中卡儒,通常生產(chǎn)環(huán)境不使用該模式田柔,性能有限俐巴,并且如果服務器宕機服務將完全不可用。
普通集群模式
一說到集群問題瞬間變得復雜多了硬爆。首先對于Queue來說消息實體只存在于其中一個節(jié)點欣舵,集群中其他節(jié)點僅有相同的元數(shù)據(jù),即隊列結構摆屯。
當消息進入A節(jié)點的Queue中后邻遏,Consumer從B節(jié)點拉取消息時糠亩,RabbitMQ會臨時在兩個節(jié)點間進行消息傳輸虐骑,把A中的消息實體取出并經(jīng)過B發(fā)送給Consumer。所以Consumer應盡量連接每一個節(jié)點赎线,從中取消息廷没。即對于同一個邏輯隊列,要在多個節(jié)點建立Queue垂寥。否則Consumer如果只連接一個節(jié)點區(qū)消息會造成該節(jié)點的性能瓶頸颠黎。
該模式存在一個問題就是當其中一個節(jié)點故障后,其他節(jié)點無法取到故障節(jié)點中還未消費的消息滞项。如果做了消息持久化狭归,那么得等A節(jié)點恢復,然后才可被消費文判;如果沒有持久化的話过椎,那就杯具了!
鏡像集群模式
前面講到RabbitMQ的普通集群模式不同節(jié)點間只同步隊列結構不同步消息戏仓。鏡像模式會把隊列結構和消息都存在于多個節(jié)點疚宇,屬于RabbitMQ的HA方案。其實質和普通模式不同之處在于赏殃,消息實體會主動在鏡像節(jié)點間同步敷待。該模式帶來的副作用也很明顯,除了降低系統(tǒng)性能外仁热,如果鏡像隊列數(shù)量過多榜揖,加之大量的消息進入,集群內(nèi)部的網(wǎng)絡帶寬將會被這種同步通訊大量消耗抗蠢。所以這種模式應用于可靠性要求較高的場合中举哟。
配置鏡像隊列
rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}' //意思表示以ha.開頭的queue都會復制到各個節(jié)點 ["^"匹配所有]
配置成功后在web界面可以看到
也可以通過web界面配置
查看
如果報以下錯誤,說明主機名沒有切換物蝙,重啟服務器即可
節(jié)點的一些操作
刪除節(jié)點
rabbitmqctl stop_app
rabbitmqctl forget_cluster_node rabbit@rabbit2
rabbitmqctl reset
一些重要的警告:
當整個集群關閉時炎滞,最后一個關閉的節(jié)點必須是第一個要聯(lián)機的節(jié)點芳室。
如果要脫機的最后一個節(jié)點無法恢復哟绊,可以使用forget_cluster_node命令將其從群集中刪除
如果所有集群節(jié)點同時停止并且不受控制(例如斷電)埋哟,則可能會留下所有節(jié)點都認為其他節(jié)點在其后停止的情況坐梯。在這種情況下,您可以在一個節(jié)點上使用force_boot命令使其再次可引導