1. 程式人生 > >RabbitMQ安裝及使用

RabbitMQ安裝及使用

下載

由於RabbitMQ是基於Erlang語言開發,所以在安裝RabbitMQ之前,需要先安裝Erlang。好在RabbitMQ官網已經為我們提供了Erlang的安裝包

本人使用的作業系統為:CentOS7

下載的Erlang安裝包為:erlang-19.0.4-1.el7.centos.x86_64.rpm

下載的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.3

安裝RabbitMQ

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/[email protected] ###### ## /var/log/rabbitmq/[email protected] ########## 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

由於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檔案也要正確,分別是mq01、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 [email protected]
./rabbitmqctl stop
./rabbitmq-server -detached

如果要使用記憶體節點,則可以使用–ram:

rabbitmqctl join_cluster --ram [email protected]

檢視叢集是否配置成功:

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

這個世界上沒有知識是學不會的,不是嗎?如果一開始學不會,就可以把問題細化分解,然後學習更基本的知識。最後,所有問題都能變得和1+1=2一樣簡單,我們需要的只是時間。好了,最後給大家推薦一個學習Java的好網站JAVA自學網站–how2j.cn