RabbitMQ 默认的集群模式,也就是普通模式,最大的问题就在于存储队列完整数据的节点一旦宕机,

如果是非持久化队列,则消息丢失;如果是持久化队列+持久化消息,则必须等该节点恢复.

所以后来 RabbitMQ 开始支持队列(完整数据)复制.比如在有5个节点的集群里,可以指定某个队列的完整数据在2个节点上进行存储,从而在性能与高可用之间取得一个平衡,这就是镜像模式,它属于 RabbitMQ 的HA方案.

镜像模式解决了普通模式的问题,消息实体会主动在镜像节点间同步,而不是在消费者获取数据的时候临时从其他节点拉取.当然,该模式的副作用也很明显:

  • 消息需要复制到每一个节点,对于持久化消息,网络和磁盘同步复制的开销都会明显增加;
  • 如果镜像队列数量过多,大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉.

所以镜像模式适合在对可靠性要求较高的场合中使用.

综上所述,镜像模式的实质是镜像队列,一个队列想做成镜像队列,需要先设置 policy,然后客户端创建队列的时候,RabbitMQ 集群根据“队列名称”自动设置是普通集群模式或镜像模式.

下面我们通过管理后台将前面搭建的单机集群模式修改成镜像模式.

搭建步骤

第一步

第二步

  • Virtual host : 虚拟主机.
  • Name : 策略名称.
  • Pattern : ^ 表示匹配所有队列名称.
  • Apply to : 这里选择的是同时应用到交换机和队列.
  • ha-mode 和 ha-params 见下表(原贴:http://www.ywnds.com/?p=4741)

然后我们可以看到,该虚拟主机下面的交换机和队列都被打上了 test_mirror 标签

+1 表示有1个镜像节点.

进入该队列详情,可以清晰的看到 : 策略名称,队列的主节点以及镜像节点等.

验证功能

将就上一篇普通集群的代码.

1.生产者连接到 node1 (5672) 发送消息,然后关闭 node1.

通过 node2 的管理后台可以看到队列依然在.

但是有个细节,Node 从 rabbit1@node1 变成了 rabbit2@node2.

进入该队列详情,主节点已经变成了 rabbit2@node2 , 而镜像节点是空.

2.消费者连接到 node2 接收消息

一切正常.

3.重新启动 node1

可以看到,队列的主节点没有还原回去.

关于 HA sync mode,HA mirror promotion on shutdown,HA mirror promotion on failure  的测试

一.HA sync mode

该参数有两个值:

  • manual : 手动模式(默认值)
  • automatic : 自动模式

手动模式下,新加入的节点不会同步老节点的队列(及消息).测试如下:

1.我们先往"test_queue"队列添加10条消息.

2.新增节点 node3

3.这时候我们再看管理后台,多了1个红色的"+1",这个"+1"表示有一个节点没有同步该队列的数据.

我们进入该队列查看详情:

可以看到,有个"同步"的按钮.我们可以手动同步.

如果我们把10条消息消费掉后,系统也会认为数据同步了,因为3个节点的数据一样了.这时候红色的"+1"就会消失,而之前的蓝色"+1"变成了"+2".

自动模式的测试结果就不上图了.

二.HA mirror promotion on failure

该参数有两个值 :

  • when-synced
  • always (默认值)

默认值为 "always" ,如果队列主节点发生故障,断开连接或者从群集中删除了,则最早的镜像节点将被提升为新的主节点.但是在某些情况下,此镜像节点可能没有同步数据,这将导致数据丢失.

"when-synced" ,意味着当队列主节点发生故障的时候,队列将变得不可用,直到主节点恢复.如果队列主节点永久丢失,除非将队列删除(同时会删除其所有内容)并重新声明,否则该队列将永不可用;

这相当于通过降低安全性(将非同步镜像节点升级为主节点),从而增加对队列主机可用性的依赖,因为有时候队列可用性比数据一致性更重要.

三.HA mirror promotion on shutdown

该参数也有两个值 :

  • when-synced  (默认值)
  • always

该参数的默认值为 "when-synced", 如果队列主节点关闭了(即显式停止RabbitMQ服务或关闭操作系统),那么所有节点上的该队列都将关闭.

"always" 意味着如果队列主节点关闭了,可以提升一个未同步的节点为新的主节点,以避免数据丢失.

但是,如果 HA mirror promotion on failure 的值为 "when-synced" ,即使 HA mirror promotion on shutdown 的值为 "always" ,也不会提升未同步的节点.这意味着如果队列主节点发生故障,队列将在主节点恢复之前变为不可用.如果队列主机永久丢失,除非将队列删除(也将删除其所有内容)并重新声明,否则该队列将不可用.

测试

1.删除之前创建的 node2,node3,只保留 node1;

2.删除原来的策略,重新建了一个,并且 HA sync mode ,HA mirror promotion on failure 和  HA mirror promotion on shutdown 3个参数都未设定,即都使用默认值;

3.发送10条消息;

4.新建 node2,并加入集群.

目前该队列情况如下:node1 是队列主节点,并且 node2 尚未同步数据.

5.停止 node1, 即停止队列主节点 ( rabbitmqctl stop_app )

这时候,该队列变成了不可用,连接 node2 发送消息,接收消息都会失败.

这个结果符合 HA sync mode ,HA mirror promotion on failure 和  HA mirror promotion on shutdown 3个参数默认值的预期.

6.恢复 node1 ( rabbitmqctl start_app ),进入该队列详情,点击 按钮,手动同步一下队列数据,这时候,两个节点的状态是:node1 为队列主节点,node2 已同步数据

7.再次关闭 node1.

从管理后台可以看见,该队列依然可用,并且 node2 被提升成了队列主节点.同样符合 HA mirror promotion on failure 和  HA mirror promotion on shutdown 默认值的预期.

至于将 HA mirror promotion on shutdown 设为 "always ",  HA mirror promotion on failure 设为 "when-synced" 的情况就不再测试了.

内存及硬盘控制(转载)

一.内存控制

vm_memory_high_watermark 该值为内存阈值,默认为0.4.意思为物理内存的40%.40%的内存并不是内存的最大的限制,它是一个发布的节制,当达到40%时Erlang会做GC.最坏的情况是使用内存80%.如果把该值配置为0.将关闭所有的publishing.

Paging 内存阈值,该值为默认为0.5,该值为 vm_memory_high_watermark 的20%时,将把内存数据写到磁盘.

如机器内存16G,当 RabbitMQ占用内存1.28G(16*0.4*0.2)时会把内存数据放到磁盘.

二.硬盘控制

当RabbitMQ的磁盘空闲空间小于50M(默认),生产者将被BLOCK.如果采用集群模式,磁盘节点空闲空间小于50M将导致其他节点的生产者都被block,可以通过 disk_free_limit 来对进行配置.

原贴:http://www.ywnds.com/?p=4741

HAProxy1.7.8 负载均衡

在某网站下载了一个 window 可以用的版本 haproxy-1.7.8

修改 haproxy.cfg 配置文件

globalmaxconn 15000nbproc  1daemondefaultsmode tcpretries 3option  abortonclosemaxconn 2000timeout connect 300000mstimeout client  300000mstimeout server  300000mslog 192.168.1.5   local0 errlisten RabbitMQbind 192.168.1.5:8848mode httpbalance roundrobinserver node1 192.168.1.5:5672 weight 1 maxconn 2000 check inter 5s rise 1 fall 3  server node2 192.168.1.5:5673 weight 1 maxconn 2000 check inter 5s rise 1 fall 3         listen statusbind 192.168.1.5:1188mode http                  stats refresh 30sstats uri  / stats auth admin:admin#stats hide-versionstats admin if TRUE

转载于:https://www.cnblogs.com/refuge/p/10359539.html

RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡相关推荐

  1. RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成负载均衡组件 Ha-Proxy_02

    服务器IP hostname 节点说明 端口 管控台地址 账号 密码 192.168.0.115 mq-01 rabbitmq master 5672 http://192.168.0.115:156 ...

  2. 分布式进阶(十九) 基于集群的动态反馈负载均衡策略

    一.动态WRR调度算法 这是一个目前普遍使用的调度算法,算法在WRR的基础上加入了根据服务器端的负载信息周期性地调整服务器性能权值的过程.其基本思想是:根据CPU利用率.内存利用率.磁盘使用情况.连接 ...

  3. 《Reids 设计与实现》第十五章 集群(中)

    <Reids 设计与实现>第十五章 集群(中) 文章目录 <Reids 设计与实现>第十五章 集群(中) 四.在集群中执行命令 1.计算键属于哪个槽 2.判断槽是否由当前节点负 ...

  4. ttlsa教程系列之MySQL---MySQL/Galera集群-多主高可用性负载均衡

    为什么80%的码农都做不了架构师?>>>    ttlsa教程系列之MySQL ---- MySQL/Galera集群-多主高可用性负载均衡 Percona和MariaDB发布版本中 ...

  5. 集群、分布式、负载均衡区别

    集群.分布式.负载均衡区别 参考:http://virtualadc.blog.51cto.com/3027116/615836" 集群 集群的概念 计算机集群通过一组松散集成的计算机软件和 ...

  6. 集群、分布式、负载均衡区别(转)

    集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接, ...

  7. 集群、分布式、负载均衡

    一. 集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网 ...

  8. 集群、分布式、负载均衡区别与联系

    1.Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群)(下面只介绍负载均衡集群)  负载均衡集群(Load Balance Cluster)  负载均衡系统:集群中所有的节点都 ...

  9. emq集群配置nginx做负载均衡

    emq集群配置nginx做负载均衡 创建 EMQ X 节点集群 emqx 集群搭建 例如: 节点 IP 地址 emqx@192.168.1.17 192.168.1.17 emqx@192.168.1 ...

最新文章

  1. DATEIF实例说明3
  2. 吃透这套架构体系,三年成为架构师!
  3. iOS开发 nil Nil NULL NSNull 的使用
  4. grafana—— worldPing APP 中文
  5. Jquerymobile 简单安装
  6. 北京供销大数据集团发布SinoBBD Cloud 一体化推动产业云发展
  7. 【数据库题型大总结】应用题总结
  8. python websocket爬虫_Python如何爬取实时变化的WebSocket数据
  9. 实用免费的SNMP网管工具-sugarnmsTool
  10. Python | 类和对象
  11. java layout各布局_java-Layout(布局管理器)
  12. mysql同时满足升序和降序_mysql升序和降序语句
  13. 【C语言】C语言中基础操作符详细讲解
  14. “L2TP 链接尝试失败,因为安全层不能与远程计算机协商兼容的参数”解决方案
  15. KMIP协议/TTLV格式解码
  16. 阿里云硬盘挂载与扩容
  17. ppt打不开,显示发现文件中的内容有问题。尝试修复此演示文稿无果!
  18. 2021双十一自动浏览脚本,京东淘宝自动化脚本末班车
  19. 配置Cross-Origin的几种方法
  20. 正在使用计算机突然停电怎么办,电脑突然断电怎么办?电脑突然断电开不了机解决教程...

热门文章

  1. python编程快速入门例子-清华大学出版社-图书详情-《Python编程入门与案例详解》...
  2. python图片-Python图像处理
  3. python语言入门书籍-Python入门书籍有哪些?
  4. python安装numpy-Python使用pip安装Numpy模块
  5. python动态图-Python处理gif动态图的解析与合成操作的介绍
  6. python散点图点的大小-Java 学习之路
  7. python装饰器实例-Python装饰器实用例子
  8. python爬虫赚钱的经历-十年真ㆍPython大佬用爬虫赚钱的自述!看完学到了!
  9. python中处理日期和时间的标准模块是-2019python常见的170道面试题解析
  10. python 程序流程控制结构-python之流程控制语句