配置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默認群集模式