MQ(Msaaage Queue,消息隊列)是一種應用程序對應用程序的通訊方式。應用程序經過讀寫出入隊列的消息(針對應用程序的數據)來通訊,而無須專用連接來鏈接它們。消息傳遞指的是程序之間經過在消息中發送數據進行通信。而不是經過直接調用彼此來通訊。隊列的使用除去了接收和發送應用程序同時執行的要求。前端
在項目中,將一些無需即時返回且耗時的操做提取出來,進行異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提升系統的吞吐量
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上。爲了數據安全考慮,大多數企業都會選擇持久化。固然若是不須要消息持久化,那麼使用內存節點便可。RabbitMQ的集羣節點包括內存節點、磁盤節點。最合適的方案就是既有內存節點,又有磁盤節點。linux
RabbitMQ是用Erlang開發的,集羣很是方便,由於Erlang天生就是一門分佈式語言,但其自己並不支持負載均衡。
RabbitMQ模式大概分爲三種編程
- 單一模式
- 普通模式(默認的集羣模式)
- 鏡像模式(把須要的隊列作成鏡像隊列,存在於多個節點,屬於RabbitMQ的HA方案,在對業務可靠性要求較高的場合中比較適用)
要實現鏡像模式,須要先搭建一個普通集羣模式,在這個模式的基礎上再配置鏡像模式能夠實現高可用。vim
- 異步消息:支持多種消息傳遞協議,消息隊列,傳遞確認,靈活路由到隊列,多種交換類型。
- 開發經驗:與BOSH,Chef,Docker和Puppet一塊兒部署。使用喜歡的編程語言開發跨語言消息,例如:Java,.NET,PHP,Python,JavaScript,Ruby,Go 等等。
- 分佈式部署:部署爲集羣以實現高可用性和吞吐量; 聯合多個可用區和區域
- 企業和雲就緒:可插拔身份驗證,受權,支持TLS和LDAP。輕量級,易於部署在公共雲和私有云中。
- 工具和插件:支持持續集成,運營指標和與其餘企業系統集成的各類工具和插件。靈活的插件方法,用於擴展RabbitMQ功能。
- 管理和監督:用於管理和監控 RabbitMQ的HTTP-API,命令行工具和UI
設計架構模式:在一個集羣裏,有三臺服務器,其中一臺使用磁盤模式,另兩臺使用內存模式。兩臺內存模式的節點速度更快,所以經過客戶端鏈接訪問它們。可是在客戶端不可能分別鏈接兩臺內存節點,確定是經過前端反向代理去輪詢分發請求。若是擔憂前端反向代理服務器故障,能夠經過keepalived軟件作一個高可用架構。而磁盤模式的節點,因爲磁盤IO相對較慢,所以僅做數據備份使用。瀏覽器
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 |
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 //修改以後重啓虛擬機生效
yum install epel-release -y yum install rabbitmq-server -y
rabbitmq-plugins list
rabbitmq-plugins enable rabbitmq_management
systemctl start rabbitmq-server.service netstat -ntap | grep 5672
在服務啓動以後,如果有三個端口開放,則表示服務服務開啓成功。其中15672和25672都是rabbitmq的管理端口,5672則是和生產者、消費者通訊的端口。安全
先查看單個鏈接是否可以,三臺服務器都要作測試,若是鏈接失敗,就要檢查前面的hostname和hosts文件設置有沒有錯誤。服務器
rabbitmqctl cluster_status
Rabbitmq的集羣是依賴於Erlang的集羣來工做的,因此必須先構建起Erlang的集羣環境。在Erlang的集羣中,各節點經過一個magic cookie來實現的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie(該文件爲隱藏文件)中,文件是400的權限。必須使各節點cookie保持一致,不然節點之間就沒法通訊。注意在做修改時,應先關閉rabbitmq服務cookie
cat .erlang.cookie //查看文件中的值,修改兩個內存節點,使三個值相同 systemctl stop rabbitmq-server.service //關閉兩個內存節點的rabbimq服務,並修改cookie值 systemctl start rabbitmq-server.service //修改完成以後再啓動服務
將mq0二、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
打開瀏覽器訪問http://172.16.10.28:15672,默認帳號和密碼均爲「guest」app