RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡
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 配置文件
global
maxconn
nbproc
daemon defaults
mode tcp
retries
option abortonclose
maxconn
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
log 192.168.1.5 local0 err listen RabbitMQ
bind 192.168.1.5:
mode http
balance roundrobin
server node1 192.168.1.5: weight maxconn check inter 5s rise fall
server node2 192.168.1.5: weight maxconn check inter 5s rise fall listen status
bind 192.168.1.5:
mode http
stats refresh 30s
stats uri /
stats auth admin:admin
#stats hide-version
stats admin if TRUE
RabbitMQ (十五) 镜像集群 + HAProxy1.7.8 负载均衡的更多相关文章
- rabbitmq3.6.5镜像集群搭建以及haproxy负载均衡
一.集群架构 后端75.103.69分别是3台rabbitmq节点做镜像集群,前端103用haproxy作为负载均衡器 二.安装rabbitmq节点 参照 https://www.cnblogs.co ...
- LVS集群中的IP负载均衡技术
LVS集群中的IP负载均衡技术 章文嵩 (wensong@linux-vs.org) 转自LVS官方参考资料 2002 年 4 月 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集 ...
- Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx)
Linux 集群概念 , wsgi , Nginx负载均衡实验 , 部署CRM(Django+uwsgi+nginx), 部署学城项目(vue+uwsgi+nginx) 一丶集群和Nginx反向代理 ...
- Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群
Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群 >>>>>>>>>>>> ...
- 转载-lvs官方文档-LVS集群中的IP负载均衡技术
章文嵩(wensong@linux-vs.org) 2002 年 4 月 本文在分析服务器集群实现虚拟网络服务的相关技术上,详细描述了LVS集群中实现的三种IP负载均衡技术(VS/NAT.VS/TUN ...
- RabbitMQ (十四) 普通集群
上篇文章把单机集群搭建好了,可以开始验证普通集群的相关功能了. 我们首先在管理后台(15672,15673 都可以)添加一个用户,并用新用户登录,添加一个虚拟主机 由于是在一台机器上模拟集群,所以我们 ...
- 网站集群架构(LVS负载均衡、Nginx代理缓存、Nginx动静分离、Rsync+Inotify全网备份、Zabbix自动注册全网监控)--技术流ken
前言 最近做了一个不大不小的项目,现就删繁就简单独拿出来web集群这一块写一篇博客.数据库集群请参考<MySQL集群架构篇:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高 ...
- 集群之LVS(负载均衡)详解
提高服务器响应能力的方法 scale on 在原有服务器的基础上进行升级或者直接换一台新的性能更高的服务器. scale out 横向扩展,将多台服务器并发向外响应客户端的请求.优点:成本低,扩展 ...
- 高负载集群实战之lvs负载均衡-技术流ken
lvs简介 LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器. 特点 跨平台:window,linux 作用 实现负载均衡 核心组件 ip_vs:linux的内核功能 ...
随机推荐
- Strand Sort
Strand sort是思路是这样的,它首先需要一个空的数组用来存放最终的输出结果,给它取个名字叫"有序数组" 然后每次遍历待排数组,得到一个"子有序数组",然 ...
- 解决Sourcetree 每次拉取提交都需要输入密码
问题产生背景 客户端领导决定使用http方式拉取和push代码,所以无法使用之前的ssh方式做免密处理 解决办法 方法1:在.git目录中有个config目录,在路径前配置下用户名和密码即可,如下所示 ...
- @JsonField 修改json字段属性名称
在前后端分离的开发方式中,经常会遇到后端字段名称和前端字段名称定义不一致的问题,比如,后端定义的Bean中的字段名称为createAt,而前端用的字段名称为createTime.这种情况下可以通过在前 ...
- idea出现:error:java: Target level '1.7' is incompatible with source level '1.8'.解决办法
当我们开始使用idea的时候,编译jsp程序我们有可能出现编译错误,然而我们的代码又没有什么问题. 解决方法一:我们开始的时候可以通过修改java compiler来解决这样的问题,点击file菜单- ...
- 【BZOJ】1419 Red is good
[算法]期望DP [题解]其实把状态表示出来就是很简单的期望DP. f[i][j]表示i张红牌,j张黑牌的期望. i=0时,f[0][j]=0. j=0时,f[i][0]=i. f[i][j]=max ...
- python进行机器学习(五)之模型打分
一.画出模型的残差值分布情况 #!/usr/bin/python import pandas as pd import numpy as np import csv as csv import mat ...
- Part2-HttpClient官方教程-Chapter5-流利的API
5.1. 易于使用的Facade API 使用之前注意引入相应Jar包或者Maven依赖 <dependency> <groupId>org.apache.httpcompon ...
- mysql 设置字符集
可以用:show create table table_name查看建表信息 也可用: show create database database_name查看建库信息 mysql> creat ...
- static class 和 non static class 的区别
static class non static class 1.用static修饰的是内部类,此时这个 内部类变为静态内部类:对测试有用: 2.内部静态类不需要有指向外部类的引用: 3.静态类只能访问 ...
- 升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch “Xcode” Xcode 插件安装
升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch “Xcode” Xcode 插件安装 A: 升级10.11后Xcode 左上角模拟器选择菜单不在了 ...