- 本文實現(xiàn)在一個docker宿主機的環(huán)境下設置 rabbitmq 集群
RabbitMQ是基于高級消息隊列協(xié)議(AMQP)實現(xiàn)的開源消息代理軟件罐氨,主要提供消息隊列服務壮不。
首先 pull rabbitmq 的docker鏡像
docker pull rabbitmq:management
首先我們要是設置docker 的網(wǎng)絡環(huán)境, 以便于容器之間進行通訊到逊, 這里我們使用 docker network
來進行網(wǎng)絡設置,
現(xiàn)在創(chuàng)建一個網(wǎng)絡名為my_net且driver為bridge的網(wǎng)絡:(默認創(chuàng)建的就是bridge)
docker network create my_net
docker network ls
NETWORK ID NAME DRIVER SCOPE
da6f92e9cb4f bridge bridge local
1ce44ae321b6 host host local
f67c52c15141 my_net bridge local
7f8fe50b3756 none null local
網(wǎng)絡環(huán)境設置好之后,就開始準備創(chuàng)建容器了, 在創(chuàng)建之前有幾點需要注意的地方
- 如果要做集群的話 一定要注意erlang 的 cookie的一致性译仗, 使用 rabbitmq鏡像里面
RABBITMQ_ERLANG_COOKIE
這個來進行設置 (重要) - 設置每個rabbitmq 的節(jié)點名稱 使用
RABBITMQ_NODENAME
來設置
所以我們的docker 容器的生成就是這樣的:
在同一個RabbitMQ集群中,節(jié)點之間并沒有主從之分官觅,所有節(jié)點會同步相同的隊列結(jié)構(gòu)
某種意義上的主機
docker run -d --name=rabbitmq_master -e RABBITMQ_ERLANG_COOKIE=myerlangcookie -e RABBITMQ_NODENAME=mqmaster -p 5672:5672 -p 4369:4369 -p 25672 :25672 -p 15672:15672 --network my_net --network-alias network_mqmaster rabbitmq:management
某種意義上的從機 (留了端口的)
docker run -d --name=rabbitmq_slave1 -e RABBITMQ_ERLANG_COOKIE=myerlangcookie -e RABBITMQ_NODENAME=mqslave1 -p 5673:5672 -p 4370:7369 -p 25673 :25672 -p 15673:15672 --network my_net --network-alias network_mqslave1 rabbitmq:management
某種意義上的從機 (沒有留端口的)
docker run -d --name=rabbitmq_slave2 -e RABBITMQ_ERLANG_COOKIE=myerlangcookie -e RABBITMQ_NODENAME=mqslave2 --network my_net --network-alias network_mqslave2 rabbitmq:management
進入到rabbitmq_master當中 使用 rabbitmqctl cluster_status
查看集群狀態(tài)
docker exec -it rabbitmq_master bash
cd sbin
rabbitmqctl cluster_status
Cluster status of node mqmaster@28c2418baba1 ...
[{nodes,[{disc,[mqmaster@28c2418baba1]}]},
{running_nodes,[mqmaster@28c2418baba1]},
{cluster_name,<<"mqmaster@28c2418baba1">>},
{partitions,[]},
{alarms,[{mqmaster@28c2418baba1,[]}]}]
看到 nodes 里面 只有當前我們的這個節(jié)點并沒有其他的節(jié)點
現(xiàn)在我們進入到rabbitmq_slave1中配置加入到集群當中,
docker exec -it rabbitmq_slave1 bash
cd sbin
# 再添加集群之前首先要 關(guān)閉當前的節(jié)點
rabbitmqctl stop_app
# 開始添加到 集群當中, @前面是 節(jié)點名稱纵菌, 后面是 host, host 可以在 查看集群狀態(tài)的時候獲得
#--ram選項表示節(jié)點以內(nèi)存存儲方式運行休涤,讀寫速度快咱圆,重啟后內(nèi)容會丟失;不加--ram選項,節(jié)點則以磁盤存儲方式運行序苏,
雖然讀寫速度慢手幢,但是內(nèi)容一般可以持久保持
rabbitmqctl join_cluster --ram mqmaster@28c2418baba1
Clustering node mqslave1@0a038c6ae449 with mqmaster@28c2418baba1
#重新開啟節(jié)點
rabbitmqctl start_app
重新回到 rabbitmq_master容器里面查看集群狀態(tài)
root@28c2418baba1:/sbin# rabbitmqctl cluster_status
Cluster status of node mqmaster@28c2418baba1 ...
[{nodes,[{disc,[mqmaster@28c2418baba1]},
{ram,[mqslave2@ddb963c55357,mqslave1@0a038c6ae449]}]},
{running_nodes,[mqslave2@ddb963c55357,mqslave1@0a038c6ae449,
mqmaster@28c2418baba1]},
{cluster_name,<<"mqmaster@28c2418baba1">>},
{partitions,[]},
{alarms,[{mqslave2@ddb963c55357,[]},
{mqslave1@0a038c6ae449,[]},
{mqmaster@28c2418baba1,[]}]}]
說明集群正常, 創(chuàng)建隊列杠览, 發(fā)送數(shù)據(jù)測試
root@28c2418baba1:/sbin# rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
hello 2
每個節(jié)點里面數(shù)據(jù)正常弯菊,
一些運維操作
停止某個指定的節(jié)點,比如停止第2個節(jié)點:
./sbin/rabbitmqctl -n rabbitmq_slave1 stop
查看節(jié)點3的集群狀態(tài):
./sbin/rabbitmqctl -n rabbitmq_slave2 cluster_status
附一張截圖
參考:
docker network https://www.cnblogs.com/jsonhc/p/7823286.html