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集群注意事项

  1. 容器中的数据是保存在​​/var/lib/rabbitmq​​​ 目录中,因此为了容器中的数据不丢失,需要自建创建数据挂在目录,或数据卷(​​volume​​)。
  2. ​--hostname​​ 指定docker容器的主机名
  3. ​RABBITMQ_DEFAULT_USER​​ 指定rabbitmq用户名
  4. ​RABBITMQ_DEFAULT_PASS​​ 指定rabbitmq密码
  5. ​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​

到此我们的集群搭建完毕。