RabbitMQ
【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】
文章目录
- RabbitMQ
- 第二天 高级
- 9 RabbitMQ 集群搭建
- 9.1 集群方案的原理
- 9.2 单机多实例部署
- 9.4 RabbitMQ镜像集群配置
第二天 高级
9 RabbitMQ 集群搭建
实际生产应用中都会采用消息队列的集群方案,如果选择RabbitMQ那么有必要了解下它的集群方案原理
一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本身的可靠性、并发性、吞吐量和消息堆积能力等问题的考虑,在生产环境上一般都会考虑使用RabbitMQ的集群方案。
9.1 集群方案的原理
RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。
因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式,同时可以通过水平扩展以达到增加消息吞吐量能力的目的。
9.2 单机多实例部署
由于某些因素的限制,有时候你不得不在一台机器上去搭建一个rabbitmq集群,这个有点类似zookeeper的单机版。真实生成环境还是要配成多机集群的。有关怎么配置多机集群的可以参考其他的资料,这里主要论述如何在单机中配置多个rabbitmq实例。
主要参考官方文档:https://www.rabbitmq.com/clustering.html
首先确保RabbitMQ运行没有问题
服务器 运行 命令 rabbitmqctl status
没毛病
先把这个 给停掉
停止rabbitmq服务
[root@super sbin]# service rabbitmq-server stop
Stopping rabbitmq-server: rabbitmq-server.
OK
启动第一个节点
RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit1 rabbitmq-server start
OK
启动第二个节点:
web管理插件端口占用,所以还要指定其web插件占用的端口号。
RABBITMQ_NODE_PORT=5674 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15674}]" RABBITMQ_NODENAME=rabbit2 rabbitmq-server start
【新开一个 会话窗口】
分别访问两个 的管控台
OK,没问题 ,而且 一个叫 rabbit1 一个 叫rabbit2
结束命令:
rabbitmqctl -n rabbit1 stop
rabbitmqctl -n rabbit2 stop
rabbit1操作作为主节点:
[root@super ~]# rabbitmqctl -n rabbit1 stop_app
Stopping node rabbit1@super ...
[root@super ~]# rabbitmqctl -n rabbit1 reset
Resetting node rabbit1@super ...
[root@super ~]# rabbitmqctl -n rabbit1 start_app
Starting node rabbit1@super ...
[root@super ~]#
再开一个窗口
rabbit2操作为从节点:
[root@super ~]# rabbitmqctl -n rabbit2 stop_app
Stopping node rabbit2@super ...
[root@super ~]# rabbitmqctl -n rabbit2 reset
Resetting node rabbit2@super ...
[root@super ~]# rabbitmqctl -n rabbit2 join_cluster rabbit1@'super' ###''内是主机名换成自己的
Clustering node rabbit2@super with rabbit1@super ...
[root@super ~]# rabbitmqctl -n rabbit2 start_app
Starting node rabbit2@super ...
OK【忽略 那些未找到 命令
】
到这里直接查看 管控台
但是现在 这两个节点还存在一些问题,它俩 虽然已经构成了 集群,但是它俩 是不同步的
比如我现在 来一个队列【在节点1】
OK,队列创建成功
整一条消息进去
OK,没问题
看看2 那边
OK,2 这边也有队列 和消息,这是正常 启动的情况
如果现在 rabbit1 挂掉了
再次回到 管控台
1 已经 G了
看看2
这边也拿不到 数据了 【这就说明 数据只在 主节点上存在,从节点莫得】
现在把1 重新跑起来
【这种问题 如何解决?】【这下就要 用到镜像了 】
9.4 RabbitMQ镜像集群配置
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。
设置的镜像队列可以通过开启的网页的管理端Admin->Policies,也可以通过命令。
rabbitmqctl set_policy my_ha “^” ‘{“ha-mode”:“all”}’
- Name:策略名称
- Pattern:匹配的规则,如果是匹配所有的队列,是^.
- Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。
试试【在 1 上】
直接添加
OK,看看2
另一边也有 了这样一个策略【虽然不知道为啥,这边变成 1 了…】
现在查看一下队列的状态
这样就完成 了镜像的搭建【这里讲得没 微服务 整合那儿讲得好,有点乱】
现在来一个 bb 队列
OK没毛病【这就是 镜像队列 的创建】
这样重复 关闭rabbit1 的关闭操作时,其中的消息就不会丢了
查看集群状态:
rabbitmqctl cluster_status -n rabbit1
【现在的 问题,现在我们已经有了 两个节点,使用 的端口进行区分,一个 5673、一个 5674 】
我们写Java 代码的时候写哪个?
虽然写哪个 都一样,但是,将来 如果 5673 挂了,那它就连不上了,如果5674 挂了,它也连不上了,这个对代码 的耦合度太高了
【有没有统一的一个入口,可以 路由到各个 不同的集群节点上,这样很明显 就更好了】
【解决方案 就是 使用 负载均衡 HAProxy】