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

(一) 功能和原理

设计集群的目的

允许消费者和生产者在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)
如果需要设定特定的节点(以rabbit@localhost为例),再添加一个参数

queue_args("x-ha-policy":"nodes",br/>"x-ha-policy-params":["rabbit@localhost"])
channel.queue_declare(queue="hello-queue",argument=queue_args)
可以通过命令行查看那个主节点进行了同步

rabbitmqctl list_queue name slave_pids synchronised_slave_pids
(二) 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 //后台启动节点
或者通过添加/etc/rabbitmq/rabbitmq-env.conf文件来进行设置:

NODE_PORT=5672
NODENAME=rabbit
NODE_PORT=5673
NODENAME=rabbit_01
将rabbit_01节点添加到第一个集群节点rabbit中
rabbitmqctl -n rabbit_01@localhost stop_app //停止rabbit_01节点的应用
rabbitmqctl -n rabbit_01@localhost join_cluster rabbit@localhost //将rabbit_01添加到集群节点rabbit中去
rabbitmqctl cluster_status //查看集群节点的状态
rabbitmqctl -n rabbit_01@localhost start_app //启动rabbit_01节点的应用
//可以看到如下信息,说明节点添加成功,表明都是磁盘类型的节点
Cluster status of node rabbit@localhost ...br/>[{nodes,[{disc,[rabbit@localhost,rabbit_01@localhost]}]},
{running_nodes,[rabbit@localhost]},br/>{cluster_name,<<"rabbit@localhost">>},
{partitions,[]},br/>{alarms,[{rabbit@localhost,[]}]}]
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 rabbitmqCluster02
设置不同节点间同一认证的Erlang Cookie
采用从主节点copy的方式保持Cookie的一致性
[root@rabbitmqCluster01]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.25:/var/lib/rabbitmq
[root@rabbitmqCluster02]# scp /var/lib/rabbitmq/.erlang.cookie 186.16.195.26:/var/lib/rabbitmq
使用 -detached运行各节点
rabbitmqctl stop
rabbitmq-server -detached
查看各节点的状态
[root@rabbitmqCluster]#rabbitmqctl cluster_status
[root@rabbitmqCluster01]#rabbitmqctl cluster_status
[root@rabbitmqCluster02]#rabbitmqctl cluster_status

创建并部署集群,以rabbitmqCluster01节点为例:
[root@rabbitmqCluster01]#rabbitmqctl stop_app
[root@rabbitmqCluster01]#rabbitmqctl join_cluster rabbit@rabbitmqCluster
[root@rabbitmqCluster01]#rabbitmqctl start_app

查看集群状态
[root@rabbitmqCluster]#rabbitmqctl cluster_status
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//
安装HAProxy
yum -y install haproxy
配置HAProxy
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
vim /etc/haproxy/haproxy.cfg
添加配置信息
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 60s

转载于:https://blog.51cto.com/14257001/2372418

RabbitMQ分布式集群架构相关推荐

  1. 消息队列专题(架构篇):RabbitMQ 的集群架构模式

    RabbitMQ 的集群架构模式主要有四种,分别是主备模式.远程模式.多活模式和镜像模式,本篇博客将依次介绍这四种架构模式,其中的镜像模式使用范围最广,我们将对其进行重点介绍. 主备模式 主备模式是指 ...

  2. NOSQL,MongoDB分布式集群架构

    MongoDB分布式集群架构 看到这里相信你已经掌握了 MongoDB 的大部分基本知识,现在在单机环境下操作 MongoDB 已经不存在问题,但是单机环境只适合学习和开发测试,在实际的生产环境中,M ...

  3. ClickHouse数据库培训实战 (PB级大数据分析平台、大规模分布式集群架构)

    一.ClickHouse数据库培训实战课程 (PB级大数据分析平台.大规模分布式集群架构)视频教程 为满足想学习和掌握ClickHouse大数据分析专用的数据库,风哥特别设计的一套比较系统的Click ...

  4. 分布式集群架构解决方案

    分布式集群架构与解决方案 一致性Hash算法 基本算法回顾 顺序查找法 需求:给定一个无序的数组A,然后随便给出一个数值N,判断N是否存在所给定的数组A中. 解决思路:从索引0开始遍历数组A,依次和判 ...

  5. 分布式集群架构场景化解决方案相关

    文章目录 前言 一.一致性Hash算法 1.1 Hash算法应用场景 1.2 普通Hash算法存在的问题 1.3 一致性Hash算法 二.集群时钟同步问题 2.1 时钟不同步导致的问题 2.2 集群时 ...

  6. 分布式集群架构场景化解决⽅案(⼀致性Hash算法)

    什么是分布式和集群以及实现 主要内容 ⼀致性Hash算法 集群时钟同步配置 分布式ID解决⽅案 分布式调度问题 Session共享问题 分布式和集群是不⼀样的,分布式⼀定是集群,但是集群不⼀定是分布式 ...

  7. 分布式集群架构场景解决方案学习笔记

    课程学习 一致性哈希算法 集群时钟同步问题 分布式ID解决方案 分布式任务调度问题 session共享(一致性)问题 一致性哈希算法 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分 ...

  8. MongoDB分布式集群架构(3种模式)

    MongoDB 有三种集群部署模式,分别为主从复制(Master-Slaver).副本集(Replica Set)和分片(Sharding)模式. Master-Slaver 是一种主从副本的模式,目 ...

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

    本文收录在Linux运维企业架构实战系列 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建,操作完成后整理的个人心得,分享给大家~~~ 1.认识Hadoop和Hbase 1.1 hadoop简 ...

最新文章

  1. python数据类型变量_python的数据类型与变量
  2. 8800个机器学习开源项目为你精选TOP30!
  3. 开发者推出可重用地址提案提升BCH性能
  4. MySQL复制中slave延迟监控
  5. 李飞飞离职Google重返斯坦福,CMU计算机学院院长Andrew Moore接任
  6. 新浪Linux运维工程师面试真题曝光
  7. c语言读取tdx日线文件,***EXCEL读取通达信股票日线数据***改为读取通达信股票5分钟数据...
  8. 给你一份完整的自动阅读所需介绍
  9. 蓝屏代码——STOP:c000021a Unknown Hard Error
  10. 基于pytorch训练的VGG16神经网络模型完成手写数字的分割与识别
  11. 二维泊松方程求解--点迭代法
  12. 解析java源文件_使用JDT.AST解析java源码
  13. 计算机专业会涉及数学吗,数学不好的人还适合学计算机吗?
  14. 制造业干货,只需3步,快速提高产品良率!
  15. Vue实现图片预览(放大缩小拖拽)纯手写
  16. 近期业务大量突增微服务性能优化总结-2.开发日志输出异常堆栈的过滤插件
  17. (算法篇)Java实现删除链表倒数第n个节点
  18. 抖音上超火的3D立体动态相册表白特效(29)
  19. 在线编辑Word,Excel (WebOffice)
  20. orchestrator_配置IBM Cloud Orchestrator以配置到SoftLayer

热门文章

  1. Android杂谈--layout的横竖屏处理
  2. Windows Server 2008R2使用web方式修改域账户密码
  3. Adapterview和adapter的联系
  4. 8.10 exec函数
  5. C# .net 命名规范
  6. swift 字符串中查找字符位置
  7. led灯光衰怎么解决_什么是LED光衰,光衰怎么解决?
  8. 批量探测工具fpingping常用命令集合大学霸IT达人
  9. 反汇编引擎diStorm3
  10. Highmaps网页图表教程之图表配置项结构与商业授权