部署RabbitMQ集羣

部署 RabbitMQ Cluster

消息中間件簡介

​ 消息中間件也可以稱消息隊列,是指用高效可靠的消息傳遞機制進行與平臺無關的數據交流,並基於數據通信來進行分佈式系統的集成。通過提供消息傳遞和消息隊列模型,可以在分佈式環境下擴展進程的通信。當下主流的消息中間件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等。其能在不同平臺之間進行通信,常用來屏蔽各種平臺協議之間的特性,實現應用程序之間的協同。優點在於能夠在客戶端和服務器之間進行同步和異步的連接,並且在任何時刻都可以將消息進行傳送和轉發,是分佈式系統中非常重要的組件,主要用來解決應用耦合、異步通信、流量削峯等問題。

RabbitMQ特點

可靠性

靈活的路由

擴展性

高可用信

多種協議

多語言客戶端

管理界面

插件機制

rabbitmq基本命令

啓動監控管理器:rabbitmq-plugins enable rabbitmq_management
關閉監控管理器:rabbitmq-plugins disable rabbitmq_management
啓動rabbitmq:rabbitmq-service start
關閉rabbitmq:rabbitmq-service stop
查看所有的隊列:rabbitmqctl list_queues
清除所有的隊列:rabbitmqctl reset
關閉應用:rabbitmqctl stop_app
啓動應用:rabbitmqctl start_app

用戶和權限設置

添加用戶:rabbitmqctl add_user username password
分配角色:rabbitmqctl set_user_tags username administrator
新增虛擬主機:rabbitmqctl add_vhost vhost_name
將新虛擬主機授權給新用戶:rabbitmqctl set_permissions -p vhost_name username “.*” “.*” “.*”(後面三個”*”代表用戶擁有配置、寫、讀全部權限)

角色說明

  • 超級管理員(administrator)
    可登陸管理控制檯,可查看所有的信息,並且可以對用戶,策略(policy)進行操作。
  • 監控者(monitoring)
    可登陸管理控制檯,同時可以查看rabbitmq節點的相關信息(進程數,內存使用情況,磁盤使用情況等)
  • 策略制定者(policymaker)
    可登陸管理控制檯, 同時可以對policy進行管理。但無法查看節點的相關信息(上圖紅框標識的部分)。
  • 普通管理者(management)
    僅可登陸管理控制檯,無法看到節點信息,也無法對策略進行管理。
  • 其他
    無法登陸管理控制檯,通常就是普通的生產者和消費者。

原理介紹

RabbitMQ是依據erlang的分佈式特性(RabbitMQ底層是通過Erlang架構來實現的,所以rabbitmqctl會啓動Erlang節點,並基於Erlang節點來使用Erlang系統連接RabbitMQ節點,在連接過程中需要正確的Erlang Cookie和節點名稱,Erlang節點通過交換Erlang Cookie以獲得認證)來實現的,所以部署Rabbitmq分佈式集羣時要先安裝Erlang,並把其中一個服務的cookie複製到另外的節點。

RabbitMQ集羣中,各個RabbitMQ爲對等節點,即每個節點均提供給客戶端連接,進行消息的接收和發送。節點分爲內存節點和磁盤節點,一般的,均應建立爲磁盤節點,爲了防止機器重啓後的消息消失;

RabbitMQ的Cluster集羣模式一般分爲兩種,普通模式和鏡像模式。消息隊列通過RabbitMQ HA鏡像隊列進行消息隊列實體複製

消息中間件RabbitMQ,一般以集羣方式部署,主要提供消息的接受和發送,實現各微服務之間的消息異步。

rabbitmq 有 3 種模式,但集羣模式是 2 種

詳細如下:

  • 單一模式:即單機情況不做集羣,就單獨運行一個 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 方案。該模式解決了普通模式中的問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在客戶端取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量的消息進入,集羣內部的網絡帶寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用。

部署過程

1、環境準備

3臺centos7操作系統,ip分別爲:

192.168.11.131

192.168.11.134

192.168.11.133

2、修改主機名

hostnamectl --static set-hostname rabbitmq1

hostnamectl --static set-hostname rabbitmq2

hostnamectl --static set-hostname rabbitmq3

3、修改hosts文件

注:3臺都做

vim /etc/hosts
192.168.11.131 rabbitmq1
192.168.11.134 rabbitmq2
192.168.11.133 rabbitmq3

4、測試3臺能否ping通

ping rabbitmq1

ping rabbitmq2

ping rabbitmq3

5、安裝 rabbitmq 依賴 erlang 環境

注:3臺都安裝

yum install erlang

6、安裝 socat

注:3臺都安裝

yum install -y socat 

8、安裝 rabbitmq

注:3臺都安裝

yum -y install rabbitmq-server

9、rabbitmq 常用命令

注:3臺都做

systemctl start rabbitmq-server.service
systemctl stop rabbitmq-server.service
systemctl enable rabbitmq-server.service
systemctl restart rabbitmq-server.service

systemctl status rabbitmq-server.service

10、賬號配置

安裝啓動後其實還不能在其它機器訪問,rabbitmq 默認的 guest 賬號只能在本地機器訪問, 如果想在其它機器訪問必須配置其它賬號

配置管理員賬號:

可以創建管理員用戶,負責整個 MQ 的運維
[root@rabbitmq1 ~]# rabbitmqctl add_user admin admin
賦予其 administrator 角色
[root@rabbitmq1 ~]# rabbitmqctl set_user_tags admin administrator
創建和賦角色完成後查看並確認
[root@rabbitmq1 ~]# rabbitmqctl list_users

11、啓動 rabbitmq 內置 web 插件, 管理 rabbitmq 賬號等信息

rabbitmq-plugins enable rabbitmq_management

啓動服務:[root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service

網頁訪問 http://ip:15672

12、rabbitmq 用戶權限 VirtualHost

在 RabbitMQ 中可以虛擬消息服務器 VirtualHost,每個 VirtualHost 相當月一個相對獨立的 RabbitMQ 服務器,每個 VirtualHost 之間是相互隔離的。exchange、queue、message 不能互通。 在 RabbitMQ 中無法通過 AMQP 創建 VirtualHost,可以通過以下命令來創建

rabbitmqctl add_vhost [vhostname]
例:創建虛擬主機test
[root@rabbitmq1 ~]# rabbitmqctl add_vhost test

1)、新建用戶

rabbitmqctl add_user superrd superrd

2)、配置權限

set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
rabbitmqctl  set_permissions -p /  admin '.*' '.*' '.*'  

其中,.* 的位置分別用正則表達式來匹配特定的資源,如:

'^(amq.gen.*|amq.default)$'

可以匹配 server 生成的和默認的 exchange,’^$’不匹配任何資源

  • exchange 和 queue 的 declare 與 delete 分別需要 exchange 和 queue 上的配置權限
  • exchange 的 bind 與 unbind 需要 exchange 的讀寫權限
  • queue 的 bind 與 unbind 需要 queue 寫權限 exchange 的讀權限 發消息 (publish) 需 exchange 的寫權限
  • 獲取或清除 (get、consume、purge) 消息需 queue 的讀權限

示例:我們賦予 superrd 在“/”下面的全部資源的配置和讀寫權限。

rabbitmqctl set_permissions -p / superrd ".*" ".*" ".*"

注意”/”代表 virtual host 爲“/”這個“/”和 linux 裏的根目錄是有區別的並不是 virtual host 爲“/”可以訪問所以的 virtual host,把這個“/”理解成字符串就行。

需要注意的是 RabbitMQ 會緩存每個 connection 或 channel 的權限驗證結果、因此權限發生變化後需要重連才能生效。

3)、查看權限

rabbitmqctl list_user_permissions admin
rabbitmqctl list_permissions -p /

4)、配置角色

rabbitmqctl set_user_tags [user] [role]

RabbitMQ 中的角色分爲如下五類:none、management、policymaker、monitoring、administrator

官方解釋如下:

management 
User can access the management plugin 
policymaker 
User can access the management plugin and manage policies and parameters for the vhosts they have access to. 
monitoring 
User can access the management plugin and see all connections and channels as well as node-related information. 
administrator 
User can do everything monitoring can do, manage users, vhosts and permissions, close other user’s connections, and manage policies and parameters for all vhosts.
  • none 不能訪問 management plugin
  • management 用戶可以通過 AMQP 做的任何事外加: 列出自己可以通過 AMQP 登入的 virtual hosts 查看自己的 virtual hosts 中的 queues, exchanges 和 bindings 查看和關閉自己的 channels 和 connections 查看有關自己的 virtual hosts 的“全局”的統計信息,包含其他用戶在這些 virtual hosts 中的活動。
  • policymaker management 可以做的任何事外加: 查看、創建和刪除自己的 virtual hosts 所屬的 policies 和 parameters
  • monitoring management 可以做的任何事外加: 列出所有 virtual hosts,包括他們不能登錄的 virtual hosts 查看其他用戶的 connections 和 channels 查看節點級別的數據如 clustering 和 memory 使用情況 查看真正的關於所有 virtual hosts 的全局的統計信息
  • administrator policymaker 和 monitoring 可以做的任何事外加: 創建和刪除 virtual hosts 查看、創建和刪除 users 查看創建和刪除 permissions 關閉其他用戶的 connections

如下示例將 superrd 設置成 administrator 角色。

rabbitmqctl set_user_tags superrd administrator

搭建 rabbitmq 的一般模式集羣

在上述的 3 臺機器上安裝 rabbitmq 完成之後,你可以看到你的機器中有如下 1 個文件。路徑在 $HOME 中或者在 /var/lib/rabbitmq 中,文件名稱爲.erlang.cookie, 他是一個隱藏文件。那麼這文件存儲的內容是什麼,是做什麼用的呢?

RabbitMQ 的集羣是依賴 erlang 集羣,而 erlang 集羣是通過這個 cookie 進行通信認證的,因此我們做集羣的第一步就是幹 cookie。

1、必須使集羣中也就是rabbitmq2,rabbitmq3這兩臺機器的.erlang.cookie 文件中 cookie 值一致,且權限爲 owner 只讀。chmod 600 /var/lib/rabbitmq/.erlang.cookie

[root@rabbitmq1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
CDHWOZUUIDSSLRYVTHER

[root@rabbitmq1 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 21 May 25 10:47 /var/lib/rabbitmq/.erlang.cookie

[root@rabbitmq1 ~]#scp /var/lib/rabbitmq/.erlang.cookie rabbitmq2://var/lib/rabbitmq/

[root@rabbitmq1 ~]#scp /var/lib/rabbitmq/.erlang.cookie rabbitmq3://var/lib/rabbitmq/

[root@rabbitmq2 ~]# systemctl restart rabbitmq-server.service

[root@rabbitmq2 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 21 May 25 10:48 /var/lib/rabbitmq/.erlang.cookie

[root@rabbitmq3 ~]# systemctl restart rabbitmq-server.service

[root@rabbitmq3 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 21 May 25 10:48 /var/lib/rabbitmq/.erlang.cookie
[root@rabbitmq3 ~]# rabbitmqctl stop_app

[root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service

2、查看集羣狀態

[root@rabbitmq1 rabbitmq]# rabbitmqctl status

部署RabbitMQ集羣

部署RabbitMQ集羣
3、重啓 rabbitmq1機器中 rabbitmq 的服務 在 rabbitmq2,rabbitmq3 分別執行

rabbitmqctl stop_app #關閉應用
rabbitmqctl join_cluster --ram rabbit@rabbitmq1 #將rabbitmq2/3節點加入到rabbitmq1集羣
rabbitmqctl start_app #起應用
rabbitmq-plugins enable rabbitmq_management #導入rabbitmq的管理界面
systemctl restart rabbitmq-server.service #重啓rabbitmq服務

[root@rabbitmq1 ~]# systemctl restart rabbitmq-server.service

獲取集羣狀態信息:
[root@rabbitmq1 ~]# rabbitmqctl cluster_status

4、打開網頁管理頁面查看 nodes

http://192.168.11.131:15672

部署RabbitMQ集羣

搭建rabbitmq的鏡像高可用模式集羣

這一節要參考的文檔是:<http://www.rabbitmq.com/ha.html&gt;

首先鏡像模式要依賴policy模塊,這個模塊是做什麼用的呢?

policy中文來說是政策,策略的意思,那麼他就是要設置,那些Exchanges或者queue的數據需要複製,同步,如何複製同步?對就是做這些的。

這裏有點內容的,我先上例子慢慢說:

[root@rabbitmq1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

部署RabbitMQ集羣
參數意思爲:

ha-all:爲策略名稱。

^:爲匹配符,只有一個^代表匹配所有,^zlh爲匹配名稱爲zlh的exchanges或者queue。

ha-mode:爲匹配類型,他分爲3種模式:

  • all-所有(所有的 queue),
  • exctly-部分(需配置ha-params參數,此參數爲int類型比如3,衆多集羣中的隨機3臺機器),
  • nodes-指定(需配置ha-params參數,此參數爲數組類型比如["3rabbit@F","rabbit@G"]這樣指定爲F與G這2臺機器。)。

例:

部署RabbitMQ集羣

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