RabbitMQ 镜像集群 宕机恢复、负载均衡、跨机房多活
起因:在实际项目开发过程中,需要使用RabbitMQ来实现消息队列的功能,但仅仅实现功能之后并不能对自己满足,既然学一次,就要更深的了解她,吃一吃架构方面的相关内容,提升自己。
RabbitMQ在镜像集群中,机器其实是平行关系,所有的节点都是互相复制的
场景描述:
A是Master
B是Slave
A正常运行,B宕机了,只需要启动B即可,B就会自动加入集群
A和B都宕机了,只要A在B之前启动就可以了
A和B都宕机了,A启动不起来了,即便是B启动了,有可以B直接启动不了啦
B和C都加入了A为Master的集群,这个时候都需要将B和C从A的集群中forget,B和C启动不起来了
RabbitMQv3.2版本以后提供了一个离线清除集群节点的命令参数,也就是节点无法启动状态下
HAProxy是一款提供高可用的负载均衡器(之前大家都是使用的Nginx居多,upstream反向代理实现负载均衡非常容易),HAProxy可以基于TCP四层(Lvs也是TCP四层的),HTTP七层(Nginx是HTTP七层)的负载均衡应用代理软件,免费高速可靠的一种LBS解决方案
HAProxy的并发连接完全可以支持以万为单位的
Nginx
优点:
1、工作在网络7层之上,可针对http应用做一些分流的策略,如针对域名、目录结构,它的正规规则比HAProxy更为强大和灵活,所以,目前为止广泛流行。
2、Nginx对网络稳定性的依赖非常小,理论上能ping通就能进行负载功能。
3、Nginx安装与配置比较简单,测试也比较方便,基本能把错误日志打印出来。
4、可以承担高负载压力且稳定,硬件不差的情况下一般能支撑几万次的并发量。
5、Nginx可以通过端口检测到服务器内部的故障,如根据服务器处理网页返回的状态码、超时等,并会把返回错误的请求重新提交到另一个节点。
6、不仅仅是优秀的负载均衡器/反向代理软件,同时也是强大的Web应用服务器。可作为静态网页和图片服务器,在高流量环境中稳定性也很好。
7、可作为中层反向代理使用。
缺点:
1、适应范围较小,仅能支持http、https、Email协议。
2、对后端服务器的健康检查,只支持通过端口检测,不支持url来检测
3、负载均衡策略比较少:轮询、权重、IP_hash、url_hash
HAProxy
优点:
1、HAProxy是支持虚拟主机的,可以工作在4、7层(支持多网段)
2、HAProxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
3、HAProxy跟LVS类似,本身就只是一款负载均衡软件;单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
4、HAProxy支持TCP协议的负载均衡转发,可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。
5、HAProxy负载均衡策略非常多,HAProxy的负载均衡算法现在具体有如下8种
缺点:
1、不支持POP/SMTP协议
2、不支持SPDY协议
3、不支持HTTP cache功能。现在不少开源的lb项目,都或多或少具备HTTP cache功能。
4、重载配置的功能需要重启进程,虽然也是soft restart,但没有Nginx的reaload更为平滑和友好。
5、多进程模式支持不够好
HAProxy+Keepalived(负载均衡节点的高可用)
将上面的配置文件内容放入 /etc/haproxy/haproxy.cfg中
启动HAProxy
启用成功后可以到控制台进行验证
通过federation的配置来进行数据通道搭建
这个时候你需要自己定义一个上游节点upstream(166节点),一个下游节点downstream(167节点),federation是单向发送的,相当于消息发送到upstream的一个exchange上,然后转发到downstream的queue上
1、 在下游节点创建一个exchage和一个queue和binding的routingkey,用来进行数据接收
2、 在下游节点建立federation upstream规则和上游节点进行数据同步
3、 进入下游节点的federation status没有任何数据,需要建立策略来保证通道连通
4、 进入下游节点的Policy菜单,Pattern是个正则表达式,这里表示以down开头的exchange和queue都匹配
5、 这个时候看exchange和queue,规则就应用上了
6、 这个时候去federation status看,发现上游连接已经连接上了
7、 这个时候我们先去看上游的overview
8、 再看上游的exchange和queue就已经根据下游配置的upstream和policy规则将exchange和queue创建好了
灰色的这个重定向exchange不能发送消息,如果要发送则在down-exchange上进行发送
9、 我们在上游的down-exchange发送一条消息,进行测试
可以在下游查看这条消息
10、 因为上游及节点只是一个中转,如果上游及诶单也要消息down-exchange里的消息怎么办?
只需要在本地建立一个binding关系就好
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
脂轰奥亭: 这需要保证很多地方:集群脑裂的处理(partitions)、client端的ha(断线可以选择不同的mq server)、队列ha(mirror)、持久化(persistence).这些设置都不是轻松就能get的,所以建议你最好看看官方这些方面的文档再合理设计部署方案,否则容易出现不稳定,甚至直接导致队列不可用.
龙安区19375452218: 启动rabbitmq服务失败,求助 - ?
脂轰奥亭: 可能是系统有问题了.直接换个验证过的系统盘重装系统就行了,这样就可以全程自动、顺利解决 win7系统中软件无法运行 的问题了.用u盘或者硬盘这些都是可以的,且安装速度非常快.但关键是:要有兼容性好的(兼容ide、achi、Raid模式的安装)
龙安区19375452218: RabbitMQ新连接被拒绝由于线程问题,怎么解决 - ?
脂轰奥亭: 解决办法应该是在finally语句中来执行这些操作,我分析从队列中取出消息后,会有三种处理结果:1、处理成功,这种时候应该用basicAck确认消息;2、可重试的处理失败,这时候应该用basicNack将消息重新入列;3、不可重试的处...
龙安区19375452218: windows下安装rabbitmq出现如下问题 - ?
脂轰奥亭: 任务占坑
龙安区19375452218: 怎么在Ubuntu linux系统上安装和使用RabbitMQ - ?
脂轰奥亭: 首先保证软件包正确,然后解压后依次按下面步骤执行: 打开一个终端,su -成root用户 1>su root 正确切换到root用户,然后进入软件包解压路径 2>cd 软件解压包路径 执行软件解压包路径里的软件安装脚本 3> ./安装脚本
龙安区19375452218: rabbit mq失败后怎么执行下一个队列 - ?
脂轰奥亭: rabbit mq失败后怎么执行下一个队列1、笨拙点方法,就是轮循,consume的阻塞监听可以设置timeout,通过设置一个较小的timeout,可以轮流监听几个channel,变相实现监听多个queue,对性能要求不是很高,可以使用这种方法2、还有个办...
龙安区19375452218: 如何在windows下突破Rabbitmq的socket限制 - ?
脂轰奥亭: 如何在windows下突破Rabbitmq的socket限制 利用Rabbitmq进行各类业务系统(如SAP、OA、EHR、KMS、访客系统、AD等)的集成和接口,已有很长一段时间了,初步建立了企业服务总线(ESB).随着新业务系统的不断接入到ESB中,...
龙安区19375452218: win 7 rabbitmq 需要安装哪些?
脂轰奥亭: 安装 1、Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装RabbitMQ之前要先安装Erlang. 注意: 1.现在先别装最新的 3.6.3 ,本人在安装完最新的版本,queue 队列有问题,降到了 3.6.2 就解决了. 2.默认安装的Rabbit MQ 监听端口是...
龙安区19375452218: 使用 RabbitMQ 为什么有时候会丢数据 - ?
脂轰奥亭: 一般情况下,是配置的原因,应该是你配置了自动确认,又写了代码进行手动确认.当你配置了自动确认时,调用basicConsume方法时rabbitmq服务端返回的确认码不是唯一的,会重复,所以又进行了手动确认,就容易导致消息丢失.如果你用的是java+spring,配置手动确认如下:其中,ackMessageListener是实现了ChannelAwareMessageListener接口的实现类实例.
龙安区19375452218: 如何连接 本地 rabbitmq 服务 - ?
脂轰奥亭: 1、安装 在Mac下安装RabbitMQ是非常简单的,一般默认复RabbitMQ服务器依赖的Erlang已经安装,只需要用下面两个命令就可以完成RabbitMQ的安装(前提是homebrew已经被安装):?brew update brew install rabbitmq 安装完成后需要将/...