docker-compose安裝rabbitmq集群(主從集群---》鏡像集群)


docker-compose安裝rabbitmq集群(主從集群---》鏡像集群)

yls
2020/5/11

創建docker-compose.yml 文件

version: '3'
services:
  rabbitmq1:
    image: rabbitmq:3.8.3-management
    container_name: rabbitmq1
    restart: always
    hostname: rabbitmq1
    ports:
      - 15683:15672
      - 5683:5672
    volumes:
      - ./data1:/var/lib/rabbitmq
      - ./rabbitmq.sh:/home/rabbitmq.sh
      - ./etc/hosts:/etc/hosts
    environment:
      - RABBITMQ_DEFAULT_USER=root
      - RABBITMQ_DEFAULT_PASS=root
      - RABBITMQ_ERLANG_COOKIE=CURIOAPPLICATION
    networks:
      rabbit:
        ipv4_address: 192.168.6.2

  rabbitmq2:
    image: rabbitmq:3.8.3-management
    container_name: rabbitmq2
    restart: always
    hostname: rabbitmq2
    ports:
      - 15684:15672
      - 5684:5672
    volumes:
      - ./data2:/var/lib/rabbitmq
      - ./rabbitmq.sh:/home/rabbitmq.sh
      - ./etc/hosts:/etc/hosts
    environment:
      - RABBITMQ_DEFAULT_USER=root
      - RABBITMQ_DEFAULT_PASS=root
      - RABBITMQ_ERLANG_COOKIE=CURIOAPPLICATION
    networks:
      rabbit:
        ipv4_address: 192.168.6.3

  rabbitmq3:
    image: rabbitmq:3.8.3-management
    container_name: rabbitmq3
    restart: always
    hostname: rabbitmq3
    ports:
      - 15692:15672
      - 5692:5672
    volumes:
      - ./data3:/var/lib/rabbitmq
      - ./rabbitmq.sh:/home/rabbitmq.sh
      - ./etc/hosts:/etc/hosts
    environment:
      - RABBITMQ_DEFAULT_USER=root
      - RABBITMQ_DEFAULT_PASS=root
      - RABBITMQ_ERLANG_COOKIE=CURIOAPPLICATION
    networks:
      rabbit:
        ipv4_address: 192.168.6.4

networks:
  rabbit:
    external:
      name: rabbitmqnet

創建 rabbitmqnet 子網

docker network create --subnet 192.168.6.1/24 rabbitmqnet

創建 rabbitmq.sh 腳本

如果想用ram存儲就用第一個shell文件,用硬盤存儲就用第二個shell文件

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbitmq@rabbitmq1
rabbitmqctl start_app
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbitmq@rabbitmq1
rabbitmqctl start_app

配置docker-compose.yml文件同步目錄下的 ./etc/hosts 文件(集群節點間需能互相訪問,故每個集群節點的hosts文件應包含集群內所有節點的信息以保證互相解析)

192.168.6.2 rabbitmq1
192.168.6.3 rabbitmq2
192.168.6.4 rabbitmq3

注意:一定不要加rabbit@ ,我之前配成 192.168.6.4 rabbit@rabbitmq1 ,白白浪費好多時間

若不配置或者配錯hosts文件,會出現如下錯誤

sudo rabbitmqctl join_cluster --ram rabbit@rabbitmq11
Clustering node rrabbit@rabbitmq1 with rabbit@rabbitmq-node1...
Error: unable to connect to nodes rabbit@rabbitmq1]: nodedown
 
DIAGNOSTICS
===========
attempted to contact: [rabbit@rabbitmq1]
rabbit@rabbitmq-node1:
  * unable to connect to epmd (port 4369) on rabbitmq1: nxdomain (non-existing domain)
current node details:
- node name: 'rabbitmqctl-526rabbitmq1'
- home dir: /var/lib/rabbitmq
- cookie hash: 50YO3zK+HJHos0tab1vHjg==

docker-compose up -d 運行容器

docker exec -it rabbitmq1 bash 分別進入從節點容器(本文中從節點是 rabbitmq3,rabbitmq2),啟動腳本

chmod +777 /home/rabbitmq.sh

./home/rabbitmq.sh

主從集群已經搭建好,查看集群狀態 rabbitmqctl cluster_status

主從集群的不足: 默認情況下,隊列只位於主節點上,盡管他們可以從所有節點看到和訪問,也就是說整個集群與主節點共存亡。
因此,當主節點宕機時,無法進行自動的故障轉移,下面的隊列鏡像集群可以解決這個問題。

下面開始搭隊列鏡像集群

鏡像集群就是在主從集群的基礎上,添加相應策略,將主節點消息隊列中的信息備份到其它節點上,主節點宕機時,對整個集群不產生影響,使集群可以高可用。

添加策略(可以在創建隊列之前添加,也可以創建隊列之后添加)

參考官方文檔: https://www.rabbitmq.com/parameters.html#policies

策略模板([]表示可選參數,<>表示必穿參數)
rabbitmqctl set_policy [-p <vhost>] [--priority <priority>] [--apply-to <apply-to>] <name> <pattern> <definition>
參數 說明
-p vhost 對指定的vhost進行設置
name policy的名稱
pattern queue的匹配模式(正則表達式)
definition 鏡像定義:包含三個部分ha-mode,ha-params,ha-sync-mode
ha-mode:指明鏡像隊列的模式。all: 集群中所有節點進行鏡像;exactly:在指定個數節點進行鏡像,節點個數由ha-params指定;nodes:在指定節點進行鏡像,節點名稱由ha-params指定
ha-params: ha-mode模式需要用到的參數
ha-sync-mode: 消息的同步方式(automatic,manual)
priority policy的優先級,當有多個策略指定同一個隊列時,優先級高的策略生效

添加策略實例

rabbitmqctl set_policy ha-11 '^11' '{"ha-mode":"all","ha-sync-mode":"automatic"}'

說明:策略正則表達式為 "^" 表示匹配所有隊列名稱, ^11 :表示匹配hello開頭的隊列

查看當前策略

rabbitmqctl list_policies

刪除策略

rabbitmqctl clear_policy ha-11

以上策略的添加,刪除,查看都可以在web UI 界面操作。


免責聲明!

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



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