0


如何保证生产中RabbitMQ的高可用,看本文就够了【重点】

1.1 概述

本文来探究一下使用消息队列的热点问题,如何保证消息队列的高可用,本文使用的消息队列是

  1. RabbitMQ

,后续会出其他热门的

  1. MQ

教程,敬请期待。

1.2

  1. RabbitMQ

的高可用性

  1. RabbitMQ

基于主从模式实现高可用。

  1. RabbitMQ

有三种模式:单机模式、普通集群模式、镜像集群模式。

1.2.1 单机模式

单机模式,即单机情况不做集群,就单独运行一个

  1. rabbitmq

而已
就是

  1. Demo

级别的,一般就是你本地启动了玩的,没人生产用单机模式。

1.2.2 普通模式

普通集群模式,意思就是在多台机器上启动多个

  1. RabbitMQ

实例,每个机器启动一个。你创建的

  1. queue

,只会放在一个

  1. RabbitMQ

实例上,但是每个实例都同步

  1. queue

的元数据(元数据可以认为是

  1. queue

的一些配置信息,通过元数据,可以找到

  1. queue

所在实例)。你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从

  1. queue

所在实例上拉取数据过来。

在这里插入图片描述
下图对上图其进行了详细说明:

在这里插入图片描述
这种方式确实很麻烦,也不怎么好,没做到所谓的分布式,就是个普通集群。因为这导致你要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个

  1. queue

所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。

而且如果那个放

  1. queue

的实例宕机了,会导致接下来其他实例就无法从那个实例拉取,如果你开启了消息持久化,让

  1. RabbitMQ

落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个

  1. queue

拉取数据。

所以这个事儿就比较尴尬了,这就没有什么所谓的高可用性,这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个

  1. queue

的读写操作

1.2.3 镜像集群模式(高可用性)

这种模式,才是所谓的

  1. RabbitMQ

的高可用模式。跟普通集群模式不一样的是,在镜像集群模式下,你创建的

  1. queue

,无论元数据还是

  1. queue

里的消息都会存在于多个实例上,就是说,每个

  1. RabbitMQ

节点都有这个

  1. queue

的一个完整镜像,包含

  1. queue

的全部数据的意思。然后每次你写消息到

  1. queue

的时候,都会自动把消息同步到多个实例的

  1. queue

上。

在这里插入图片描述
下面对上图进行详细描述:
在这里插入图片描述
好处
任何一台机器宕机了,其他的机器还可以使用(包含了这个

  1. queue

的完整数据)。

坏处
1、性能消耗太大,所有机器都要进行消息的同步,导致网络压力和消耗很大。
2、没有扩展性可言,如果有一个queue负载很重,就算加了机器,新增的机器还是包含了这个queue的所有数据,并没有办法扩展queue。

如何开启镜像模式
如何开启镜像集群模式:其实很简单,

  1. RabbitMQ

有很好的管理控制台,就是在后台新增一个策略,这个策略是镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建

  1. queue

的时候,应用这个策略,就会自动将数据同步到其他的节点上去了。

1.3 详细部署

  1. mq01:192.168.100
  2. mq02:192.168.101

1.3.1 配置普通集群模式

  1. mq01cookie值复制到mq02服务器
  2. 配置cookie
  3. vi /var/lib/rabbitmq/.erlang.cookie
  4. 确保rabbitMQ服务处于停止状态:service rabbitmq-server stop
  5. 确保2个节点的coolie文件使用相同的值
  6. cookie文件默认路径为/var/lib/rabbitmq/.erlang.cookieRPM安装)
  7. 或者$home/.erlang.cookie(解压方式安装)
  8. .erlang.cookie设置可写
  9. chmod u+w /var/lib/rabbitmq/.erlang.cookie
  10. 加入集群(默认加入的为磁盘节点)
  11. rabbitmqctl join_cluster rabbit@mq02
  12. 如果要使用内存节点,则可以使用
  13. rabbitmqctl join_cluster --ram rabbit@mq02
  14. 查看集群状态
  15. rabbitmqctl cluster_status

1.3.2 配置镜像集群模式

1.3.2.1 通过命令行配置

  1. rabbitmqctl set_policy [ha-all]"^"'{"ha-mode":"all"}'//策略正则表达式为 “^” 表示所有匹配所有队列名称
  2. rabbitmqctl set_policy -p [虚拟主机名称][策略名称如ha-all ]"^"'{"ha-mode":"all" , "ha-sync-mode":"automatic"}'
  3. 在任意一个节点上执行:
  4. rabbitmqctl set_policy ha-all "^"'{"ha-mode":"all" , "ha-sync-mode":"automatic"}'
  5. 或者指定vhost:
  6. rabbitmqctl set_policy -p demo ha-all "^"'{"ha-mode":"all" , "ha-sync-mode":"automatic"}'
  7. 将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。
  8. 到这里,RabbitMQ 高可用集群就已经搭建好了,最后一个步骤就是搭建均衡器。
  9. 策略名称:自定义
  10. “^”:匹配所有队列
  11. ha-sync-mode: 默认为手动,可以配置为自动,区别在于,如果是自动做镜像回复,则该队列会处于不可用状态直到同步完成

1.3.2.2 通过管理界面配置

界面配置示例(http://ip:15672/):
在这里插入图片描述

1.3.3 配置高可用

可以采用

  1. HAProxy+Keepalived

  1. Nginx+Keepalived

方式来部署实现。

我这里根据实际使用场采用另一种简洁方案,如下图所示,仅使用

  1. Nginx

,配置

  1. backup

路由策略,减轻部署复杂性。

在这里插入图片描述

1.3.4 集群常用命令

  1. 1、加入集群[--ram添加内存模式 默认disk模式]
  2. rabbitmqctl join_cluster --ram rabbit@mq012、查看集群状态
  3. rabbitmqctl cluster_status
  4. 3、更改节点模式[顺序 关闭运用-〉更改类型->开启运用]
  5. rabbitmqctl stop_app –停止运用服务
  6. rabbitmqctl change_cluster_node_type disc/ram –更改节点为磁盘或内存节点
  7. rabbitmqctl start_app –开启运用服务
  8. 4、创建策略(集群同步策略……)
  9. set_policy [-p vhostpath]{name}{pattern}{definition}[priority]5、查看策略
  10. rabbitmqctl list_policies
  11. 6、移除远程offline的节点
  12. 1.节点2停掉应用
  13. rabbitmqctl stop_app
  14. 2.节点1执行删除
  15. rabbitmqctl forget_cluster_node rabbit@mq027、设置集群名称
  16. rabbitmqctl set_cluster_name cluster_name
  17. 8、设置镜像模式
  18. Rabbit提供镜像功能,需要基于rabbitmq策略来实现,政策是用来控制和修改群集范围的某个vhost队列行为和Exchange行为
  19. set_policy [-p vhostpath]{name}{pattern}{definition}[priority]
  20. rabbitmqctl set_policy ha-all "^ha.""{""ha-mode"":""all""}"
  21. rabbitmqctl set_policy ha-all "^""{""ha-mode"":""all"",""ha-sync-mode"":""automatic""}"
  22. rabbitmqctl set_policy -p demo ha-all "^""{""ha-mode"":""all"",""ha-sync-mode"":""automatic""}"9、手动同步queue
  23. rabbitmqctl sync_queue name
  24. 10、取消queue同步
  25. rabbitmqctl cancel_sync_queue name
  26. 11、查看所有队列信息
  27. rabbitmqctl list_queues
  28. 12、获取队列信息
  29. rabbitmqctl list_queues[-p vhostpath][queueinfoitem ...]
  30. Queueinfoitem可以为:namedurableauto_deleteargumentsmessages_readymessages_unacknowledgedmessagesconsumersmemory
  31. 13、获取Exchange信息
  32. rabbitmqctl list_exchanges[-p vhostpath][exchangeinfoitem ...]
  33. Exchangeinfoitem有:nametypedurableauto_deleteinternalarguments
  34. 14、获取Binding信息
  35. rabbitmqctl list_bindings[-p vhostpath][bindinginfoitem ...]
  36. Bindinginfoitem有:source_namesource_kinddestination_namedestination_kindrouting_keyarguments
  37. 15、获取Connection信息
  38. rabbitmqctl list_connections [connectioninfoitem ...]
  39. Connectioninfoitem有:recv_octrecv_cntsend_octsend_cntsend_pend等。
  40. 16、获取Channel信息
  41. rabbitmqctl list_channels[channelinfoitem ...]
  42. Channelinfoitemconsumer_countmessages_unacknowledgedmessages_uncommittedacks_uncommittedmessages_unconfirmedprefetch_countclient_flow_blocked
标签: rabbitmq 分布式 java

本文转载自: https://blog.csdn.net/weixin_42039228/article/details/123520355
版权归原作者 __奋斗的卡卡 所有, 如有侵权,请联系我们删除。

“如何保证生产中RabbitMQ的高可用,看本文就够了【重点】”的评论:

还没有评论