目标
- 搭建一款三节点的Rabbitmq服务集群,满足高可用的要求
- 要求高可用,保活,镜像队列,负载均衡。
主要组件
- RabbitMQ 用于存储转发消息及镜像队列,
- HAProxy 用于负载均衡到达rabbitmq的流量,
- Keepalived 用于保活HAProxy(也可以保活rabbitmq),并对外提供VIP用于访问。
- 下载地址
- RabbitMQ
- HAProxy
- KeepAlived
架构模型
访问链路
图片选自:RabbitMQ负载均衡(3)——Keepalived+HAProxy实现高可用的负载均衡
- 客户端通过VIP建立通信链路;通信链路通过Keeaplived的Master节点路由到对应的HAProxy之上;HAProxy通过负载均衡算法将负载分发到集群中的各个节点之上。
- 正常情况下客户端的连接通过图中左侧部分进行负载分发。
- 当Keepalived的Master节点挂掉或者HAProxy挂掉无法恢复,那么Backup提升为Master,客户端的连接通过图中右侧部分进行负载分发
选型原因
- 为什么要搭建多节点的消息队列?
单节点rabbitmq存在宕机风险,因此需要搭建三台互相备份
- 如何做到消息镜像的?
镜像其实是一种策略,首先是将三台rabbitmq设置为集群,然后开启镜像策略,使得消息传递到一个队列时,会自动拷贝到其他镜像的队列。
- 如果某一台接受到的压力过大,如何做到负载均衡?
rabbitmq集群本身不具备负载均衡的功能,需要配合其他软件使用,比如HAProxy,同样的道理,为了防止出现宕机问题,需要在集群中配置多台HAProxy。
- 如果HAProxy宕机了,另外一台如何感知?并切换流量请求?
HAProxy在宕机时,keepalived有保活脚本,大概意思就是发现keepalived发现HAProxy不存在,就会启动它,过三秒发现还是没启动,那就关闭它,关闭它的时候,会触发vip漂移到另外一台上。
HAProxy 之间需要能够自动进行故障转移,通常的解决方案就是 KeepAlived。KeepAlived也是两台,一主一从,对外提供vip,主机宕机,从机会接管vip(具体见文末的彩蛋2)。
- 本案例中选取了两台HAProxy做负载均衡,负载方式是每台HAProxy都负载三台Rabbitmq,还是每台负载其中的两台?
负载均衡三台。满足极端情况下的高可用。
- 万一有一台Rabbitmq挂了,那么HAProxy是否还会向其发送消息导致消息丢失?
HAProxy的.cfg文件中定义的有健康检查机制,参数fall在指定多少次不成功的健康检查后,认为该服务宕掉了。
配置文件中:server node3 hadoop003:5672 check inter 5000 rise 2 fall 3 weight 1,这里的rise 2 fall 3 就是用于判断死活的。
haproxy健康检查rabbitmq,keepalived的ha_check.sh脚本检测haproxy
- 如果keepalived挂了,另一台keepalived如何work?
这个问题我没有仔细研究,应该是两台keepalived互相有心跳保活,主机宕机,从机会立刻抢占vip.
简易搭建流程
- 第一步:分别在不同虚拟机上安装RabbitMQ
- 第二步:验证RabbitMQ安装成功
- 第三步:搭建Rabbit