RabbitMq集羣環境搭建

序言

在centos7的環境下搭建RabbitMq.RabbitMq和Erlang 都是採用的最新版本.且都是官網上推薦的下載地址下載的.另外歡迎騷擾:[email protected]

RabbitMQ 基於Erlang實現的,所以在安裝rabbitmq之前需要先安裝erlang,安裝的時候需要注意erlang的版本號與rabbitmq的版本號。 

安裝注意:erlang版本號需要兼顧rabbitmq版本。版本不對,是無法啓動rabbitmq的(另外erlang和rabbitmq的安裝文件區分了Centos6 centos7 centos8 一定要對應下載.下載地址官方有,你不會下可以聯繫[email protected])。 
官網版本對應表:http://www.rabbitmq.com/which-erlang.html

 

RabbitMq集羣模式

  • 單一模式:即單機情況不做集羣,就單獨運行一個rabbitmq而已。
  • 普通模式:默認模式,以兩個節點(rabbit01、rabbit02)爲例來進行說明。對於Queue來說,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。當消息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行消息傳輸,把A中的消息實體取出並經過B發送給consumer。所以consumer應儘量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。當rabbit01節點故障後,rabbit02節點無法取到rabbit01節點中還未消費的消息實體。如果做了消息持久化,那麼得等rabbit01節點恢復,然後纔可被消費;如果沒有持久化的話,就會產生消息丟失的現象。
  • 鏡像模式:  把需要的隊列做成鏡像隊列,存在與多個節點屬於RabbitMQ的HA方案該模式解決了普通模式中的問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在客戶端取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集羣內部的網絡帶寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用。(這個是不是Master與Slaves模式有待驗證)

 

RabbitMq集羣設計圖(本測試要實現的環境搭建)

RabbitMQ的集羣節點包括內存節點、磁盤節點。

RabbitMQ支持消息的持久化也就是數據寫在磁盤上,最合適的方案就是既有內存節點,又有磁盤節點。

 

RabbitMq安裝步驟

 

單機版RabbitMq

首先從官方(https://packagecloud.io/rabbitmq):上下載 Erlang(erlang-22.1.5-1.el7.x86_64.rpm)和RabbitMq

按照如下命令就可以啓動一個單機版的RabbitMq.RabbitMQ啓動之後,默認的名稱是Rabbit,監聽的端口是5672,web服務的端口是15672

#首先更新升級或者安裝一些基礎庫和erlang的依賴
[root@slave1 [email protected]]#  yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel gtk3-devel binutils-devel mesa* freeglut*


#安裝erlang依賴
[root@slave1 [email protected]]#  rpm -ivh erlang-22.1.5-1.el7.x86_64.rpm 

#安裝rabbitmq
[root@slave1 [email protected]]# rpm -ivh rabbitmq-server-3.8.1-1.el7.noarch.rpm 


#設置配置文件權限--這個是啓動報錯的是後才用
[root@slave1 [email protected]]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie


#設置配置文件權限--這個是啓動報錯的是後才用
[root@slave1 [email protected]]# chmod 400 /var/lib/rabbitmq/.erlang.cookie 

#啓動rabbitmq
[root@slave1 [email protected]]# systemctl start rabbitmq-server

#查看rabbitmq啓動狀態
[root@slave1 [email protected]]# systemctl status rabbitmq-server

#查看rabbitmq自帶的一些插件.所有的都包含在這裏了
[root@slave1 [email protected]]# rabbitmq-plugins list

#RabbitMQ網頁管理的端口是15672,但是現在還不能訪問,需要添加網頁插件才能訪問
#可以不需要關閉rabbitmq就可以添加插件
[root@slave1 [email protected]]# rabbitmq-plugins enable rabbitmq_management

#添加賬號密碼:cuiyaonan2000/cuiyaonan2000
[root@slave1 [email protected]]# rabbitmqctl add_user cuiyaonan2000 cuiyaonan2000

#爲剛纔的賬號添加權限-----致此可以用該賬號密碼登陸
[root@slave1 [email protected]]# rabbitmqctl set_permissions -p "/" cuiyaonan2000 ".*" ".*" ".*"

#修改用戶角色 這個明顯是管理員角色
[root@slave1 [email protected]]# rabbitmqctl set_user_tags cuiyaonan2000  administrator

如下的是用戶操作的常用命令當然是基於web插件的基礎上;

# 新增一個用戶
rabbitmqctl add_user Username Password
# 刪除一個用戶
rabbitmqctl delete_user Username
# 修改用戶的密碼
rabbitmqctl change_password Username Newpassword
# 查看當前用戶列表
rabbitmqctl list_users

# 用戶角色:
(1) 超級管理員(administrator)
可登陸管理控制檯(啓用management plugin的情況下),可查看所有的信息,並且可以對用戶,策略(policy)進行操作。

(2) 監控者(monitoring)
可登陸管理控制檯(啓用management plugin的情況下),同時可以查看rabbitmq節點的相關信息(進程數,內存使用情況,磁盤使用情況等)

(3) 策略制定者(policymaker)
可登陸管理控制檯(啓用management plugin的情況下), 同時可以對policy進行管理。但無法查看節點的相關信息(上圖紅框標識的部分)。
與administrator的對比,administrator能看到這些內容

(4) 普通管理者(management)
僅可登陸管理控制檯(啓用management plugin的情況下),無法看到節點信息,也無法對策略進行管理。

(5) 其他
無法登陸管理控制檯,通常就是普通的生產者和消費者。

# 設置用戶角色的命令爲:
rabbitmqctl set_user_tags User Tag
# User爲用戶名, Tag爲角色名(對應於上面的administrator,monitoring,policymaker,management,或其他自定義名稱)。
# 也可以給同一用戶設置多個角色,例如
rabbitmqctl set_user_tags hncscwc monitoring policymaker

# 允許用戶遠程訪問
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

 

剩餘的常用命令如下:

# 停止服務
rabbitmqctl -n rabbit@izuf6e78y3y0pi1watmli4z stop_app
# 加入集羣 --ram 類型爲內存節點;不加此參數默認爲磁盤節點
rabbitmqctl -n rabbit@izuf6e78y3y0pi1watmli4z join_cluster --ram rabbit@izuf6ghdadtcqh6fnjs6zgz
# 啓動服務
rabbitmqctl -n rabbit@izuf6e78y3y0pi1watmli4z start_app
# 查看節點的集羣狀態
rabbitmqctl -n rabbit_2@izuf6ghdadtcqh6fnjs6zgz cluster_status
# 啓動界面管理服務插件
rabbitmq-plugins -n rabbit_2@izuf6ghdadtcqh6fnjs6zgz enable rabbitmq_management
# 將節點移除集羣
rabbitmqctl -n rabbit_2@izuf6e78y3y0pi1watmli4z reset

# 更改節點類型 disc:磁盤節點;ram:內存節點
rabbitmqctl -n rabbit@izuf6ghdadtcqh6fnjs6zgz change_cluster_node_type disc
查看rabbitMq進程:ps -ef | grep rabbitmq

默認監聽端口15672/5672:netstat -anplt | grep LISTEN rabbitmq

 

普通集羣

Rabbitmq的集羣是依附於erlang的集羣來工作的,所以必須先構建起erlang的集羣鏡像。Erlang的集羣中各節點是經由過程一個magic cookie來實現的,這個cookie存放在 $home/.erlang.cookie 中,我的是用rpm安裝的,所以.erlang.cookie就放在/var/lib/rabbitmq中  另外 .erlang.cookie是隱藏的,需要用命令顯示出來~~~

# .erlang.cookie 路徑
cd /var/lib/rabbitmq

# 修改其他節點服務器的的.erlang.cookie 保證所有服務器的 .erlang.cookie文件保持一致
# 修改文件權限(可編輯):
chmod 777  /var/lib/rabbitmq/.erlang.cookie
# 修改完 .erlang.cookie 後必須改回文件權限(啓動前必須設置400,只有owner擁有權限即可,否則啓動rabbitmq服務失敗)
chmod 400  /var/lib/rabbitmq/.erlang.cookie

 

erlang.cookie複製完成後,逐個重啓節點服務:

systemctl restart rabbitmq-server.service
systemctl status rabbitmq-server.service

添加到集羣.將rabbit@Master作爲集羣主節點,在節點slave1和節點slave2上面分別執行如下命令,以加入集羣中.(同時注意可以再添加節點的時候設置節點是磁盤服務器還是內存服務器,默認是磁盤服務器)

[root@slave1 [email protected]]   rabbitmqctl stop_app
[root@slave1 [email protected]]   rabbitmqctl reset
[root@slave1 [email protected]]   rabbitmqctl join_cluster rabbit@Master
[root@slave1 [email protected]]   rabbitmqctl start_app

 

每臺都克以查看集羣狀態(master是與slave上的展示內容是不一樣的)

rabbitmqctl cluster_status

賬號管理

添加賬號:
rabbitmqctl add_user admin admin
添加 權限tag
rabbitmqctl set_user_tags admin administrator
 
刪除用戶(刪除guest用戶)
[root@v01-app-rabbitmq01 rabbitmq]# rabbitmqctl delete_user guest
Deleting user "guest"
 
修改用戶的密碼
rabbitmqctl  change_password  Username  Newpassword
 
[root@v01-app-rabbitmq01 ~]# rabbitmqctl  change_password  admin 0GM1aol4z8GeSZY99
Changing password for user "admin"
 
查看當前用戶列表
rabbitmqctl  list_users
Listing users
admin   [administrator]

 

訪問WEB地址:192.168.2.108:15672 然後又 finsh.當然還有多熟悉命令.這裏肯能不全.自行百度吧如果有問題歡迎騷擾:[email protected]

 

 

集羣鏡像模式

鏡像模式就是集羣的高可用,同步麼~~~~防止數據丟失.有兩種設置方式.一種是用命令,另外一種是在web上直接設置.

命令模式如下

設置鏡像隊列策略(注意設置鏡像隊列~~~~~~~~~~~~~而非鏡像服務器)

# 在任意一個節點上執行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

# 查看策略
rabbitmqctl list_policies
在cluster中任意節點啓用策略,策略會自動同步到集羣節點

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"開頭的隊列名稱,
我們配置時使用的應用於所有隊列,所以表達式爲"^"

官方set_policy說明參見
set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
(http://www.rabbitmq.com/man/rabbitmqctl.1.man.html)

 

web端創建

1.點擊admin菜單-->右側的Virtual Hosts選項- Add a new virtual host 

 

2.點擊admin菜單-->右側的Policies選項-->左側最下下邊的Add / update a policy

 

添加一個queues隊列

 

關於鏡像隊列的一些命令

 

新建隊列: virtual_host: rabbitmqctl add_vhost  xxx
撤銷隊列: virtual_host: rabbitmqctl delete_vhost  xxx
刪除隊列:rabbitmqctl -p /activity purge_queue activity_register

 

 

關於RabbitMq的Vhost(這個都是細節~~關於權限)

      vhost是rabbitmq分配權限的最小細粒度。

      比如我們可以爲一個用戶分配一個可以訪問哪個或者哪一些vhost的權限。但是不能爲用戶分配一個可以訪問哪一些exchange,或者queue的權限, 因爲rabbitmq的權限細粒度沒有細化到交換器和隊列,他的最小細粒度是vhost(vhost中包含許多的exchanges,queues,bingdings)。

     所以如果exchangeA 和queueA 只能讓用戶A訪問,exchangeB 和queueB 只能讓用戶B訪問,要達到這種需求,只能爲exchangeA 和queueA創建一個vhostA,爲exchangeB 和queueB 創建vhostB,這樣就隔離開來了。

補充:一個broker可以開設多個vhost,用於不同用戶的權限分離

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章