RabbitMq集群通过Docker搭建
画外音:
不知道哪里来了一家人好像已经确诊了新型冠状病毒感染的肺炎,就在距离我家不远的地方,明天就要封小区了,大家还是尽量不要出门在家里还是比较安全的,希望武汉能尽早挺过这次难关
首先创建一个bridge网络,使三个Mq可以正常网络通信
docker network create --subnet 172.8.0.0/16 rabbitnetwork
然后pull一个官方的rabbitMq镜像,最新的版本就可以
然后分别启动三个容器即可,不需要挂载文件,保证三个容器中.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
最后我们去可视化页面上查看一下,默认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
开启之后,如果是云服务器看看安全组是否打开端口了
看起来ok了,这种情况下queue和exchange会随着绑定的mq挂掉而不可用,如果想要完全同步就需要开启镜像模式
首先来到控制台,打开admin
点击下方的添加或修改
添加好了之后,在rabbit01上新创建一个queue,然后关闭rabbit01的容器,紧接着向刚刚创建的queue中投递一条消息,依然可以使用
然后关闭rabbit01
docker stop rabbit01
查看控制台状态
已经挂掉了,然后我们向rabbit01中的mynew队列中投递一条消息
然后去消费掉它
ok已经成功消费掉这条消息