您好,登錄后才能下訂單哦!
這篇文章主要講解了“RabbitMQ集群如何搭建”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“RabbitMQ集群如何搭建”吧!
erlang安裝版本一致
RabbitMQ安裝版本一致
以下示例使用 192.168.73.134 和 192.168.73.135 構建 Rabbitmq 集群
RabbitMQ 是用 erlang 開發的。Cluster 非常方便,因為 erlang 本質上是一種分布式語言,但它不支持負載均衡。在第一次模擬考試中,Rabbit模式可以分為三種:單模、共模和鏡像模式。
第一次模擬考試:最簡單的情況,非集群模式。
普通模式:默認集群模式。
about Queue Message實體只存在于一個節點,A,B這兩個節點只有相同的元數據,即隊列結構。 當消息進入A節點的Queue中后,consumer從B節點被拉取時,RabbitMQ會臨時在A、B之間傳遞消息,B中的消息實體發送給consumer。 因此消費者嘗試連接每個節點并從中獲取消息。也就是說,對于同一個邏輯隊列,需要在多個節點建立物理隊列。否則不管是A還是B的消費者,出口總是在A,會有瓶頸。 這個模型有問題 A 節點故障后, B 節點無法檢索到 A 節點中尚未消費的消息實體。 如果消息持久化完成,則等待A節點恢復后才能被消費;如果沒有持久化,那么將不會有更多的節點
鏡像模式:將需要的隊列做成鏡像隊列,存在于多個節點中。屬于RabbitMQ的HA方案。
該模式解決了上述問題。其本質與普通模式的區別在于消息實體會主動在鏡像節點之間同步,而不是在鏡像節點消費者取數據時臨時拉取數據。 這種模式的副作用也很明顯。除了降低系統性能外,如果圖像隊列數量過多,大量消息進入,集群內的網絡帶寬也會被這種同步通信大量消耗。 因此適用于對可靠性要求較高的場合(后面會詳細介紹這種模式,我們目前搭建的環境就屬于這種模式)。
(1)集群中的基本概念
RabbitMQ 的集群節點包括內存節點和磁盤節點。
顧名思義,內存節點將所有數據放在內存中,而磁盤節點將數據放在磁盤上。但是,如上所述,如果在傳遞消息時開啟消息持久化,即使是內存節點,數據仍然安全地放置在磁盤上。
RabbitMQ 集群可以共享用戶、虛擬主機、隊列、交換器等。必須在所有節點上復制所有數據和狀態。例外是當前屬于創建它的節點的消息隊列,盡管它們是可見的并且可以被所有節點讀取。RabbitMQ 節點可以動態加入集群。一個節點可以加入集群,也可以從集群環集群進行基本的負載均衡。
集群中有兩種類型的節點:
內存節點:只將狀態保存到內存(例外:持久隊列的持久內容會保存到磁盤)
磁盤節點:將狀態保存到內存和磁盤。
內存節點不寫入磁盤,但性能優于磁盤節點。在一個集群中,只需要一個磁盤節點來保存狀態,
如果集群中只有內存節點,則不能停止,否則所有的狀態、消息等都會丟失。
思路:
為了實現RabbitMQ的高可用,我們先搭建普通集群模式,再配置鏡像模式,實現高可用。在Rabbit集群前面增加了一個反向代理,生產者和消費者通過反向代理訪問RabbitMQ集群。
架構如下:
(2)集群模式配置
step1:局域網配置
在安裝好的三個節點服務器中,分別修改/etc/hosts文件1. vim /etc/hosts 192.168.73.134 節點 1 192.168.73.135 節點 2
step2:為不同節點之間的相同認證設置Erlang Cookie
Erlang 集群中每個節點的魔法 cookie 來實現,這個 cookie 存儲在 /var/lib/rabbitmq/.erlang.cookie 中,該文件的權限為 400。 因此,必須保證每個節點的 cookie 一致,否則節點之間將無法通信。 從主節點采用 copy 的方式來保持 Cookie 的一致性:1. chmod 777 /var/lib/rabbitmq/.erlang.cookie2. scp -p 22 /var/lib/rabbitmq/.erlang.cookie root@192.168.73.135:/var/lib/rabbitmq/復制后,檢查文件的用戶、組和權限是否符合要求。如果沒有,請修改它。在.erlang.cookie之后恢復,否則可能會遇到錯誤:3. chown rabbitmq:rabbitmq .erlang.cookie4. chmod 400 /var/lib/rabbitmq/.erlang.cookie
step3:使用-分離運行每個節點
在RabbitMQ重啟后設置cookie:1. cd /sbin 2.rabbitmqctl停止3. rabbitmq-server 啟動 這里正常重啟可能會提示節點實例再次運行。如果出現,使用以下命令啟動:1. ps -aux | 格雷厄爾2. kill -9 {pid}3. RABBITMQ_NODE_PORT=5678 RABBITMQ_NODENAME=rabbit@node1 ./rabbitmq-server -detached RABBITMQ_NODE_PORT=5678 RABBITMQ_NODENAME=rabbit@node2 ./rabbitmq-server -detachedps:上面的5678是因為rabbitmq端口改成了5678,而且nodename和hosts的設置是一致的。 依次啟動所有節點。
step4:查看各個節點的狀態
1.查看啟動端口:netstat -lntp 活動 Internet 連接(僅限服務器) Proto Recv-Q Send-Q 本地地址 外地址 狀態 PID/程序名稱 tcp 0 0 0.0.0.0:4369 0.0.0.0:* 聽 27321/epmd tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 760/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1066/master tcp 0 0 0.0.0.0:15678 0.0.0.0:* 聽 27862/beam.smp tcp 0 0 0.0.0.0:25672 0.0.0.0:* 聽 27862/beam.smp tcp6 0 0 :::5678 :::* 聽 27862/beam.smp tcp6 0 0 :::8080 :::* 聽 964/java tcp6 0 0 :::4369 :::* 聽 27321/epmd tcp6 0 0 :::22 :::* LISTEN 760/sshd tcp6 0 0 ::1:25 :::* LISTEN 1066/master tcp6 0 0 127.0.0.1:8005 :::* 聽 964/java tcp6 0 0 :::8009 :::* 聽 964/java2.查看rabbitmq啟動狀態: rabbitmqctl -n rabbit1@node1 狀態 rabbitmqctl -n rabbit1@node2 狀態 3.訪問http://bbitraq后臺打開后,可以查看網頁是否可以訪問
step5:創建和部署集群
以rabbit@rabbitmq2和rabbit@rabbitmq1組成集群,rabbitmq2作為內存節點(一個硬盤節點就夠了); 兔子MQ2: 1.停止節點2的應用:rabbitmqctl -n rabbit@node2 stop_app 在節點 rabbit@rabbitmq2 上停止兔子應用程序 2.添加節點1作為內存節點rabbitmqctl -n rabbit@node2 join_cluster --ram rabbit@node1 集群節點 rabbit@node2 與 rabbit@node1 3、啟動節點2的應用:rabbitmqctl -n rabbit@node2 start_app 起始節點rabbit@node2
step6:查看集群狀態
1.查看節點1的集群狀態:rabbitmqctl -n rabbit@node1 cluster_status 節點rabbit@node1的集群狀態 [{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]}, {running_nodes,[rabbit@node1]}, {cluster_name,<<"rabbit@node1">>}, {分區,[]}, {警報,[{rabbit@node1,[]}]}] 2.查看節點2的集群狀態:rabbitmqctl -n rabbit@node2 cluster_status 節點rabbit@node2的集群狀態 [{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node2]}]}, {警報,[{rabbit@node1,[]}]}]3.后臺查看集群狀態:
至此,rabbitmq 集群搭建完畢。
上面配置了RabbitMQ默認的集群模式,但是不保證隊列的高可用。雖然可以將切換和綁定復制到集群中的任何節點,但不會復制隊列內容。這種模式雖然解決了一些節點壓力,但是隊列節點宕機直接導致隊列無法使用,只能等待重啟。因此,需要關閉隊列節點,否則故障也可以正常使用。要將隊列的內容復制到集群中的每個節點,需要創建一個圖像隊列。
第一步:添加負載均衡器
在負載均衡器方面,F5的BIG-IP、Radware的AppDirector等商用產品都是硬件架構的產品,可以實現高處理能力。但是這些產品的高價會讓人望而卻步,所以我們也有軟件負載均衡解決方案。互聯網公司常用的軟件LB有LVS、HAProxy、Nginx等,LVS是內核層產品,主要負責第四層的數據包轉發,使用比較復雜。HAProxy 和 Nginx 是應用層產品,但 Nginx 主要用于處理 HTTP,因此選擇 HAProxy 作為 RabbitMQ 前端的 lb。
1.安裝HAProxy(在192.168.73.136安裝在HAProxy上) yum -y 安裝haproxy 2.修改haproxy.config進行配置 vim /etc/haproxy/haproxy.config 添加以下配置: 聽rabbitmq_cluster 0.0.0.0:5678 模式tcp 平衡循環 服務器rabbitmaster 192.168.73.134:5678 檢查inter 2000 上升2 下降3 服務器rabbitslave 192.168.73.135:5678 檢查inter 2000 上升2 下降3
修改HaProxy配置后,重啟可能會提示端口綁定失敗。在這種情況下,請執行以下命令:
setebool -P haproxy_connect_any=1
負載均衡器將監聽 192.168.73.136 的 5678 端口,并輪詢我們 192.168.73.134 和 192.168.73.135 的 5678 端口這兩個節點。這樣磁盤節點不會同時受到影響,除了故障。
第二步:配置Rabbitmq策略
在任意節點上執行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}' 上面的命令會將所有隊列設置為鏡像隊列,即隊列會被復制到每個節點,每個節點的狀態會保持一致
第三步:使用負載服務器發送消息
客戶端使用負載服務器172.16.3.110(panyuntao3)發送消息,隊列復制到所有節點。到這里我們就完成了RabbitMQ集群的高可用配置。
感謝各位的閱讀,以上就是“RabbitMQ集群如何搭建”的內容了,經過本文的學習后,相信大家對RabbitMQ集群如何搭建這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。