MQ(Message Queue消息隊列)是一種應用程序對應用程序的通訊方法。應用程序經過讀寫出入隊列的消息(針對應用程序的數據)來通訊,而無需專用連接來鏈接他們。消息傳遞指的是程序之間經過在消息中發送數據進行通訊,而不是經過直接調用彼此來通訊,直接調用一般是用於諸如遠程過程調用的技術。排隊指的是應用程序經過隊列來通訊。隊列的使用除去接收和發送應用程序同時執行的要求。node
RabbitMQ是實現AMQP(高級消息隊列協議)的消息中間件的一種,最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。RabbitMQ主要是爲了實現系統之間的雙向解耦而實現的。當生產者大量產生數據時,消費者沒法快速消費,那麼須要一箇中間層。保存這個數據。git
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。消息中間件主要用於組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。AMQP的主要特徵是面向消息、隊列、路由(包括點對點和發佈/訂閱)、可靠性、安全。web
RabbitMQ使用Erlang開發的,集羣很是方便,由於Erlang天生就是一門分佈式語言,但其自己並不支持負載均衡。RabbitMQ模式大概分爲三種:vim
IP地址 | 主機名 | 操做系統 | 用途 |
---|---|---|---|
192.168.58.141 | rabbitmq01 | CentOS7 | 磁盤節點 |
192.168.58.132 | rabbitmq02 | CentOS7 | 內存節點 |
192.168.58.130 | rabbitmq03 | CentOS7 | 內存節點 |
首先咱們須要配置三個節點的hosts文件,將下面內容分別加入到三臺服務器上。瀏覽器
[root@rabbitmq01 /]# vim /etc/hosts 192.168.58.141 rabbitmq01 192.168.58.132 rabbitmq02 192,168.58.130 rabbitmq03
而後須要修改三個節點的主機名,修改每一個節點的/etc/hostname文件安全
[root@rabbitmq01 /]# vim /etc/hostname rabbitmq01
[root@rabbitmq02 /]# vim /etc/hostname rabbitmq02
[root@rabbitmq03 /]# vim /etc/hostname rabbitmq03
而後將三個節點重啓,當啓動之後要關閉防火牆和加強性安全功能。服務器
[root@rabbitmq01 /]# systemctl stop firewalld.service [root@rabbitmq01 /]# setenforce 0 [root@rabbitmq01 /]# yum install -y epel-release #安裝epel源 [root@rabbitmq01 /]# yum install -y rabbitmq-server #安裝rabbitmq軟件包 [root@rabbitmq01 /]# ln -s /usr/lib/rabbitmq/bin/* /usr/bin #創建軟連接,方便直接使用命令 [root@rabbitmq01 /]# rabbitmq-plugins list #查看插件安裝狀況 [e] amqp_client 3.3.5 [ ] cowboy 0.5.0-rmq3.3.5-git4b93c2d [ ] eldap 3.3.5-gite309de4 [e] mochiweb 2.7.0-rmq3.3.5-git680dba8 [ ] rabbitmq_amqp1_0 3.3.5 [ ] rabbitmq_auth_backend_ldap 3.3.5 [ ] rabbitmq_auth_mechanism_ssl 3.3.5 [ ] rabbitmq_consistent_hash_exchange 3.3.5 [ ] rabbitmq_federation 3.3.5 [ ] rabbitmq_federation_management 3.3.5 [E] rabbitmq_management 3.3.5 [e] rabbitmq_management_agent 3.3.5 [ ] rabbitmq_management_visualiser 3.3.5 [ ] rabbitmq_mqtt 3.3.5 [ ] rabbitmq_shovel 3.3.5 [ ] rabbitmq_shovel_management 3.3.5 [ ] rabbitmq_stomp 3.3.5 [ ] rabbitmq_test 3.3.5 [ ] rabbitmq_tracing 3.3.5 [e] rabbitmq_web_dispatch 3.3.5 [ ] rabbitmq_web_stomp 3.3.5 [ ] rabbitmq_web_stomp_examples 3.3.5 [ ] sockjs 0.3.4-rmq3.3.5-git3132eb9 [e] webmachine 1.10.3-rmq3.3.5-gite9359c7 [root@rabbitmq01 /]# rabbitmq-plugins enable rabbitmq_management #啓用rabbitmq_management服務 [root@rabbitmq01 /]# systemctl start rabbitmq-server.service #啓動mq服務 [root@rabbitmq01 /]# netstat -ntap | grep 5672 tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 3878/beam tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 3878/beam tcp6 0 0 :::5672 :::* LISTEN 3878/beam
有上面三個端口開啓說明正常。15672和55672都是rabbitmq的管理端口,5672是生產者、消費者通訊的端口。cookie
[root@rabbitmq01 /]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq01 ... [{nodes,[{disc,[rabbit@rabbitmq01]}]}, {running_nodes,[rabbit@rabbitmq01]}, {cluster_name,<<"rabbit@rabbitmq01">>}, {partitions,[]}] ...done. #檢查三臺的集羣狀態,目前相互獨立,沒有造成集羣。 [root@rabbitmq01 /]# vim /var/lib/rabbitmq/.erlang.cookie #三臺節點服務器的這個文件中的編碼須要配置成同樣的,複製內容到其餘兩臺 PKBPLZGDCESRUHHDCOJV
而後將rabbitmq0二、rabbitmq03做爲內存節點與rabbitmq01磁盤節點鏈接起來,在rabbitmq02和rabbit03上執行下面的命令:負載均衡
[root@rabbitmq02 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01 Clustering node rabbit@rabbitmq02 with rabbit@rabbitmq01 ... ...done. [root@rabbitmq03 yum.repos.d]# rabbitmqctl join_cluster --ram rabbit@rabbitmq01 Clustering node rabbit@rabbitmq03 with rabbit@rabbitmq01 ... ...done.
在rabbitmq01節點上查看集羣狀態:tcp
[root@rabbitmq01 /]# rabbitmqctl cluster_status Cluster status of node rabbit@rabbitmq01 ... [{nodes,[{disc,[rabbit@rabbitmq01]}, {ram,[rabbit@rabbitmq03,rabbit@rabbitmq02]}]}, {running_nodes,[rabbit@rabbitmq01]}, {cluster_name,<<"rabbit@rabbitmq01">>}, {partitions,[]}] ...done. #能夠看到集羣中的成員
打開瀏覽器輸入http://192.168.58.141:15672,能夠看到訪問頁面,帳號密碼都是guest,進入到裏面就能看到圖形化的界面。