【1】架构介绍
- 普通集群:主备架构,只是实现主备方案,不至于主节点宕机导致整个服务无法使用
- 镜像集群:同步结构,基于普通集群实现的队列同步
(1.1)rabbitmq 主从集群
slave节点复制 master节点的所有数据和状态,除了队列数据;
队列数据只存在master节点,但是Rabbitmq slave节点可以实现队列的转发,也就是说消息消费者可以连接到slave节点,但是slave需要连接到master节点转发队列;
由此说明只能保证了服务可以用,无法达到高可用
slave节点队列可以查看到,但是不会同步数据
主从架构集群:
从节点可以和主节点的交换机、队列进行备份,但是不能对从节点中队列的消息进行备份,也就是说,一但主节点宕机,从节点中只有队列名,但是队列中的消息也就没有了,不能够做到高可用的一种状态
通过浏览器访问:如果页面起不来,运行命令rabbitmq-plugins enable rabbitmq_management即可,启动其页面管理插件
(1.2)rabbitmq 镜像高可用集群
今天又有人问起来rabbitmq的高可用方式,因为和常见的主从模式有点区别,所以就记录一下。
rabbitmq集群的镜像队列提供了更高级的主从备份,就是互为主备的主从队列:
rabbitmq-server为客户端提供了访问其中任何一个节点都能获取整个集群的元数据,所以生产者消费者是直观看到具体是连接到集群中的哪台机器,但可以肯定的是主队列接收exchange路由过来的消息,及推送消息给消费者,从队列是无法接收到exchange路由过来的消息的;但从队列可以接收主队列同步过来的消息,并提供给消费者。
总结来说就是rabbitmq的主从队列的角色:主队列提供读写消息的能力,从队列只提供读消息的能力。那如何理解互为主备的主从队列呢?
先看一张图:
这个是三台机器组成的集群,ha-mode是all(rabbitmq官网推荐的exactly,且ha-params=N/2 1,在这设置为all是为了方便后面的解释),rabbitmq提供完整的管理界面;
queue1队列在创建时,可以通过node选择放到集群中的哪个节点,默认是登录的当前机器上。为了分散机器压力,提高性能,创建队列时,主队列分散建到不同的机器上。
因为镜像队列参数设置的是all,所以queue1会自动把queue1的元数据同步到另外2台机器上,同理,在其他机器创建的queue2和queue3.这样就会形成上图中的部署结构。
对于queue1,机器1是主,机器2,3为从;对于queue2,机器2为主,机器1,3为从;对于queue3,机器3位主,机器1,2位从;这样整体看机器1,2,3互为主备,分散了集群的压力,提供了发送消息速率,同时还提高了集群的高可用性。
Rabbitmq_prometheus 监控插件
Rabbitmq的插件有一个是rabbitmq_prometheus,当开启这个插件后,rabbitmq-sever就会开启一个15692的端口提供prometheus获取监控信息;
通过访问链接:http://ip:15692/metrics 获取监控信息。prometheus官网也提供了rabbitmq_exporter插件,如果启动了rabbitmq_prometheus插件,就不需要rabbitmq_exporter插件了,并且rabbitmq_prometheus插件获取到的监控信息远大于exporter获取的信息。所以推荐使用rabbitmq_prometheus插件。
集群相关参数与策略:
# 0.策略说明 rabbitmqctl set_policy [-p ] [--priority ] [--apply-to ] -p Vhost: 可选参数,针对指定vhost下的queue进行设置 Name: policy的名称 Pattern: queue的匹配模式(正则表达式) Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes all:表示在集群中所有的节点上进行镜像 exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定 nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定 ha-params:ha-mode模式需要用到的参数 ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual priority:可选参数,policy的优先级 # 1.查看当前策略 rabbitmqctl list_policies # 2.添加策略 rabbitmqctl set_policy ha-all '^hello' '{"ha-mode":"all","ha-sync-mode":"automatic"}' 说明:策略正则表达式为 “^” 表示所有匹配所有队列名称 ^hello:匹配hello开头队列 # 3.删除策略 rabbitmqctl clear_policy ha-all # 4.测试集群
【参考文档】
搭建参考:
rabbitmq集群:https://blog.csdn.net/yangshihuz/article/details/114120589
主从复制,高可用集群部署:https://app.yinxiang.com/fx/b0b3020a-b90a-45c7-b4ae-3e70c0ab48fe
Rabbitmq主从集群和镜像集群搭建:https://blog.csdn.net/wang_hahah/article/details/119925086
纯概念参考:
集群模式:https://blog.csdn.net/wangdonghello/article/details/109624500