rabbitmq
1. 集群模式
RabbitMQ 有三种模式:单机模式,普通集群模式,镜像集群模式。单机模式即单独运行一个 rabbitmq 实例,而集群模式需要创建多个 rabbitmq实例。
1.1 普通集群模式
默认的集群模式。需要创建多个 RabbitMQ 节点。但对于 Queue 和消息来说,只存在于其中一个节点,其他节点仅同步元数据,即队列的结构信息。
1.2 镜像集群模式
把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。
2. 集群安装
2.1 环境准备
-
172.16.25.69
-
172.16.25.70
-
172.16.25.71
创建mq的hosts文件
vim /mydata/rabbitmq/hosts # 文件中写入以下内容
172.16.25.69 rabbit1 rabbit1
172.16.25.70 rabbit2 rabbit2
172.16.25.71 rabbit3 rabbit3
2.2 拉取镜像
docker pull rabbitmq:3.8.3-management
2.3 创建容器
- 在172.16.25.69节点上创建容器rabbit1
docker run --restart=always \
-h rabbit1 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name rabbitmq1 \
-v /mydata/rabbitmq:/var/lib/rabbitmq:z \
-v /mydata/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
-e RABBITMQ_ERLANG_COOKIE='rabbitmq_2021' \
rabbitmq:3.8.3-management
- 在172.16.25.70节点上创建容器rabbit2
docker run --restart=always \
-h rabbit2 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name rabbitmq2 \
-v /mydata/rabbitmq:/var/lib/rabbitmq:z \
-v /mydata/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='rabbitmq_2021' \
rabbitmq:3.8.3-management
- 在172.16.25.71节点上创建容器rabbit3
docker run --restart=always \
-h rabbit3 -d -p 5672:5672 -p 15672:15672 -p 25672:25672 -p 4369:4369 \
--name rabbitmq3 \
-v /mydata/rabbitmq:/var/lib/rabbitmq:z \
-v /mydata/rabbitmq/hosts:/etc/hosts \
-e RABBITMQ_ERLANG_COOKIE='rabbitmq_2021' \
rabbitmq:3.8.3-management
参数说明:
- -d 表示容器后台运行
- -h rabbit1 容器的主机名是rabbit1,容器内部的hostname
- -v /mydata/rabbitmq:/var/lib/rabbitmq:z 将宿主机目录/home/rabbitmq挂载到容器的/var/lib/rabbitmq目录。z是一个标记,在selinux环境下使用
- -e RABBITMQERLANGCOOKIE=‘rabbit_cluster’ 设置rabbitmq的cookie,该值可以任意设置,只需要三个容器保持一致即可
2.4绑定集群
- 重置myrabbit1节点
$ docker exec -it rabbitmq1 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app
- 加入myrabbit2节点到集群中
$ docker exec -it rabbitmq2 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit1 && rabbitmqctl start_app
- 加入myrabbit3节点到集群中
$ docker exec -it rabbitmq3 /bin/bash
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit1 && rabbitmqctl start_app