CentOS7下RabbitMQ的安裝介紹

介紹

RabbitMQ是一個在AMQP基礎上完成的,可複用的企業消息系統。它是由Erlang語言開發。java

AMQP:Advanced Message Queue,高級消息隊列協議。他是應用層協議的一個開放標準,爲面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。node

RabbitMQ 最初起源於金融系統,用於在分佈式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。具體特色包括:<!--more-->linux

  1. 可靠性(Reliability):RabbitMQ使用一些機制來保證可靠性,如持久化、傳輸確認、發佈確認。
  2. 靈活的路由(Flexible Routing):在消息進入隊列以前,經過 Exchange 來路由消息的。
  3. 消息集羣(Clustering):多個 RabbitMQ 服務器能夠組成一個集羣,造成一個邏輯 Broker 。
  4. 高可用(Highly Available Queues):隊列能夠在集羣中的機器上進行鏡像,使得在部分節點出問題的狀況下隊列仍然可用。
  5. 多種協議(Multi-protocol):RabbitMQ支持多種消息隊列協議,好比STOMP、MQTT等。
  6. 多語言客戶端(Many Clients):RabbitMQ 幾乎支持全部經常使用語言,好比 Java、.NET、Ruby 等。
  7. 管理界面(Management UI):RabbitMQ 提供了一個易用的用戶界面,使得用戶能夠監控和管理消息 Broker 的許多方面。
  8. 跟蹤機制(Tracing):若是消息異常,RabbitMQ 提供了消息跟蹤機制,使用者能夠找出發生了什麼。
  9. 插件機制(Plugin System):RabbitMQ 提供了許多插件,來從多方面進行擴展,也能夠編寫本身的插件。

基本概念

項目結構圖:(直接引用百度百科的)git

概念說明:vim

  • Broker:消息隊列服務器的實體,是一箇中間件應用,負責接收消息生產者的消息,而後將消息發送至消息接收者或其餘的Braker
  • Exchange:消息交換機,是消息第一個到達的地方,消息經過它指定的路由規則,分發到不一樣的消息隊列中去。
  • Queue:消息隊列,消息經過發送和路由以後最終達到的地方,到達Queue的消息即進入邏輯上等待消費的狀態。每一個消息都會被髮送到一個或多個隊列。
  • Binding:綁定,它的做用就是把Exchange和Queue按照路由規則綁定起來,也就是Exchange和Queue之間的虛擬連接。
  • Routing Key:路由關鍵字,Exchange根據這個關鍵字進行消息投遞。
  • Virtual host:虛擬主機,是對Broker的虛擬劃分,將消費者、生產者和它們依賴的AMQP相關結構進行隔離,通常都是爲了安全考慮。好比:咱們能夠在一個Broker中設置多個虛擬主機,對不一樣用戶進行權限的分離。
  • Connection:鏈接。表明生產者、消費者、Broker之間進行通訊的物理網絡。
  • Channel:消息通道,用於鏈接生產者和消費者的邏輯結構。在客戶端每一個鏈接裏,可創建多個Channel,每一個Channel表明一個會話任務,經過Channel能夠隔離同一個鏈接中的不一樣交互內容。
  • Producer:消息生產者。
  • Consumer:消息消費者。

消息隊列的使用過程:瀏覽器

  1. 客戶端鏈接到消息隊列服務器,打開一個channel。
  2. 客戶端聲明一個exchange,並設置相關屬性。
  3. 客戶端聲明一個queue,並設置相關屬性。
  4. 客戶端使用routing key,在exchange和queue之間創建好綁定關係。
  5. 客戶端投遞消息到exchange。

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個部分:服務器

  1. exchange持久化,在聲明時指定durable => 1
  2. queue持久化,在聲明時指定durable => 1
  3. 消息持久化,在投遞時指定delivery_mode => 2(1是非持久化)

若是exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。若是exchange和queue二者之間有一個持久化,一個非持久化,就不容許創建綁定。cookie

安裝介紹

Erlang安裝配置

前面說到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

RabbitMQ的安裝配置

  • 下載安裝,從官網下載,點擊下載 ,進入選擇版本。在linux環境下須要下帶有unix的,以下:
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.12/rabbitmq-server-generic-unix-3.6.12.tar.xz
  • 解壓,這裏將其解壓到opt目錄中。解壓以後進入opt目錄,修改rabbitmq的文件夾
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服務操做

  • 啓動服務
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}}]
  • 中止RabbitMQ
rabbitmqctl stop

配置網頁插件

RabbitMQ網頁管理的端口是15672,可是如今還不能訪問,須要添加網頁插件才能訪問

rabbitmq-plugins enable rabbitmq_management

在瀏覽器中輸入ip:15672

在網上看到有人說默認的帳號密碼是guest,可是該帳號只能經過localhost登陸。因此須要配置一個用戶並設置權限。

  1. 添加用戶
rabbitmqctl add_user [username] [password]
  1. 添加權限
rabbitmqctl set_permissions -p "/" [username] ".*" ".*" ".*"
  1. 修改用戶角色
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,若是想在同一臺機器上啓動多個節點,那麼其餘的節點就會由於節點名稱和端口與默認的衝突而致使啓動失敗,能夠經過設置環境變量來實現,具體方法以下:

  1. 先關閉上面的網頁管理插件
rabbitmq-plugins disable rabbitmq_management
  1. 首先在機器上設置設置兩個節點rabbit和rabbit_01
rabbitmqctl stop //先中止運行節點,再進行集羣部署
#啓動第一個節點
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit rabbitmq-server -detached
#啓動第二個節點
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1 rabbitmq-server -detached
  1. 將第二個節點rabbit-01加入到第一個集羣節點rabbit中
#中止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集羣內部署多個節點,須要注意兩個方面:

  • 保證須要部署的這幾個節點在同一個局域網內
  • 須要有相同的Erlang Cookie,不然不能進行通訊,爲保證cookie的徹底一致,採用從一個節點copy的方式

環境介紹

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
  • 設置不一樣節點間同一認證的Erlang Cookie
    採用從主節點copy的方式保持Cookie的一致性
[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
  • 使用 -detached運行各節點
rabbitmqctl stop
rabbitmq-server -detached 12
  • 查看各節點的狀態
[root@rabbitmqCluster]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl cluster_status
[root@rabbitmqCluster02]#rabbitmqctl cluster_status
  • 建立並部署集羣,以rabbitmqCluster01節點爲例:
[root@rabbitmqCluster01]#rabbitmqctl stop_app
[root@rabbitmqCluster01]#rabbitmqctl join_cluster rabbit@rabbitmqCluster
[root@rabbitmqCluster01]#rabbitmqctl start_app123
  • 查看集羣狀態
[root@rabbitmqCluster]#rabbitmqctl cluster_status

參考

  1. CentOS7下RabbitMQ服務安裝配置
  2. 消息隊列之 RabbitMQ
  3. RabbitMQ分佈式集羣架構和高可用性(HA)
  4. https://geewu.gitbooks.io/rabbitmq-quick/content/
相關文章
相關標籤/搜索