Docker安裝rabbitMQ主從


環境准備

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);

總結

綜上所述,對於可靠性要求比較高的場合,推薦使用鏡像模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM