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:
- all:及群众所有节点都进行镜像。
- exactly:指定个数节点上进行镜像,ha-params为指定个数。
- 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的主备机制进一步优化。
RabbitMQ学习笔记(五、RabbitMQ集群)的更多相关文章
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- ZooKeeper学习笔记一:集群搭建
作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...
- RabbitMQ学习笔记五:RabbitMQ之优先级消息队列
RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- 吴裕雄--天生自然HADOOP学习笔记:hadoop集群实现PageRank算法实验报告
实验课程名称:大数据处理技术 实验项目名称:hadoop集群实现PageRank算法 实验类型:综合性 实验日期:2018年 6 月4日-6月14日 学生姓名 吴裕雄 学号 15210120331 班 ...
- Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...
- Redis学习笔记~conf自主集群模式
回到目录 Redis自主提供了集群模式,当然也只是比较简单的读写分离模式,或者叫主从模式,它在各个redis服务端自己做数据同步机制,当然就是将主服务端的信息同步到各个slave服务器上,在客户端集成 ...
- 开源流媒体服务器SRS学习笔记(4) - Cluster集群方案
单台服务器做直播,总归有单点风险,利用SRS的Forward机制 + Edge Server设计,可以很容易搭建一个大规模的高可用集群,示意图如下 源站服务器集群:origin server clus ...
- K8S学习笔记之CentOS7集群使用Chrony实现时间同步
0x00 概述 容器集群对时间同步要求高,实际使用环境中必须确保集群中所有系统时间保持一致,openstack官方也推荐使用chrony代替ntp做时间同步. Chrony是一个开源的自由软件,像Ce ...
- Nginx学习笔记---服务与集群
一.集群 什么是集群 服务器架构集群:多台服务器组成的响应式大并发,高数据量访问的架构体系. 特点: (1)成本高 (2)能够降低单台服务器的压力,使用流量平均分配到多台服务器 (3)使网站服务架构更 ...
随机推荐
- Redis 数据淘汰机制
为了更好的利用内存,使Redis存储的都是缓存的热点数据,Redis设计了相应的内存淘汰机制(也叫做缓存淘汰机制) 通过maxmemory 配置项来设置允许用户使用的最大内存大小,当内存数据集大小达到 ...
- WPF 3D Cube及点击交互
在WPF中构建一个简单的立方体比较容易实现,可参考资料也比较众多.比较麻烦的是处理点击交互. 我在WPF中用两种方式实现了3DCube,效果图如下: 方式一: 最常见的3D内容构建模式,结构如下图. ...
- C# 委托汇总
委托汇总以及遗留问题: using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...
- ABAP分享五 ALV修改单元格并将修改数据更新到数据表中示例1
*下面的代码是在alv字段中修改字段的内容,点击保存后就可以保存数据至数据表. TABLES: spfli. DATA: wa_fieldcat TYPE lvc_s_fcat , " 相 ...
- JDK 安装与环境配置配置——Android开发第一步
什么是JDK? JDK 即 Java Development Kit,Java开发工具包,用来编译 Java 程序.JRE 在接触JDK的过程中,同时了解到 JRE,JRE 即 Java Runtim ...
- Android 非法字符:'/ufeff'
[问题来源] 不知道大家有没有做过这样的事,在Android开发的过程中,通过文本直接修改代码,不打开编译器,然后提交让同时编译运行.这时Android编译就会报错,指定修改的文件开始位置,显示非法字 ...
- 配置 yum 源的两种方法
配置 yum 源的两种方法 由于 redhat的yum在线更新是收费的,如果没有注册的话不能使用,如果要使用,需将redhat的yum卸载后,重启安装,再配置其他源,以下为详细过程: 1.删除red ...
- 基于Redis扩展模块的布隆过滤器使用
什么是布隆过滤器?它实际上是一个很长的二进制向量和一系列随机映射函数.把一个目标元素通过多个hash函数的计算,将多个随机计算出的结果映射到不同的二进制向量的位中,以此来间接标记一个元素是否存在于一个 ...
- SecureCRT 破解安装详细教程
SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序 跟xshell类似. 一.下载文件软件包和破解文件(64版本),我已经放在百度云,链接:https://pan.baidu.c ...
- post请求四种传送正文的方式
一.简介 HTTP协议规定post提交的数据必须放在消息主体(entity-body)中,但协议没有规定数据必须使用什么编码方式.HTTP协议是以ASCII码传输,建立再TCP/IP协议之上的应用层规 ...