RabbitMq集群通过Docker搭建

画外音:

不知道哪里来了一家人好像已经确诊了新型冠状病毒感染的肺炎,就在距离我家不远的地方,明天就要封小区了,大家还是尽量不要出门在家里还是比较安全的,希望武汉能尽早挺过这次难关


首先创建一个bridge网络,使三个Mq可以正常网络通信

docker network create --subnet 172.8.0.0/16 rabbitnetwork

然后pull一个官方的rabbitMq镜像,最新的版本就可以

rabbitmq在docker中创建队列 rabbitmq docker集群_docker


然后分别启动三个容器即可,不需要挂载文件,保证三个容器中.erlang.cookie中的内容是一样的,并且指定host的名字,开放5672和15672两个端口

docker run -itd  --hostname rabbit01 --name rabbit01 -p5671:5672 -p15671:15672 -e RABBITMQ_ERLANG_COOKIE='mycookie' --network rabbitnetwork --ip 172.8.0.2 rabbitmq

docker run -itd  --hostname rabbit02 --name rabbit02 -p5672:5672 -p15672:15672 -e RABBITMQ_ERLANG_COOKIE='mycookie' --network rabbitnetwork --ip 172.8.0.3 rabbitmq

docker run -itd  --hostname rabbit03 --name rabbit03 -p5673:5672 -p15673:15672 -e RABBITMQ_ERLANG_COOKIE='mycookie' --network rabbitnetwork --ip 172.8.0.4 rabbitmq

我们将rabbit01作为master节点,然后我们分别进入rabbit02容器和rabbit03容器中执行如下命令,如果出现异常检查cookie是否相同

rabbitmqctl stop_app 
rabbitmqctl reset 
rabbitmqctl join_cluster --ram rabbit@rabbit01  //指定该当前节点为内存节点,默认为磁盘节点
rabbitmqctl start_app

写好之后我们执行一下命令查看集群状态

docker exec -it rabbit01 rabbitmqctl cluster_status

rabbitmq在docker中创建队列 rabbitmq docker集群_docker_02


最后我们去可视化页面上查看一下,默认rabbit manager插件是没有打开的,我们需要把每一个容器都打开(为啥要全部都打开打开一个不行吗?不行否则看不到其他容器中mq的状态

docker exec -it rabbit01 rabbitmq-plugins enable rabbitmq_management
docker exec -it rabbit02 rabbitmq-plugins enable rabbitmq_management
docker exec -it rabbit03 rabbitmq-plugins enable rabbitmq_management

开启之后,如果是云服务器看看安全组是否打开端口了

rabbitmq在docker中创建队列 rabbitmq docker集群_网络通信_03


看起来ok了,这种情况下queue和exchange会随着绑定的mq挂掉而不可用,如果想要完全同步就需要开启镜像模式

首先来到控制台,打开admin

rabbitmq在docker中创建队列 rabbitmq docker集群_网络通信_04


点击下方的添加或修改

rabbitmq在docker中创建队列 rabbitmq docker集群_Docker_05


添加好了之后,在rabbit01上新创建一个queue,然后关闭rabbit01的容器,紧接着向刚刚创建的queue中投递一条消息,依然可以使用

rabbitmq在docker中创建队列 rabbitmq docker集群_Docker_06


然后关闭rabbit01

docker stop rabbit01

查看控制台状态

rabbitmq在docker中创建队列 rabbitmq docker集群_docker_07


已经挂掉了,然后我们向rabbit01中的mynew队列中投递一条消息

rabbitmq在docker中创建队列 rabbitmq docker集群_Docker_08


rabbitmq在docker中创建队列 rabbitmq docker集群_Docker_09


然后去消费掉它

rabbitmq在docker中创建队列 rabbitmq docker集群_docker_10


rabbitmq在docker中创建队列 rabbitmq docker集群_docker_11


ok已经成功消费掉这条消息