docker搭建rabbitmq集羣
一、簡介
最近項目中又開始使用rabbitmq了,此處簡單記錄一下如何使用docker來搭建一個rabbitmq集羣。
二、需求
在一個雲服務器上,使用docker搭建2個節點的集羣,此處搭建基於鏡像模式
集羣,而不是一般集羣模式。
節點 | 主機名 | 容器名 | 數據卷 | 用戶名 | 密碼 | management port | amqp port | 磁盤類型 |
---|---|---|---|---|---|---|---|---|
節點一 | node1 | rabbitmq01 | rabbitmq-01 | rabbitmq | rabbitmq | 15672:15672 | 5672:5672 | disc |
節點二 | node2 | abbitmq02 | rabbitmq-02 | rabbitmq | rabbitmq | 15673:15672 | 5673:5672 | ram |
其中: 節點2加入節點1,構成集羣
三、集羣注意事項
1、節點(nodes
)的名稱定義
在 rabbitmq 集羣中,節點的名稱
一般是有前綴
和主機名
這2部分組成,在一個集羣中
,節點的名稱不可重複
,必須是唯一的。
eg:
rabbit@node1
|- rabbit ===> 前綴
|- node1 ===> 主機名
2、集羣中,節點的主機名必須要能互相都能訪問
3、rabbitmq集羣是基於erlang的,而erlang集羣是通過magic cookie來通訊的,在 rabbitmq 中,需要保證 .erlang.cookie 的文件裏面的值必須是一致的,且該文件的權限是600。該cookie文件的生成應該是在集羣部署階段。
4、端口訪問
1、15672:一般是訪問控制檯或http api 的端口
2、5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS
5、集羣節點類型
在集羣中存在2中類型的節點,磁盤(disc)
節點和內存(ram)
節點。
1、磁盤節點所有的數據都是存在磁盤上
2、內存節點的數據是存在內存中,但不是所有的數據都是存在內存中的
,比如:消息只會存在索引等。
3、在一個集羣中至少
需要一個
磁盤(disc)
節點
6、新的節點加入已經存在的集羣時,節點必須要reset
7、使用docker建rabbitmq集羣注意事項
- 容器中的數據是保存在
/var/lib/rabbitmq
目錄中,因此爲了容器中的數據不丟失,需要自建創建數據掛在目錄,或數據卷(volume
)。 --hostname
指定docker容器的主機名RABBITMQ_DEFAULT_USER
指定rabbitmq用戶名RABBITMQ_DEFAULT_PASS
指定rabbitmq密碼RABBITMQ_ERLANG_COOKIE
指定cookie的值,集羣中該值必須要一致
四、使用docker構建集羣步驟
1、創建數據卷
docker volume create rabbitmq-01
docker volume create rabbitmq-02
2、啓動2個rabbitmq容器
1、節點一啓動命令
docker run -d --hostname node1 --name rabbitmq-01 -p 15672:15672 \
-p 5672:5672 -e RABBITMQ_DEFAULT_USER=rabbitmq -e \
RABBITMQ_DEFAULT_PASS=rabbitmq -e RABBITMQ_ERLANG_COOKIE='aabbccddeeffgg' \
-v rabbitmq-01:/var/lib/rabbitmq rabbitmq:3.8.0-management
2、節點二啓動命令
docker run -d --hostname node2 --name rabbitmq-02 -p 15673:15672 \
-p 5673:5672 -e RABBITMQ_DEFAULT_USER=rabbitmq \
-e RABBITMQ_DEFAULT_PASS=rabbitmq \
-e RABBITMQ_ERLANG_COOKIE='aabbccddeeffgg' --link rabbitmq-01:node-1 \
-v rabbitmq-02:/var/lib/rabbitmq rabbitmq:3.8.0-management
3、將 node2 加入到 node1 集羣中
1、node1 下執行如下命令
docker exec -it rabbitmq-01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
2、node2 下執行如下命令
ocker exec -it rabbitmq-02 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@node1
rabbitmqctl start_app
4、配置鏡像隊列
在任何一個節點上執行如下命令:
rabbitmqctl set_prolich ha-all "^" '{"ha-mode":"all"}'
表示在默認的vhout(/)上隊列/交換機/綁定等數據都是同步的。
5、鏡像隊列配置規則參考
https://www.rabbitmq.com/ha.html
到此我們的集羣搭建完畢。