RabbitMQ安裝及使用

  • 下載

因爲RabbitMQ是基於Erlang語言開發,因此在安裝RabbitMQ以前,須要先安裝Erlang。好在RabbitMQ官網已經爲咱們提供了Erlang的安裝包html

Erlang下載地址:http://www.rabbitmq.com/releases/erlang/node

本人使用的操做系統爲:CentOS7web

下載的Erlang安裝包爲:erlang-19.0.4-1.el7.centos.x86_64.rpm正則表達式

RabbitMQ下載地址:https://www.rabbitmq.com/download.htmlcentos

下載的RabbitMQ安裝包爲:rabbitmq-server-3.6.8-1.el7.noarch.rpm瀏覽器

  •  安裝

將下載的兩個文件上傳到/usr/local目錄,先安裝Erlang安全

yum install erlang-19.0.4-1.el7.centos.x86_64.rpm

測試Erlang是否安裝成功服務器

erl -version

出現如下信息則表示安裝成功:Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 8.0.3websocket

 

安裝RabbitMQcookie

yum install rabbitmq-server-3.6.8-1.el7.noarch.rpm

運行RabbitMQ

cd /usr/sbin
./rabbitmq-server start

出現如下信息,則表示啓動成功:


 

RabbitMQ 3.6.8. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/rabbit@mq01.log
###### ## /var/log/rabbitmq/rabbit@mq01-sasl.log
##########
Starting broker...
completed with 0 plugins.

 


 

後臺啓動可以使用:

./rabbitmq-server -detached

中止服務可以使用:

./rabbitmqctl stop

 

  • 插件安裝

查看目前RabbitMQ已安裝的插件

 

cd /usr/sbin
./rabbitmq-plugins list

 

  • 安裝web管理端

./rabbitmq-plugins enable rabbitmq_management

安裝成功後,啓動MQ

經過瀏覽器訪問地址:http://192.168.120.129:15672/#/

因爲guest用戶被限制,只能經過localhost訪問,所以咱們須要新建一個用戶,並授予管理員權限。

新建一個用戶名爲admin,密碼爲admin的用戶,並授予管理員(administrator)權限

./rabbitmqctl add_user admin admin
./rabbitmqctl set_user_tags admin administrator

 

  • 安裝mqtt

./rabbitmq-plugins enable rabbitmq_mqtt

 

  • 安裝websocket

./rabbitmq-plugins enable rabbitmq_web_stomp
./rabbitmq-plugins enable rabbitmq_web_stomp_examples
  •  配置

若是須要修改RabbitMQ的默認配置,先查找配置文件樣例位置

find / -name "rabbitmq.config.example"

而後將樣例配置複製到制定目錄

cp /usr/share/doc/rabbitmq-server-3.6.8/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

修改樣例文件,並保存,重啓MQ生效。

 

  • 權限

主要是set_permissions的使用,先看下命令的格式:

set_permissions [-p vhost] {user} {conf} {write} {read}

首先須要注意如下幾點的理解:

1.這裏的權限,只是針對通常用戶的訪問權限,注意和角色的區分。舉個例子來講,非管理用戶(普通用戶),角色設置爲none,而後在這裏配置conf、write、read的權限。

2.conf、write、read採用正則表達式,這裏的正則主要是針對exchange和queue。主要2種特殊的表達式:

^$:表示徹底不匹配(即沒有權限)

.*:表示匹配全部(即全部權限)

 

若是使用RabbitMQ做爲消息推送服務,須要授予用戶只讀訪問Stomp主題權限,同時授予另外一個用戶對同一主題的讀寫訪問權限。

這樣的話主題訂閱者就不能發佈消息,從而解決安全性問題。

可是若是直接這樣受權:

rabbitmqctl set_permissions read-only-user '.*' '^$' '.*' 

會報以下錯誤:

 ERROR message:access_refused content-type:text/plain version:1.0,1.1,1.2 content-length:114 ACCESS_REFUSED - access to queue 'stomp-subscription-APK3zkvXFqxvSiZ9ztmxYQ' in vhost '/' refused for user 'test' Whoops! Lost connection to ws://221.0.200.202:15674/ws

這樣配置存在一個問題,將阻止任何寫入,阻止任何寫入將致使沒有權限鏈接到RabbitMQ的服務

須要對可讀用戶權限作以下調整:

rabbitmqctl set_permissions read-only-user '^stomp-subscription.*$' '^stomp-subscription.*$' '.*' 

 


 

  • 集羣模式

 RabbitMQ集羣模式分爲兩種:普通模式,鏡像模式(HA)

  普通模式:默認的集羣模式

對於Queue來講,消息實體只存在於其中一個節點,A、B兩個節點僅有相同的元數據,即隊列結構。

當消息進入A節點的Queue中後,consumer從B節點拉取時,RabbitMQ會臨時在A、B間進行消息傳輸,把A中的消息實體取出並通過B發送給consumer。

因此consumer應儘可能鏈接每個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點創建物理Queue。不然不管consumer連A或B,出口總在A,會產生瓶頸。

該模式存在一個問題就是當A節點故障後,B節點沒法取到A節點中還未消費的消息實體。

若是作了消息持久化,那麼得等A節點恢復,而後纔可被消費;若是沒有持久化的話,而後就沒有而後了……

  鏡像模式:把須要的隊列作成鏡像隊列,存在於多個節點,屬於RabbitMQ的HA方案

該模式解決了上述問題,其實質和普通模式不一樣之處在於,消息實體會主動在鏡像節點間同步,而不是在consumer取數據時臨時拉取。

該模式帶來的反作用也很明顯,除了下降系統性能外,若是鏡像隊列數量過多,加之大量的消息進入,集羣內部的網絡帶寬將會被這種同步通信大大消耗掉。

因此在對可靠性要求較高的場合中適用。

  • 服務器信息:

 咱們準備了兩臺服務器,系統爲Centos7,對應的ip跟hostname分別爲

192.168.1.242    mq01
192.168.1.243    mq02

 在安裝好的兩臺節點服務器中,分別修改/etc/hosts文件,指定mq01,mq02的hosts,如:

192.168.1.242    mq01
192.168.1.243    mq02

 注意:hostname文件也要正確,分別是mq0一、mq02,若是修改hostname建議在安裝rabbitmq前修改。

  • 設置 Erlang Cookie:

Rabbitmq的集羣是依賴於erlang的集羣來工做的,因此必須先構建起erlang的集羣環境。Erlang的集羣中各節點是經過一個magic cookie來實現的,這個cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的權限。因此必須保證各節點cookie保持一致,不然節點之間就沒法通訊。

查看文件權限的命令爲:

ls -l /var/lib/rabbitmq/.erlang.cookie

這裏將 mq01的 /var/lib/rabbitmq/.erlang.cookie文件複製到 mq02,因爲這個文件權限是 400,因此須要先修改該文件權限爲 777:

chmod 777 /var/lib/rabbitmq/.erlang.cookie

使用scp或其餘方式將該文件複製到mq02服務器的相同目錄,並覆蓋。

而後將mq01的 /var/lib/rabbitmq/.erlang.cookie文件權限修改回來

chmod 400 /var/lib/rabbitmq/.erlang.cookie
  • 組成集羣

重啓RabbitMQ服務:

rabbitmqctl stop
rabbitmq-server -detached

將mq02與mq01組成集羣:

./rabbitmqctl stop_app
./rabbitmqctl join_cluster rabbit@mq01
./rabbitmqctl stop
./rabbitmq-server -detached

若是要使用內存節點,則可使用--ram:

rabbitmqctl join_cluster --ram rabbit@mq01

查看集羣是否配置成功:

rabbitmqctl cluster_status
  • HA集羣模式配置

 上面配置RabbitMQ默認集羣模式,但並不保證隊列的高可用性,儘管交換機、綁定這些能夠複製到集羣裏的任何一個節點,可是隊列內容不會複製,雖然該模式解決一部分節點壓力,但隊列節點宕機直接致使該隊列沒法使用,只能等待重啓,因此要想在隊列節點宕機或故障也能正常使用,就要複製隊列內容到集羣裏的每一個節點,須要建立鏡像隊列。

  • 設置鏡像隊列策略

在任意一個節點上執行:

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

將全部隊列設置爲鏡像隊列,即隊列會被複制到各個節點,各個節點狀態保持一直。

若是要爲制定的vhost建立策略則使用-p:

rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'
這行命令在vhost名稱爲hrsystem建立了一個策略,策略名稱爲ha-allqueue,策略模式爲 all 即複製到全部節點,包含新增節點,
策略正則表達式爲 「^」 表示全部匹配全部隊列名稱。
例如rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'

注意:"^message" 這個規則要根據本身修改,這個是指同步"message"開頭的隊列名稱,咱們配置時使用的應用於全部隊列,因此表達式爲"^"

 
  • 安裝並配置 HAProxy

在 服務器上安裝 HAProxy,而後修改
/etc/haproxy/haproxy.cfg:

listen rabbitmq_cluster 0.0.0.0:5672

mode tcp
balance roundrobin

server   node1 192.168.1.242:5672 check inter 2000 rise 2 fall 3  
server   node2 192.168.1.243:5672 check inter 2000 rise 2 fall 3
相關文章
相關標籤/搜索