docker搭建Rabbitmq集群

环境说明:

  • 阿里云服务器
  • Ubuntu 16.04
  • docker

1、拉取镜像

docker pull rabbitmq:management
:~# docker images|grep rabbitmq
rabbitmq            management          30e33de9be86        3 days ago          184MB

2、创建容器

docker run -d --hostname host0 --name mq0 -e RABBITMQ_ERLANG_COOKIE=‘tomkluas‘ -p 5672:5672 -p 80:15672 rabbitmq:management
docker run -d --hostname host1 --name mq1 -e RABBITMQ_ERLANG_COOKIE=‘tomkluas‘ -p 5673:5672 --link mq0:host0 rabbitmq:management
docker run -d --hostname host2 --name mq2 -e RABBITMQ_ERLANG_COOKIE=‘tomkluas‘ -p 5674:5672 --link mq0:host0 --link mq1:host1 rabbitmq:management
:~# docker ps 
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                                                                                     NAMES
ec64e363924b        rabbitmq:management   "docker-entrypoint.s…"   7 seconds ago        Up 5 seconds        4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp                    mq2
8ae49e19d609        rabbitmq:management   "docker-entrypoint.s…"   20 seconds ago       Up 18 seconds       4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp                    mq1
8c5f2220f14a        rabbitmq:management   "docker-entrypoint.s…"   About a minute ago   Up About a minute   4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5672->5672/tcp, 0.0.0.0:80->15672/tcp   mq0

3、配置容器

配置mq0

:~# docker exec -it mq0 bash
:/# rabbitmqctl stop_app
Stopping rabbit application on node  ...
:/# rabbitmqctl reset
Resetting node  ...
:/# rabbitmqctl start_app
Starting node  ...
 completed with 3 plugins.
:/# exit
exit

配置mq1

:~# docker exec -it mq1 bash
:/# rabbitmqctl stop_app
Stopping rabbit application on node  ...
:/# rabbitmqctl reset
Resetting node  ...
:/# rabbitmqctl join_cluster --ram 
Clustering node  with 
:/# rabbitmqctl start_app
Starting node  ...
 completed with 3 plugins.
:/# exit
exit

配置mq2

:~# docker exec -it mq2 bash
:/# rabbitmqctl stop_app
Stopping rabbit application on node  ...
:/# rabbitmqctl reset
Resetting node  ...
:/# rabbitmqctl join_cluster --ram 
Clustering node  with 
:/# rabbitmqctl start_app
Starting node  ...
 completed with 3 plugins.
:/# exit
exit

效果图如下:
docker搭建Rabbitmq集群

 到此以上整个集群部署成功了,但是上述只是普通集群,在此之外,还有镜像集群

1)策略policy概念

使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。

为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。

docker搭建Rabbitmq集群

2) 添加策略

方法一:界面操作,登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy

docker搭建Rabbitmq集群

方法二:进入mq0执行如下命令

rabbitmqctl set_policy-p/ha-all"^"‘{"ha-mode":"all"}‘

简单对比:

镜像集群模式

概念:
把队列做成镜像队列,让各队列存在于多个节点中,属于 RabbitMQ 的高可用性方案。镜像模式和普通模式的不同在于,queue和 message 会在集群各节点之间同步,而不是在 consumer 获取数据时临时拉取。

特点:
(1)实现了高可用性。部分节点挂掉后,不会影响 rabbitmq 的使用。
(2)降低了系统性能。镜像队列数量过多,大量的消息同步也会加大网络带宽开销。
(3)适合对可用性要求较高的业务场景。

普通集群模式

概念:
默认的集群模式。需要创建多个 RabbitMQ 节点。但对于 Queue 和消息来说,只存在于其中一个节点,其他节点仅同步元数据,即队列的结构信息。

(1)Exchange 的元数据信息在所有节点上是一致的,而 Queue(存放消息的队列)的完整数据则只会存在于创建它的那个节点上。其他节点只知道这个 queue 的 metadata 信息和一个指向 queue 的 owner node 的指针;

(2)RabbitMQ 集群会始终同步四种类型的内部元数据(类似索引):
  a.队列元数据:队列名称和它的属性;
  b.交换器元数据:交换器名称、类型和属性;
  c.绑定元数据:一张简单的表格展示了如何将消息路由到队列;
  d.vhost元数据:为 vhost 内的队列、交换器和绑定提供命名空间和安全属性;
  因此,当用户访问其中任何一个 RabbitMQ 节点时,通过 rabbitmqctl 查询到的元数据信息都是相同的。

(3)无法实现高可用性,当创建 queue 的节点故障后,其他节点是无法取到消息实体的。如果做了消息持久化,那么得等创建 queue 的节点恢复后,才可以被消费。如果没有持久化的话,就会产生消息丢失的现象。

相关推荐