-
下載
由於RabbitMQ是基於Erlang語言開發,所以在安裝RabbitMQ之前,需要先安裝Erlang。好在RabbitMQ官網已經為我們提供了Erlang的安裝包
Erlang下載地址:http://www.rabbitmq.com/releases/erlang/
本人使用的操作系統為:CentOS7
下載的Erlang安裝包為:erlang-19.0.4-1.el7.centos.x86_64.rpm
RabbitMQ下載地址:https://www.rabbitmq.com/download.html
下載的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/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文件也要正確,分別是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 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