1. 程式人生 > >配置RabbitMQ默認群集模式

配置RabbitMQ默認群集模式

分發 服務器 oca python lda java 節點 src RoCE

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”
技術分享圖片
技術分享圖片

配置RabbitMQ默認群集模式