MQ(Message Queue,消息隊列)是一款消息中間件,通常以集羣方式部署,主要提供消息的接受和發送,實現各微服務之間的消息異步。linux
rabbitmq 是依據erlang的分佈式特性(RabbitMQ底層是經過Erlang架構來實現的,因此rabbitmqctl會啓動Erlang節點,並基於Erlang節點來使用Erlang系統鏈接RabbitMQ節點,在鏈接過程當中須要正確的Erlang Cookie和節點名稱,Erlang節點經過交換Erlang Cookie以得到認證)來實現的,因此部署rabbitmq分佈式集羣時要先安裝erlang,並把其中一個服務的cookie複製到另外的節點。
rabbitmq集羣中,各個rabbitmq爲對等節點,即每一個節點均提供給客戶端鏈接,進行消息的接收和發送。節點分爲內存節點和磁盤節點,通常的,均應創建爲磁盤節點,爲了防止機器重啓後的消息消失;vim
RabbitMQ的Cluster集羣模式通常分爲兩種, 普通模式和鏡像模式 。消息隊列經過rabbitmq HA鏡像隊列進行消息隊列實體複製。瀏覽器
普通模式下, 以兩個節點(rabbit0一、rabbit02)爲例來進行說明。對於Queue來講,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。當消息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit0一、rabbit02間進行消息傳輸,把A中的消息實體取出並通過B發送給consumer。因此consumer應儘可能鏈接每個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點創建物理Queue。不然不管consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。服務器
鏡像模式下, 將須要消費的隊列變爲鏡像隊列,存在於多個節點,這樣就能夠實現RabbitMQ的HA高可用性。做用就是消息實體會主動在鏡像節點之間實現同步,而不是像普通模式那樣,在consumer消費數據時臨時讀取。缺點就是,集羣內部的同步通信會佔用大量的網絡帶寬。cookie
Broker:它提供一種傳輸服務,它的角色就是維護一條從生產者到消費者的路線,保證數據能按照指定的方式進行傳輸
Exchange:消息交換機,它指定消息按什麼規則,路由到哪一個隊列
Queue:消息的載體,每一個消息都會被投到一個或多個隊列
Binding:綁定,它的做用就是把exchange和queue按照路由規則綁定起來
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞
vhost:虛擬主機,一個broker裏能夠有多個vhost,用做不一樣用戶的權限分離
Producer:消息生產者,就是投遞消息的程序
Consumer:消息消費者,就是接受消息的程序
Channel:消息通道,在客戶端的每一個鏈接裏,可創建多個channel網絡
主機名 | 操做系統 | IP地址 | 用途 |
---|---|---|---|
rabbitmq01 | Centos 7.4 x86_64 | 192.168.96.41 | 磁盤節點 |
rabbitmq02 | Centos 7.4.x86_64 | 192.168.96.42 | 內存節點 |
rabbitmq03 | Centos 7.4 x86_64 | 192.168.96.43 | 內存節點 |
setenforce 0 systemctl stop firewalld
vim /etc/hostname
rabbitmq01架構
vim /etc/hostname
rabbitmq02app
vim /etc/hostname
rabbitmq03異步
vim /etc/hosts分佈式
192.168.96.23 rabbitmq01 192.168.96.21 rabbitmq02 192.168.96.22 rabbitmq03
yum -y install epel-release
yum -y install rabbitmq-server
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_management
systemctl start rabbitmq-server
systemctl stop rabbitmq-server
cd /var/lib/rabbitmq/
vim .erlang.cookie
systemctl start rabbitmq-server
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
rabbitmqctl cluster_status