RabbitMQ預設叢集模式搭建配置實現步驟
RabbitMQ是什麼?
MQ(Msaaage Queue,訊息佇列)是一種應用程式對應用程式的通訊方式。應用程式通過讀寫出入佇列的訊息(針對應用程式的資料)來通訊,而無須專用連結來連線它們。訊息傳遞指的是程式之間通過在訊息中傳送資料進行通訊。而不是通過直接呼叫彼此來通訊。佇列的使用除去了接收和傳送應用程式同時執行的要求。
RabbirMQ使用場景
在專案中,將一些無需即時返回且耗時的操作提取出來,進行非同步處理,而這種非同步處理的方式大大的節省了伺服器的請求響應時間,從而提高系統的吞吐量
RabbitMQ支援訊息的持久化,也就是資料寫在磁碟上。為了資料安全考慮,大多數企業都會選擇持久化。當然如果不需要訊息持久化,那麼使用記憶體節點即可。RabbitMQ的叢集節點包括記憶體節點、磁碟節點。最合適的方案就是既有記憶體節點,又有磁碟節點。
RabbitMQ實際應用
RabbitMQ是用Erlang開發的,叢集非常方便,因為Erlang天生就是一門分散式語言,但其本身並不支援負載均衡。
RabbitMQ模式大概分為三種
- 單一模式
- 普通模式(預設的叢集模式)
- 映象模式(把需要的佇列做成映象佇列,存在於多個節點,屬於RabbitMQ的HA方案,在對業務可靠性要求較高的場合中比較適用)
要實現映象模式,需要先搭建一個普通叢集模式,在這個模式的基礎上再配置映象模式可以實現高可用。
RabbitMQ功能
- 非同步訊息:支援多種訊息傳遞協議,訊息佇列,傳遞確認,靈活路由到佇列,多種交換型別。
- 開發經驗:與BOSH,Chef,Docker和Puppet一起部署。使用喜歡的程式語言開發跨語言訊息,例如:Java,.NET,PHP,Python,JavaScript,Ruby,Go 等等。
- 分散式部署:部署為叢集以實現高可用性和吞吐量; 聯合多個可用區和區域
- 企業和雲就緒:可插拔身份驗證,授權,支援TLS和LDAP。輕量級,易於部署在公共雲和私有云中。
- 工具和外掛:支援持續整合,運營指標和與其他企業系統整合的各種工具和外掛。靈活的外掛方法,用於擴充套件RabbitMQ功能。
- 管理和監督:用於管理和監控 RabbitMQ的HTTP-API,命令列工具和UI
RabbitMQ叢集搭建
實現步驟
設計架構模式:在一個叢集裡,有三臺伺服器,其中一臺使用磁碟模式,另兩臺使用記憶體模式。兩臺記憶體模式的節點速度更快,因此通過客戶端連線訪問它們。但是在客戶端不可能分別連線兩臺記憶體節點,肯定是通過前端反向代理去輪詢分發請求。如果擔心前端反向代理伺服器故障,可以通過keepalived軟體做一個高可用架構。而磁碟模式的節點,由於磁碟IO相對較慢,因此僅作資料備份使用。
環境準備
- 關閉防火牆及selinux
systemctl stop firewalld.service setenforce 0
- 虛擬機器規劃如下
主機名 | IP地址 | 作業系統 | 系統用途 | 軟體包 |
---|---|---|---|---|
mq01 | 172.16.10.28 | CentOS-7-x86_64 | 磁碟節點 | rabbitmq-server-3.3.5 |
mq02 | 172.16.10.29 | CentOS-7-x86_64 | 記憶體節點 | rabbitmq-server-3.3.5 |
mq03 | 172.16.10.31 | CentOS-7-x86_64 | 記憶體節點 | rabbitmq-server-3.3.5 |
修改主機名及hosts檔案
vim /etc/hostname mq01.localdomain//三臺伺服器都需要修改,分別改為mq02,mq03,名稱可以自定義 vim /etc/hosts 172.16.10.28 mq01 172.16.10.29 mq02 172.16.10.31 mq03//hosts檔案三臺伺服器都一致,與hostname修改的內容要對應 reboot//修改之後重啟虛擬機器生效
安裝rabbitmq軟體
yum install epel-release -y yum install rabbitmq-server -y
檢視節點服務
rabbitmq-plugins list
啟動管理服務
rabbitmq-plugins enable rabbitmq_management
啟動rabbitmq服務
systemctl start rabbitmq-server.service netstat -ntap | grep 5672
在服務啟動之後,若是有三個埠開放,則表示服務服務開啟成功。其中15672和25672都是rabbitmq的管理埠,5672則是和生產者、消費者通訊的埠。
檢視連線狀態
先檢視單個連線是否能夠,三臺伺服器都要做測試,如果連線失敗,就要檢查前面的hostname和hosts檔案設定有沒有錯誤。
rabbitmqctl cluster_status
修改.erlang.cookie檔案
Rabbitmq的叢集是依賴於Erlang的叢集來工作的,所以必須先構建起Erlang的叢集環境。在Erlang的叢集中,各節點通過一個magic cookie來實現的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie(該檔案為隱藏檔案)中,檔案是400的許可權。必須使各節點cookie保持一致,否則節點之間就無法通訊。注意在作修改時,應先關閉rabbitmq服務
cat .erlang.cookie//檢視檔案中的值,修改兩個記憶體節點,使三個值相同 systemctl stop rabbitmq-server.service//關閉兩個記憶體節點的rabbimq服務,並修改cookie值 systemctl start rabbitmq-server.service//修改完成之後再啟動服務
將記憶體節點與磁碟節點相連
將mq02、mq03作為記憶體節點,mq01作為磁碟節點。節點mq01和mq02上操作一致,先停止rabbitmq應用,然後(在mq02伺服器上)呼叫cluster命令將mq02連線到mq01;(在mq03伺服器上)將mq03連線到mq01,使三者成為一個叢集,最後啟動rabbitmq應用。
rabbitmqctl stop_app//關閉應用 rabbitmqctl join_cluster --ram rabbit@mq01//將記憶體節點連線到磁碟節點--ram表示作為記憶體節點 rabbitmqctl start_app//開啟應用,mq02與mq03操作相同
檢視埠,確保服務都正常
netstat -ntap | grep 5672
mq01
mq02
mq03
訪問管理網頁
開啟瀏覽器訪問http://172.16.10.28:15672,預設賬號和密碼均為“guest”

