RabbitMQ学习笔记(五、RabbitMQ集群)

目录:

  • RabbitMQ集群
  • 镜像队列
  • RabbitMQ服务日志
  • RabbitMQ分布式部署
  • 高可用集群

RabbitMQ集群:

1、集群中组件的状态

首先MQ一定要是一个高可用的中间件所以集群肯定是必不可少的,它可以提高RabbitMQ的吞吐量。

那你可能会问RabbitMQ集群后消息就不会丢失了么?会丢失的,当一个节点崩溃后所有的消息都会丢失,因为RabbitMQ默认是不会将消息在集群中复制的。

队列在集群中如何存在:队列在集群中是不会复制的,其它节点只会保存队列所处的元数据。

交换器在集群中如何存在:交换器再集群中会复制,因为它本身也只是一个类似于Hashmap的映射关系。

建议:集群中至少要有一个磁盘节点(也就是持久化的RabbitMQ节点),虽然磁盘节点挂掉了依然可以发送和接受消息,但却不能执行创建队列、交换器、绑定关系等等操作。高可用的话建议至少两个磁盘节点,如果不确认如何选择磁盘节点与内存节点时建议全部选择磁盘节点,但这样的话会在一定程度上影响RabbitMQ的吞吐量。

2、单机多节点集群(自己玩玩时使用,不建议在生产环境中使用

3、多机多节点集群

4、集群管理

镜像队列:

如果RabbitMQ中只有一个broker节点的话,那么在节点宕机后会有短暂的时间无法提供服务,可能会导致消息的丢失。

所以RabbitMQ引入了镜像队列这一概念,它可以将队列镜像的复制到其它的broker上,当集群中一个节点失效后便会将队列切换到另一个节点上去,从而保障服务的可用性。

设置镜像队列:rabbitmqctl set_policy --priority 0 --apply-to queues mirror_queue "^demo." '{"ha-mode":" exactly","ha-params":3, "ha-sync-mode":"automatic"}'

ha-mode:

  1. all:及群众所有节点都进行镜像。
  2. exactly:指定个数节点上进行镜像,ha-params为指定个数。
  3. nodes:指定节点上进行镜像,ha-params为指定节点名称。

RabbitMQ服务日志:

日志存放路径:$RABBITMQ_HOME/var/log/rabbitmq/log-name

RabbitMQ分布式部署:

RabbitMQ实现高可用的方式一般是集群+镜像队列,但这种基于镜像队列来实现的方式在多机房夸区域的环境下,可能会因为网络原因导致无法成功镜像成功。

针对因这一情况,可以使用对网络要求不高的Federation/Shovel来实现高可用。

Federation:

1、将两个节点的federation插件开启
rabbitmq-plugins enable rabbitmq_federation_management

2、在broker2中定义一个upstream

rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://account:password@ip:port","ack-mode":"on-confirm"}'

3、在broker2中定义一一个Policy

rabbitmqctl set_ policy --apply-to exchanges p1 "demo.exchange" '{"federation-upstream":"f1"}'

Shovel:

1、开启每个节点的shovel插件
rabbitmq-plugins enable rabbitmq_ shovel_ management
2、部署Shovel
rabbitmqctl set_parameter shovel hidden_shovel \'{"src-uri":"amqp://account:password@ip:port","src-queue":"demo.queue","dest-uri":"amqp://account:password@ip:port","src-exchange-key":"rk2","prefetch-count":64,"reconnect-delay":5,"publish-properties":[],"add-forward-headers":true,"ack-mode":"on-confirm"}'

格式化后:

rabbitmqctl set_parameter shovel hidden_shovel \'{
    "src-uri": "amqp://account:password@ip:port",
    "src-queue": "demo.queue",
    "dest-uri": "amqp://account:password@ip:port",
    "src-exchange-key": "rk2",
    "prefetch-count": 64,
    "reconnect-delay": 5,
    "publish-properties": [],
    "add-forward-headers": true,
    "ack-mode": "on-confirm"
}'

高可用集群(负载均衡算法实现):

1、客户端本地实现:用代码实现本地轮询法、加权轮询法、随即法、哈希地址法、最小连接数法等等。

2、HAProxy负载均衡

3、Keepalived + HAProxy高可用负载均衡:光使用HAProxy时,当HAProxy挂掉了后整个RabbitMQ集群都无法正常提供服务,所以用Keepalived的主备机制进一步优化。

posted @ 2019-11-20 21:27  被猪附身的人  阅读(241)  评论(0编辑  收藏  举报