环境说明:
- 阿里云服务器
- Ubuntu 16.04
- docker
1、拉取镜像
docker pull rabbitmq:management
root@iZ282zj76jqZ:~# docker images|grep rabbitmq rabbitmq management 30e33de9be86 3 days ago 184MB
2、创建容器 ( 指定密码可添加参数 -e RABBITMQ_DEFAULT_USER=tom -e RABBITMQ_DEFAULT_PASS=tomkluas )
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
root@iZ282zj76jqZ:~# 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
root@iZ282zj76jqZ:~# docker exec -it mq0 bash root@host0:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@host0 ... root@host0:/# rabbitmqctl reset Resetting node rabbit@host0 ... root@host0:/# rabbitmqctl start_app Starting node rabbit@host0 ... completed with 3 plugins. root@host0:/# exit exit
配置mq1
root@iZ282zj76jqZ:~# docker exec -it mq1 bash root@host1:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@host1 ... root@host1:/# rabbitmqctl reset Resetting node rabbit@host1 ... root@host1:/# rabbitmqctl join_cluster --ram rabbit@host0 Clustering node rabbit@host1 with rabbit@host0 root@host1:/# rabbitmqctl start_app Starting node rabbit@host1 ... completed with 3 plugins. root@host1:/# exit exit
配置mq2
root@iZ282zj76jqZ:~# docker exec -it mq2 bash root@host2:/# rabbitmqctl stop_app Stopping rabbit application on node rabbit@host2 ... root@host2:/# rabbitmqctl reset Resetting node rabbit@host2 ... root@host2:/# rabbitmqctl join_cluster --ram rabbit@host0 Clustering node rabbit@host2 with rabbit@host0 root@host2:/# rabbitmqctl start_app Starting node rabbit@host2 ... completed with 3 plugins. root@host2:/# exit exit
效果图如下:
到此以上整个集群部署成功了,但是上述只是普通集群,在此之外,还有镜像集群
1)策略policy概念
使用RabbitMQ镜像功能,需要基于RabbitMQ策略来实现,策略policy是用来控制和修改群集范围的某个vhost队列行为和Exchange行为。策略policy就是要设置哪些Exchange或者queue的数据需要复制、同步,以及如何复制同步。
为了使队列成为镜像队列,需要创建一个策略来匹配队列,设置策略有两个键“ha-mode和 ha-params(可选)”。ha-params根据ha-mode设置不同的值,下表说明这些key的选项。
2) 添加策略
方法一:界面操作,登录rabbitmq管理页面 ——> Admin ——> Policies ——> Add / update a policy
方法二:进入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 的节点恢复后,才可以被消费。如果没有持久化的话,就会产生消息丢失的现象。