參考:https://www.cnblogs.com/knowledgesea/p/6535766.html
考慮 rabbitmq 的高可用性,我們需要給 RabbitMQ 搭建集群環境。
一、rabbitmq 有3種模式,集群模式是2種。
1. 單一模式:即單機情況不做集群,就單獨運行一個 rabbitmq
2. 普通模式:默認模式,以兩個節點(rabbit01、rabbit02)為例來說明。對於 queue 來說,消息實體只存在於其中一個節點,rabbit01 和 rabbit02 兩個節點僅有相同的元數據,及隊列的結構。當消息進入 rabbit01 節點的 queue 后,consumer 從 rabbit02 節點消費時,RabbitMQ 會臨時在 rabbit01、rabbit02 間進行消息傳輸,把 A 中的消息實體取出並經過 B 發送給 consumer。所以 consumer 應盡量連接每一個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點建立物理 queue。否則無論 consumer 連 rabbit01 或者 rabbit02,出口總在 rabbit01,會產生瓶頸。當 rabbit01 節點故障后,rabbit02 節點無法取到 rabbit01 節點中還未消費的消息實體。如果做了消息持久化,那么等rabbit01 節點恢復,然后才可被消費;如果沒有持久化,就會產生消息丟失的現象。
3. 鏡像模式:把需要的隊列做成鏡像隊列,與多個節點屬於 RabbitMQ 的 HA 方案。該模式解決了普通模式中的問題,其實質和普通模式不同之處在於,消息實體會主動在鏡像節點間同步,而不是在客戶端取數據時臨時拉取。該模式帶來的副作用也很明顯,除了降低系統性能外,如果鏡像隊列數量過多,加之大量消息進入,集群內部的網絡帶寬將會被這種同步通訊大大消耗掉。所以在對可靠性要求較高的場合中適用。
二、搭建 RabbitMQ 的普通模式集群
1. 環境准備
1)兩台 CentOS7 的機器(cat /etc/redhat-release),hostname 分別是:
cat /etc/hosts
保證兩台機器都能互相 ping 通。
2. 分別在兩個機器上安裝 rabbitmq
/usr/lib/rabbitmq/bin
安裝成功后有些常用操作
./rabbitmq-server -deched --后台啟動服務
./rabbitmqctl start_app --啟動服務
./rabbitmqctl stop_app --關閉服務
./rabbitmq-plugins enable rabbitmq_management --啟動web管理插件
./rabbitmqctl add_user zlh zlh --添加用戶,密碼
./rabbitmqctl set_user_tags zlh administrator --設置zlh為admin權限
3. 設置 .erlang.cookie
RabbitMQ 的集群是依賴 erlang 集群,而 erlang 集群是通過這個 cookie 進行通信認證的,因此,我們做集群第一步就是修改 cookie。
在 $HOME 或者 /var/lib/rabbitmq 中,文件名稱為 .erlang.cookie,他是一個隱藏文件。修改兩個機器中的 .erlang.cookie 文件中 cookie 值一致,且權限為 owner 只讀。
chmod 600 .erlang.cookie
4. 查看集群狀態,我的已經做好了
5. 常用命令
1)停止當前機器中 rabbitmq 服務
./rabbitmqctl stop_app
2)加入集群
./rabbitmqctl join_cluster --ram rabbit@mini2
3)開啟當前機器的 rabbitmq 服務
./rabbitmqctl start_app
6. 打開網頁查看 nodes
三、搭建 rabbitmq 的鏡像高可用模式集群
鏡像模式要依賴 policy 模塊。
policy 中文是政策,策略的意思,那么他就是要設置,哪些 exchanges 或者 queue 的數據需要復制同步,如何復制同步。
./rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
參數意思為:
ha-all:策略名稱
^:匹配符。只有一個 ^ 代表匹配所有,^zl 為匹配名稱為 zl 的 exchanges 或者 queue
ha-mode:為匹配類型,分為3種模式:all- 所有 queue,exctly- 部分(需配置 ha-params參數,此參數為 int 類型,比如 3,眾多集群中的隨機 3 台機器),node- 指定(需配置 ha-params參數,此參數為數組類型,比如 ["rabbit@mini1","rabbit@mini2"] 這樣指定為 F與G這 2 台機器)。
在 web 管理界面也能配置