为什么80%的码农都做不了架构师?>>>   

rabbitmq每个节点记录四类信息:交换机、队列、绑定、vhost元数据。

集群中的信息存储

在rabbitmq2.6.0之前没有镜像队列,数据存储情况为:

队列所属节点保存队列全部信息(元数据、状态、内容),其他节点拥有队列元数据;所有节点保存exchange、bundling信息。好处有两点:

1.节约存储空间,每个节点都有相同信息的拷贝,意味着磁盘空间成倍占用;

2.提升性能,数据在节点间同步占用网络资源,如果是持久化状态,又会有大量I/O;

正常情况的工作原理:

集群中有三个节点:rabbit、hare、hare1,队列声明在hare节点,向rabbit节点发消息,消息会转发到hare节点,消费者连接hare1节点,则从hare节点读取数据。

异常情况1(发送过程中故障):

向rabbit节点发送5条消息,第一条发送成功后,关掉hare节点

2017-11-16 12:05:07,015 [http-bio-8080-exec-1]
[org.springframework.amqp.rabbit.core.RabbitTemplate]-[DEBUG] Publishing message (Body:'< publishmessage 内容为:[ Thu Nov 16 12:05:07 CST 2017 ]>' MessageProperties [headers={},
contentType=text/plain, contentEncoding=UTF-8, contentLength=62, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])on exchange [AMC_TMP_EXCHANGE], routingKey = [cluster.send]

控制台显示正常发送,实际上后面4条消息已经丢失

localhost:sbin zcjlq$ ./rabbitmqctl -n hare stop_app
Stopping rabbit application on node hare@localhost
localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE

hare节点重启,只有第一条消息

localhost:sbin zcjlq$ ./rabbitmqctl -n hare start_app
Starting node hare@localhost
localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE   1

拓展:

如果使用publisher confirm机制,在回调函数RabbitTemplate.ConfirmCallback,你将拿到5个ack,RabbitTemplate.ReturnCallback不会被回调。

异常情况2(发送完毕故障):

假如我们连上任意节点,发送4条消息,先不消费,各个节点都能查到消息。

下面停掉队列所属节点hare

localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE   4
localhost:sbin zcjlq$ ./rabbitmqctl -n hare1 -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE   4
localhost:sbin zcjlq$ ./rabbitmqctl -n hare stop_app
Stopping rabbit application on node hare@localhost
localhost:sbin zcjlq$ ./rabbitmqctl -n hare1 -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE
localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE
localhost:sbin zcjlq$ ./rabbitmqctl -n hare start_app
Starting node hare@localhost
localhost:sbin zcjlq$ ./rabbitmqctl -n rabbit -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE   4
localhost:sbin zcjlq$ ./rabbitmqctl -n hare1 -p zcjlq list_queues
Listing queues
AMC_TMP_QUEUE   4

我们发现:停用hare节点后,在另外两个节点查不到消息,hare节点重启后,三个节点都能查到消息。

说明:本测试在单机上启动三个节点(单机集群搭建见后续文章)

rabbitmqctl -n参数指定节点名称,-p指定vhost名称,start_app启动节点,stop_app关闭节点,

list_queues查看队列列表和待消费消息。

异常情况3(故障期间重新声明队列):

在恢复hare节点前,我们尝试通过其他节点重新创建队列。出现以下错误

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method:
#method<channel.close>(reply-code=404, reply-text=NOT_FOUND - home node 'hare@localhost'
of durable queue 'AMC_TMP_QUEUE' in vhost 'zcjlq' is down or inaccessible, class-id=50, method-id=10)

节点类型

集群中的节点有两个类型:磁盘节点、内存节点。内存节点(ram)将所有的队列、交换器、绑定、用户、权限、vhost的元数据定义都仅存储于内存中。磁盘节点(disc)将元数据存储在磁盘中。

是磁盘节点还是内存节点?

在集群中声明队列、交换器、绑定的时候,其他节点会得到元数据的同步,如果集群中全都是磁盘节点,那么你需要等到所有的节点都磁盘I/O后才完成工作,内存节点将会更快。

rabbitmq要求集群中至少有一个磁盘节点。磁盘节点离开集群时,集群还可以进行部分工作,创建队列、创建交换机、创建绑定、添加用户、更改权限、添加或删除集群节点将不能使用。原理的磁盘节点重启后,集群可以正常工作。我们想要更安全一点:原磁盘节点重启前,为让集群正常工作,这时候可以考虑设置两个集群节点,当其中一个磁盘节点离开时,它会将该变更通知到至少一个磁盘节点。

转载于:https://my.oschina.net/zcjlq/blog/1574455

rabbitmq 集群数据存储与单点故障相关推荐

  1. k8s部署rabbitmq集群(使用statefulset部署)

    本例使用Storage Class(存储类)来作为集群数据的持久化后端,使用nfs作为后端存储. 1.创建namespace: # ns.yaml --- apiVersion: v1 kind: N ...

  2. RabbitMQ镜像集群与ShovelFederation跨集群数据同步

    部署环境与版本 安装包下载地址: Erlang语言依赖下载链接:http://erlang.org/download/otp_src_21.1.tar.gz RabbitMQ 3.7.8版本下载链接: ...

  3. Rabbitmq集群,镜像队列和分布式原理

    前言 基于前两次的分享会,结合rabbitmq相关知识,做一个小结.说明一致性的设计思想,在此说明相关的基础理论. CAP定理: 在计算机科学里,CAP定理又被称作布鲁尔定理(Brewer theor ...

  4. RabbitMQ——RabbitMQ集群原理

    摘要 主要围绕运维层面展开论述,主要包括集群搭建.日志查看.故障恢复.集群迁移.集群监控这几个方面. RabbitMQ集群搭建 如果RabbitMQ 服务器遇到内存崩溃.机器掉电或者主板故障等情况,该 ...

  5. RabbitMQ集群/监控/Federation/Shovel

    RabbitMQ运维 集群搭建 单台RabbitMQ服务器可以满足每秒1000条的消息吞吐量 RabbitMQ集群不能保证消息的万无一失,即使将消息.队列.交换器等都设置为可持久化,生产端和消费端都正 ...

  6. hbase1.1.1 连接集群_除了HAProxy,RabbitMQ集群还可以这样用

    全网最简单的安装手册 // 安装erlang wget https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm. ...

  7. RabbitMQ—集群原理

    RabbitMQ本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的erlang.cookie来实现).因此,RabbitMQ天然支持集群,但不支持负载均衡 ...

  8. RabbitMQ集群、镜像部署配置

    2019独角兽企业重金招聘Python工程师标准>>> 1   RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端, ...

  9. Rabbitmq集群高可用部署详细

    清风万里的季节,周末本该和亲人朋友一起消遣这烂漫的花花草草,或是懒洋洋的晒个太阳听听风声鸟鸣.无奈工作使然,理想使然,我回到啦公司,敲起啦键盘,撸起啦代码,程序狗的世界一片黯然,一片黯然,愿天下所有努 ...

最新文章

  1. ActiveMQ常见问题
  2. 使用Crypto++的AES GCM对称加密
  3. 不重复,distinct
  4. Spring在Java Filter注入Bean为Null的问题解决
  5. python统计词频_Python中文分词及词频统计
  6. jQuery 学习-样式篇(四):jQuery 设置和删除元素的属性
  7. oracle中没有修改权限,oracle 修改listener.ora 没有权限怎么办
  8. 尽量用iterator代替const_iterator
  9. 【语音采集】基于matlab GUI语音信号采集【含Matlab源码 291期】
  10. 侠客X部分截图 官方论坛开发注册 邀您一起公测。
  11. LLDP发现相邻设备失败分析
  12. 中兴路由器查看时间_中兴路由器的设置方法教程
  13. SPSS 中介效应检验(图文+数据集)【SPSS 043期】
  14. flink-metric原理与实战
  15. 统计学习方法总结、应用对比
  16. 2022年双非计算机保研经历分享(浙大、北航、中科院等)
  17. proxmox PVE 安装 黑苹果
  18. 重装系统(纯净系统)win7/win10
  19. 基于FPGA的4位减法器设计及仿真代码
  20. Python爬虫(二十二)_selenium案例:模拟登陆豆瓣

热门文章

  1. Recommend索引
  2. UA MATH574M 统计学习 Variable Selection:Cross Validation
  3. 超图三维服务学习摘要1
  4. 一个web左侧菜单例子
  5. 移动端调用电话、短信、唤起QQ和使用百度地图
  6. lockfree buffer test
  7. viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
  8. scrollBarStyle- listview滑动条调整
  9. 全面分析 Spring 的编程式事务管理及声明式事务管理(转)
  10. python判断哪个数最小_怎么用python比较三个数大小