RabbitMQ是一個在AMQP基礎上完成的,可複用的企業消息系統。它是由Erlang語言開發。java
AMQP:Advanced Message Queue,高級消息隊列協議。他是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。node
RabbitMQ 最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。具體特色包括:<!--more-->linux
- 可靠性(Reliability):RabbitMQ使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。
- 靈活的路由(Flexible Routing):在消息進入隊列以前,經過 Exchange 來路由消息的。
- 消息集羣(Clustering):多個 RabbitMQ 服務器能夠組成一個集羣,造成一個邏輯 Broker 。
- 高可用(Highly Available Queues):隊列能夠在集羣中的機器上進行鏡像,使得在部分節點出問題的狀況下隊列仍然可用。
- 多種協議(Multi-protocol):RabbitMQ支持多種消息隊列協議,好比STOMP、MQTT等。
- 多語言客戶端(Many Clients):RabbitMQ 幾乎支持全部經常使用語言,好比 Java、.NET、Ruby 等。
- 管理界面(Management UI):RabbitMQ 提供了一個易用的用戶界面,使得用戶能夠監控和管理消息 Broker 的許多方面。
- 跟蹤機制(Tracing):若是消息異常,RabbitMQ 提供了消息跟蹤機制,使用者能夠找出發生了什麼。
- 插件機制(Plugin System):RabbitMQ 提供了許多插件,來從多方面進行擴展,也能夠編寫本身的插件。
項目結構圖:(直接引用百度百科的)git
概念說明:vim
消息隊列的使用過程:瀏覽器
exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列裏。安全
exchange也有幾個類型,徹底根據key進行投遞的叫作Direct交換機,例如,綁定時設置了routing key爲」abc」,那麼客戶端提交的消息,只有設置了key爲」abc」的纔會投遞到隊列。對key進行模式匹配後進行投遞的叫作Topic交換機,符號」#」匹配一個或多個詞,符號」」匹配正好一個詞。例如」abc.#」匹配」abc.def.ghi」,」abc.」只匹配」abc.def」。還有一種不須要key的,叫作Fanout交換機,它採起廣播模式,一個消息進來時,投遞到與該交換機綁定的全部隊列。bash
RabbitMQ支持消息的持久化,也就是數據寫在磁盤上,爲了數據安全考慮,我想大多數用戶都會選擇持久化。消息隊列持久化包括3個部分:服務器
若是exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。若是exchange和queue二者之間有一個持久化,一個非持久化,就不容許創建綁定。cookie
前面說到RabbitMQ是由Erlang語言開發,因此須要先安裝Erlang環境
wget http://erlang.org/download/otp_src_20.1.tar.gz
#解壓 tar -zvxf otp_src_20.1.tar.gz #配置安裝路徑編譯代碼 cd otp_src_20.1/ ./configure --prefix=/opt/erlang --without-javac make && make install
以下安裝完成
cd /opt/erlang bin/erl
安裝成功
vim /etc/profile #添加下面的配置 #set erlang environment export PATH=$PATH:/opt/erlang/bin #使配置文件生效 source /etc/profile
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-generic-unix-3.6.12.tar.xz
xz -d rabbitmq-server-generic-unix-3.6.12.tar.xz tar -vxf rabbitmq-server-generic-unix-3.6.12.tar -C /opt/ cd /opt/ mv rabbitmq-server-3.6.12/ rabbitmq
vim /etc/profile #添加如下配置 #set rabbitmq environment export PATH=$PATH:/opt/rabbitmq/sbin #使得文件生效 source /etc/profile
rabbitmq-server -detached
./sbin/rabbitmqctl status #顯示一下信息,說明已經啓動 Status of node rabbit@localhost [{pid,1452}, {running_applications, [{rabbit,"RabbitMQ","3.6.12"}, {ranch,"Socket acceptor pool for TCP protocols.","1.3.0"}, {ssl,"Erlang/OTP SSL application","8.2.1"}, {public_key,"Public key infrastructure","1.5"}, {asn1,"The Erlang ASN1 compiler version 5.0.3","5.0.3"}, {crypto,"CRYPTO","4.1"}, {mnesia,"MNESIA CXC 138 12","4.15.1"}, {os_mon,"CPO CXC 138 46","2.4.3"}, {rabbit_common, "Modules shared by rabbitmq-server and rabbitmq-erlang-client", "3.6.12"}, {compiler,"ERTS CXC 138 10","7.1.2"}, {xmerl,"XML parser","1.3.15"}, {syntax_tools,"Syntax tools","2.1.3"}, {sasl,"SASL CXC 138 11","3.1"}, {stdlib,"ERTS CXC 138 10","3.4.2"}, {kernel,"ERTS CXC 138 10","5.4"}]}, {os,{unix,linux}}, {erlang_version, "Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:64] [kernel-poll:true]\n"}, {memory, [{connection_readers,0}, {connection_writers,0}, {connection_channels,0}, {connection_other,0}, {queue_procs,2744}, {queue_slave_procs,0}, {plugins,0}, {other_proc,19513536}, {metrics,184272}, {mgmt_db,0}, {mnesia,61136}, {other_ets,1523640}, {binary,211896}, {msg_index,43568}, {code,21408137}, {atom,891849}, {other_system,17779446}, {total,61620224}]}, {alarms,[]}, {listeners,[{clustering,25672,"::"},{amqp,5672,"::"}]}, {vm_memory_calculation_strategy,rss}, {vm_memory_high_watermark,0.4}, {vm_memory_limit,771637248}, {disk_free_limit,50000000}, {disk_free,36134227968}, {file_descriptors, [{total_limit,924},{total_used,2},{sockets_limit,829},{sockets_used,0}]}, {processes,[{limit,1048576},{used,153}]}, {run_queue,0}, {uptime,21}, {kernel,{net_ticktime,60}}]
rabbitmqctl stop
RabbitMQ網頁管理的端口是15672,可是如今還不能訪問,須要添加網頁插件才能訪問
rabbitmq-plugins enable rabbitmq_management
在瀏覽器中輸入ip:15672
在網上看到有人說默認的帳號密碼是guest,可是該帳號只能經過localhost登陸。因此須要配置一個用戶並設置權限。
rabbitmqctl add_user [username] [password]
rabbitmqctl set_permissions -p "/" [username] ".*" ".*" ".*"
rabbitmqctl set_user_tags [username] administrator
下面就可使用剛添加的用戶登陸了。能夠在該頁面進行RabbitMQ的管理,包括用戶的設置。
error: No curses library functions found configure
須要先安裝ncurses-devel
yum install ncurses-devel
odbc : ODBC library - link check failed
相似這樣的錯誤,咱們只須要關注APPLICATIONS DISABLED部分的提示信息,如這裏就是缺乏odbc,使用命令安裝便可
yum install unixODBC unixODBC-devel
RabbitMQ啓動以後,默認的名稱是Rabbit,監聽的端口是5672,若是想在同一臺機器上啓動多個節點,那麼其餘的節點就會由於節點名稱和端口與默認的衝突而致使啓動失敗,能夠經過設置環境變量來實現,具體方法以下:
rabbitmq-plugins disable rabbitmq_management
rabbitmqctl stop //先中止運行節點,再進行集羣部署 #啓動第一個節點 RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached #啓動第二個節點 RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1 rabbitmq-server -detached
#中止rabbit_1節點的應用 rabbitmqctl -n rabbit_1@localhost stop_app #將rabbit_1添加到集羣節點rabbit中去 rabbitmqctl -n rabbit_1@localhost join_cluster rabbit@localhost #查看集羣節點狀態 rabbitmqctl cluster_status #啓動rabbit_1節點應用 rabbitmqctl -n rabbit_1@localhost start_app #查看rabbit_1節點的狀態 rabbitmqctl -n rabbit_1 status
以下集羣配置完畢
不一樣於單機多節點的狀況,在多機環境,若是要在cluster集羣內部署多個節點,須要注意兩個方面:
環境介紹
RabbitMQ節點 | IP地址 | 工做模式 | 操做系統 |
---|---|---|---|
rabbitmqCluster | 186.16.195.24 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster01 | 186.16.195.25 | DISK | CentOS 7.0 - 64位 |
rabbitmqCluster02 | 186.16.195.26 | DISK | CentOS 7.0 - 64位 |
cluster部署過程:
分別在三個節點的/etc/hosts下設置相同的配置信息
186.16.195.24 rabbitmqCluster 186.16.195.25 rabbitmqCluster01 186.16.195.26 rabbitmqCluster02
[root@rabbitmqCluster01]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.25:/var/lib/rabbitmq [root@rabbitmqCluster02]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.26:/var/lib/rabbitmq12
rabbitmqctl stop rabbitmq-server -detached 12
[root@rabbitmqCluster]#rabbitmqctl cluster_status [root@rabbitmqCluster01]#rabbitmqctl cluster_status [root@rabbitmqCluster02]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl stop_app [root@rabbitmqCluster01]#rabbitmqctl join_cluster rabbit@rabbitmqCluster [root@rabbitmqCluster01]#rabbitmqctl start_app123
[root@rabbitmqCluster]#rabbitmqctl cluster_status