環境准備
Centos 7.5虛擬機三台:
- 192.168.102.128
- 192.168.102.130
- 192.168.102.131
以上虛擬機統一安裝docker環境
三台機器分別配置如下所示的hosts文件,以供rabbitmq容器使用
$ vim /home/rabbitmq/hosts
//文件中寫入以下內容:
192.168.102.128 rabbit1 rabbit1
192.168.102.130 rabbit2 rabbit2
192.168.102.131 rabbit3 rabbit3
搭建過程
拉取鏡像
在三台機器上,分別management版本的rabbitmq鏡像
$ docker pull rabbitmq:management
創建容器
在三台機器上分別創建rabbitmq容器
- 在192.168.102.128上創建容器rabbit1
$ docker run --restart=unless-stopped -h rabbit1 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name myrabbit1 \
-v /home/rabbitmq:/var/lib/rabbitmq:z \
-v /home/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-e RABBITMQ_ERLANG_COOKIE='xxx_2019' \
rabbitmq:management
- 在192.168.102.130上創建容器rabbit2
$ docker run --restart=unless-stopped -h rabbit2 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name myrabbit2 \
-v /home/rabbitmq:/var/lib/rabbitmq:z \
-v /home/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='xxx_2019' \
rabbitmq:management
- 在192.168.102.131上創建容器rabbit3
$ docker run --restart=unless-stopped -h rabbit3 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name myrabbit3 \
-v /home/rabbitmq:/var/lib/rabbitmq:z \
-v /home/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='xxx_2019' \
rabbitmq:management
參數說明:
- -d 表示容器后台運行
- -h rabbit1 容器的主機名是rabbit1,容器內部的hostname
- -v /home/rabbitmq:/var/lib/rabbitmq:z 將宿主機目錄/home/rabbitmq掛載到容器的/var/lib/rabbitmq目錄。z是一個標記,在selinux環境下使用
- -e RABBITMQ_ERLANG_COOKIE='rabbit_cluster' 設置rabbitmq的cookie,該值可以任意設置,只需要三個容器保持一致即可
綁定集群
- 重置myrabbit1節點
$ docker exec -it myrabbit1 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app
- 加入myrabbit2節點到集群中
$ docker exec -it myrabbit2 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit1 && rabbitmqctl start_app
- 加入myrabbit3節點到集群中
$ docker exec -it myrabbit3 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit2 && rabbitmqctl start_app
查詢集群狀態
$ rabbitmqctl cluster_status
故障節點的處理
$ docker exec -it rabbit2 /bin/bash
$ rabbitmqctl stop_app
在一個正常的節點上移除一個異常的節點
$ docker exec -it rabbit1 /bin/bash
$ rabbitmqctl forget_cluster_node rabbit@rabbit2
集群模式
普通模式
基本特征
- 交換機和隊列的元數據存在於所有的節點上
- 隊列中的完整數據只存在於創建該隊列的節點上
- 其他節點只保存隊列的元數據信息以及指向當前隊列的owner node的指針
數據消費
進行數據消費時隨機連接到一個節點,當隊列不是當前節點創建的時候,需要有一個從創建隊列的實例拉取隊列數據的開銷。此外由於需要固定從單實例獲取數據,因此會出現單實例的瓶頸。
優點
可以由多個節點消費單個隊列的數據,提高了吞吐量
缺點
- 節點實例需要拉取數據,因此集群內部存在大量的數據傳輸
- 可用性保障低,一旦創建隊列的節點宕機,只有等到該節點恢復其他節點才能繼續消費消息
示意圖
鏡像模式
基本特征
- 創建的queue,不論是元數據還是完整數據都會在每一個節點上保存一份
- 向queue中寫消息時,都會自動同步到每一個節點上
優點
- 保障了集群的高可用
- 配置方便,只需要在后台配置相應的策略,就可以將指定數據同步到指定的節點或者全部節點
缺點
- 性能開銷較大,網絡帶寬壓力和消耗很嚴重
- 無法線性擴展,例如單個queue的數據量很大,每台機器都要存儲同樣大量的數據
示意圖
策略配置
全部節點鏡像策略創建
指定節點數鏡像策略創建
參數說明:
- Pattern 模式:""為全部;"all-"為所有all-開頭
- Priority 優先級:建議10,比較耗費資源
- Definition 定義參數:
ha-mode=all 或 exactly;
ha-sync-mode=automatic;
ha-params=2(ha-mode=exactly);
總結
綜上所述,對於可靠性要求比較高的場合,推薦使用鏡像模式。