RabbitMQ分布式集群架构

RabbitMQ分布式集群架构和高可用性(HA)

https://blog.csdn.net/woogeyu/article/details/51119101

(一) 功能和原理

设计集群的目的

  • 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行
  • 通过增加更多的节点来扩展消息通信的吞吐量

1 集群配置方式

RabbitMQ可以通过三种方法来部署分布式集群系统,分别是:cluster,federation,shovel

  • cluster:
    • 不支持跨网段,用于同一个网段内的局域网
    • 可以随意的动态增加或者减少
    • 节点之间需要运行相同版本的RabbitMQ和Erlang
  • federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用federation来连接internet上的中间服务器,用作订阅分发消息或工作队列。
  • shovel:连接方式与federation的连接方式类似,但它工作在更低层次。可以应用于广域网。

2 节点类型

  • RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和vhost的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
  • Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启RabbitMQ的时候,丢失系统的配置信息。

问题说明: RabbitMQ要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。 
解决方案:设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。

3 Erlang Cookie

Erlang Cookie是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie。

说明: 这就要从rabbitmqctl命令的工作原理说起,RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证。

4 镜像队列

功能和原理 
RabbitMQ的Cluster集群模式一般分为两种,普通模式和镜像模式。

  • 普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于Queue来说,消息实体只存在于其中一个节点rabbit01(或者rabbit02),rabbit01和rabbit02两个节点仅有相同的元数据,即队列的结构。当消息进入rabbit01节点的Queue后,consumer从rabbit02节点消费时,RabbitMQ会临时在rabbit01、rabbit02间进行消息传输,把A中的消息实体取出并经过B发送给consumer。所以consumer应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理Queue。否则无论consumer连rabbit01或rabbit02,出口总在rabbit01,会产生瓶颈。当rabbit01节点故障后,rabbit02节点无法取到rabbit01节点中还未消费的消息实体。如果做了消息持久化,那么得等rabbit01节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
  • 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现RabbitMQ的HA高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在consumer消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。

实现机制 
镜像队列实现了RabbitMQ的高可用性(HA),具体的实现策略如下所示:

ha-mode ha-params 功能
all 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。
exactly count 镜像队列将会在集群上复制count份。如果集群数量少于count时候,队列会复制到所有节点上。如果大于Count集群,有一个节点crash后,新进入节点也不会做新的镜像。
nodes node name 镜像队列会在node name中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个node list中没有一个节点在线,那么这个queue会被声明在client连接的节点。

实例列举:

queue_args("x-ha-policy":"all") //定义字典来设置额外的队列声明参数channel.queue_declare(queue="hello-queue",argument=queue_args)12

如果需要设定特定的节点(以[email protected]为例),再添加一个参数

queue_args("x-ha-policy":"nodes",           "x-ha-policy-params":["[email protected]"])channel.queue_declare(queue="hello-queue",argument=queue_args)123

可以通过命令行查看那个主节点进行了同步

rabbitmqctl list_queue name slave_pids synchronised_slave_pids1

(二) RabbitMQ Cluster 配置

1 单机多节点部署

在启动RabbitMQ节点之后,服务器默认的节点名称是Rabbit和监听端口5672,如果想在同一台机器上启动多个节点,那么其他的节点就会因为节点名称和端口与默认的冲突而导致启动失败,可以通过设置环境变量来实现,具体方法如下:

  • 首先在机器上设置两个节点rabbit和rabbit_01
rabbitmqctl stop //先停止运行节点,再进行集群部署RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit //设置环境变量指定端口和节点名称rabbitmq-server -detached //后台启动节点RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_01 //设置环境变量指定端口和节点名称rabbitmq-server -detached //后台启动节点12345

或者通过添加/etc/rabbitmq/rabbitmq-env.conf文件来进行设置:

NODE_PORT=5672NODENAME=rabbitNODE_PORT=5673NODENAME=rabbit_011234
  • 将rabbit_01节点添加到第一个集群节点rabbit中
rabbitmqctl -n [email protected] stop_app //停止rabbit_01节点的应用rabbitmqctl -n [email protected] join_cluster [email protected] //将rabbit_01添加到集群节点rabbit中去rabbitmqctl cluster_status //查看集群节点的状态rabbitmqctl -n [email protected] start_app //启动rabbit_01节点的应用1234
//可以看到如下信息,说明节点添加成功,表明都是磁盘类型的节点Cluster status of node [email protected] ...[{nodes,[{disc,[[email protected],[email protected]]}]}, {running_nodes,[[email protected]]}, {cluster_name,<<"[email protected]">>}, {partitions,[]}, {alarms,[{[email protected],[]}]}]1234567

2 多机多节点部署

不同于单机多节点的情况,在多机环境,如果要在cluster集群内部署多个节点,需要注意两个方面:

  • 保证需要部署的这几个节点在同一个局域网内
  • 需要有相同的Erlang Cookie,否则不能进行通信,为保证cookie的完全一致,采用从一个节点copy的方式

环境介绍

RabbitMQ节点 IP地址 工作模式 操作系统
rabbitmqCluster 186.16.195.24 DISK CentOS 7.0 - 64位
rabbitmqCluster01 186.16.195.25 DISK CentOS 7.0 - 64位
rabbitmqCluster02 186.16.195.26 DISK CentOS 7.0 - 64位

cluster部署过程

  • 局域网配置 
    分别在三个节点的/etc/hosts下设置相同的配置信息
  186.16.195.24 rabbitmqCluster  186.16.195.25 rabbitmqCluster01  186.16.195.26 rabbitmqCluster02123
  • 设置不同节点间同一认证的Erlang Cookie 
    采用从主节点copy的方式保持Cookie的一致性
[[email protected]]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.25:/var/lib/rabbitmq[[email protected]]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.26:/var/lib/rabbitmq12
  • 使用 -detached运行各节点
rabbitmqctl stoprabbitmq-server -detached 12
  • 查看各节点的状态
[[email protected]]#rabbitmqctl cluster_status[[email protected]]#rabbitmqctl cluster_status[[email protected]]#rabbitmqctl cluster_status123
  • 创建并部署集群,以rabbitmqCluster01节点为例:
[[email protected]]#rabbitmqctl stop_app[[email protected]]#rabbitmqctl join_cluster [email protected][[email protected]]#rabbitmqctl start_app123
  • 查看集群状态
[[email protected]]#rabbitmqctl cluster_status1

RabbitMQ负载均衡配置

前言:从目前来看,基于RabbitMQ的分布式通信框架主要包括两部分内容,一是要确保可用性和性能,另一个就是编写当节点发生故障时知道如何重连到集群的应用程序。负载均衡就是解决处理节点的选择问题。

安装HAProxy

选择开源的HAProxy为RabbitMQ集群做负载均衡器,在CentOS 7.0中安装HAProxy。

  • 安装epel
rpm -ivh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm//1
  • 安装HAProxy
yum -y install haproxy1
  • 配置HAProxy
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bakvim /etc/haproxy/haproxy.cfg12
  • 添加配置信息
listen rabbitmq_local_cluster 127.0.0.1:5670 //前段IP,供product和consumer来进行选择,由于5672端口已经默认使用,这里选择5670端口     mode tcp   //负载均衡选项     balance roundrobin //轮询算法将负载发给后台服务器     server rabbit 127.0.0.1:5672 check inter 5000 rise 2 fall 3//负载均衡中的集群节点配置,这里选择的rabbit节点

 listen private_monitoring :8100     mode http     option httplog     stats enable     stats uri       /stats     stats refresh 60s1234567891011

参考文献:

原文地址:https://www.cnblogs.com/afterdawn/p/9057448.html

时间: 2024-10-01 04:28:21

RabbitMQ分布式集群架构的相关文章

Hadoop+Hbase分布式集群架构“完全篇

1.认识Hadoop和Hbase 1.1 hadoop简单介绍 Hadoop是一个使用java编写的Apache开放源代码框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理.Hadoop框架工作的应用程序可以在跨计算机群集提供分布式存储和计算的环境中工作.Hadoop旨在从单一服务器扩展到数千台机器,每台机器都提供本地计算和存储. 1.2 Hadoop架构 Hadoop框架包括以下四个模块: Hadoop Common:这些是其他Hadoop模块所需的Java库和实用程序.这些

互联网公司分布式集群架构图入门解析(简单通俗易懂,超详细)

一.小型公司网络架构 狗子是某大学计算机专业本科应届毕业生,由于自己的技术不错,再加上互联网产业的巨大利润的驱使,狗子决定走上创业这条路,于是,狗子联合了同学二黑,鸡子,狗蛋等人花费了几个月的时间写出了一套网站,是关于足球资讯的pc端网站加上手机APP客户端.现在产品测试成功了,准备发布了,狗子想到了两个问题: 1.网站需要服务器 狗子之前所有的代码测试都是在本地服务器或者局域网上进行的,现在需要把产品发布到外网上,让所有的人都能访问,因此再用自己的电脑当服务器显然很不现实,于是,狗子去买了一台

你不知道的RabbitMQ集群架构全解

RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍与实践 RabbitMQ事务和Confirm发送方消息确认--深入解读 使用Docker部署RabbitMQ集群 你不知道的RabbitMQ集群架构全解 前言 本文将系统的介绍一下RabbitMQ集群架构的特点.异常处理.搭建和使用中要注意的一些细节. 知识点 一.为什么使用集群? 二.集群的特点 三.集群异常处理 四.集群节点类型 五.集群

rabbitmq系统学习(三)集群架构

RabbitMQ集群架构模式 主备模式 实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单.主备模式也称为Warren模式 HaProxy配置 listen rabbitmq_cluster bind 0.0.0.0:5672 # 配置TCP模式 mode tcp #简单的轮询 balance roundrobin #主节点 server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 3 ser

一个分布式服务器集群架构方案

http://homeway.me/ 0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Cluster),负载均衡集群(Load Balance Cluster,nginx即可实现),科学计算集群(High Performance Computing Cluster). 分布式是指将不同的业务分布在不同的地方:而集群指的是将几台服务器集中在一起,实现同一

分布式服务器集群架构方案思考

nginx-reverse-proxy-conf 研究了一套完整的分布式服务器集群架构方案. 0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Cluster),负载均衡集群(Load Balance Cluster,nginx即可实现),科学计算集群(High Performance Computing Cluster). 分布式是指将不同的业务分布在

java精品高级架构课,RocketMQ中间件,Mysql分布式集群,服务架构,运维架构视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful 服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运 维架构视频教程 14套精品课程介绍: 1.14套精 品是最新整理的课程,都是当下最火的技术,最火的课程,也是全网课程的精品: 2.14套资 源包含:全套完整高清视频.完整源码.配套文档: 3.知识也 是需要投资的,有投入才会有产出(保证投入产出比是

39套精品Java从入门到架构师|高并发|高性能|高可用|分布式|集群|电商缓存|性能调优|设计项目实战|视频教程

精品Java高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,大型分布式电商项目实战视频教程   视频课程包含: 39套Java精品高级课架构课包含:java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,工作流,程序调优,负载均衡,Solr

RabbitMQ集群架构(HA)并结合.NET Core实操

原文:RabbitMQ集群架构(HA)并结合.NET Core实操 一.前言 已经一年没有更新博客了,由于公司事务比较多,并且楼主我也积极在公司项目中不断实践.net core.DDD以及Abp vnext,也积累了一些吐血经验,目前我在做一家在线教育公司负责智慧校园业务,所涉及到的数据一天达上百万,并且还需要对这些并发数据进行解析转化,在此次的过程中也涉及到了使用RabbitMQ进行业务的解耦和流量削峰来应对如此大量的请求:过程是痛苦的,但结果是美好的. 说到MQ,大家应该都听过,像Rabbi