原文地址:https://www.jianshu.com/p/11963564dd3d
教你如何從0開始搭建rabbitmq集群
一、准備工作
1、三台centos虛擬機
2、三台虛擬機都安裝了docker
3、假設三台虛擬機的ip是192.168.2.128,192.168.2.129,192.168.2.130
二、搭建rabbitmq集群
1、3台機子分別配置host文件
vim /etc/hosts
填入內容:
192.168.2.128 rabbit1
192.168.2.129 rabbit2
192.168.2.130 rabbit3
2、運行rabbit容器
在rabbit1機器運行
docker run -d --hostname rabbit1 --net=host --name myrabbit1 -p 4369:4369 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
在rabbit2機器運行
docker run -d --hostname rabbit2 --net=host --name myrabbit2 -p 4369:4369 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
在rabbit3機器運行
docker run -d --hostname rabbit3 --net=host --name myrabbit3 -p 4369:4369 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
3、加入集群
在rabbit2機器執行命令
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
exit
在rabbit3機器執行命令
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
exit
進入 192.168.2.130:15672 查看狀態賬號密碼是guest/guest
如果要摘除節點,在rabbit1機器執行:
docker exec -it myrabbit1 bash
rabbitmqctl forget_cluster_node rabbit@rabbit3
exit
點擊queues,填寫隊列名,然后新增一個隊列
此時隊列內容沒冗余,只存在rabbit1中,當rabbit1的隊列服務掛了,此隊列也不可用了。
在rabbit1機器執行
docker stop myrabbit1
再查看管理台
三、創建鏡像隊列
重新啟動rabbit1
docker start myrabbit1
新建2個隊列extqueue和nodesqueue
rabbitmqctl set_policy [-p
指令參數詳情
參數名稱 描述
-p 可選參數,針對指定 vhost 下的exchange或 queue
--priority 可選參數,policy 的優先級
--apply-to 可選參數,策略適用的對象類型,其值可為 "queues", "exchanges" 或 "all".默認是"all"
name policy 的名稱
pattern 匹配模式(正則表達式)
definition 鏡像定義,json 格式,包括三部分(ha-mode,ha-params,ha-sync-mode)具體配置見下表
definition參數詳情
參數名稱 描述
ha-mode 指名鏡像隊列模式,其值可為"all","exactly"或"nodes",all:表示在集群所有節點上進行鏡像;exactly:表示在指定個數的節點上鏡像,節點個數由 ha-params 指定;nodes:表示在指定節點上進行鏡像,節點名稱通過ha-params 指定。
ha-params ha-mode模式需要用到的參數:exactly 模式下為數字表述鏡像節點數,nodes 模式下為節點列表表示需要鏡像的節點。
ha-sync-mode 鏡像隊列中消息的同步方式,其值可為"automatic"或"manually".
例子:要對規則是^ext*的隊列增加鏡像隊列,一共是2個隊列
docker exec -it myrabbit1 bash
rabbitmqctl set_policy --apply-to queues extpolicy "^ext*" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
exit
例子:要對規則是^nodes*的隊列增加鏡像隊列,分別在rabbit@rabbit2和rabbit@rabbit3兩台服務器上鏡像
docker exec -it myrabbit1 bash
rabbitmqctl set_policy --apply-to queues nodespolicy "^nodes*" '{"ha-mode":"nodes","ha-params":["rabbit@rabbit2","rabbit@rabbit3"],"ha-sync-mode":"automatic"}'
exit
可以看到都匹配到對應的規則,有1個冗余的隊列。
此時我們把rabbit2停掉看一看效果;
在rabbit2的機器上執行
docker stop myrabbit2
nodesqueue隊列依舊工作
extqueue隊列的鏡像隊列換了一個。