RabbitMQ集群由是三个单台的RabbitMQ构成
前言
RabbitMQ集群有那些模式?
- 普通模式:默认模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 rabbit01(或者 rabbit02),rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 rabbit01 或 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么得等 rabbit01 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
- 镜像模式:把需要的队列做成镜像队列,存在与多个节点属于 RabbitMQ 的 HA 方案。该模式解决了普通模式中的问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在客户端取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用。
一、准备工作
- 服务器一台,我的系统版本是:
CentOS Linux release 7.9.2009 (Core)
- 服务器安装docker,可自行查找安装资料。Docker官网安装教程:Docker官网安装教程
我的docker版本是:Docker version 1.13.1, build 7d71120/1.13.1
使用docker pull指令拉取镜像:docker pull rabbitmq:management
镜像中-management代表直接开启图形化界面,alpine表示最小安装,一般在正式环境中使用
若想指定版本可以在冒号后添加相应版本号。
例如:docker pull rabbitmq:3.7-management
二、创建镜像并启动
在服务器上面使用rabbitmq:3.7-management镜像安装rabbitmq,
创建三个rabbitmq容器并运行。
2.1执行容器rabbitmq01命令
docker run -d --hostname rabbitmq01 --name gd_mq_rabbitmq_1 -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
2.2执行容器rabbitmq02命令
docker run -d --hostname rabbitmq02 --name gd_mq_rabbitmq_2 -p 15674:15672 -p 5674:5672 --link gd_mq_rabbitmq_1:rabbitmq01 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
2.3执行容器rabbitmq03命令
docker run -d --hostname rabbitmq03 --name gd_mq_rabbitmq_3 -p 15675:15672 -p 5675:5672 --link gd_mq_rabbitmq_1:rabbitmq01 --link gd_mq_rabbitmq_2:rabbitmq02 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.7-management
三、查看容器启动状态
在Linux服务器上使用 docker ps 命令查看三个容器是否启动成功
启动容器后,访问
http://服务器ip:15673
http://服务器ip:15674
http://服务器ip:15675
查看单个容器是否启动成功。
账号/密码:guest / guest。
四、 配置RabbitMQ集群
4.1进入第一个rabbitmq节点容器
docker exec -it gd_mq_rabbitmq_1 bash
进入容器后,依次执行如下命令:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
4.2 进入第二个rabbitmq节点容器
docker exec -it gd_mq_rabbitmq_2 bash
进入容器后,依次执行如下命令:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
4.3进入第三个rabbitmq节点容器
docker exec -it gd_mq_rabbitmq_3 bash
进入容器后,依次执行如下命令:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
配置完成后的效果:
五、实现镜像模式集群
5.1设置镜像队列策略
进入任意容器执行如下
进入容器
docker exec -it gd_mq_rabbitmq_1 bash
执行如下命令(该命令可以在任意一个节点执行)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
说明:
在cluster中任意节点启用策略,策略会自动同步到集群节点
rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’
策略模式为 all 即复制到所有节点,包含新增节点,策略正则表达式为 “^” 表示匹配所有队列名称。
配置策略前:
配置策略后:
总结
本篇文章只是简单描述RabbitMQ的镜像集搭建流程,后期将实现Haproxy负载均衡。。。