前言:在讲集群高可用之前,先讲两个问题:
一,RabbitMQ消息可靠性传输
1,队列持久化
2,消费端的手动Basic.Ack应答机制
3,发送端事务确认机制
异步消息应答确认机制:发送到交换机时的确认,投递到队列后的确认。
二、RabbitMQ公平性的保证
1,单生产者单消费者可以保证消息的顺序可达性
2,使用的生产者的确认机制后因为消息的发送是异步的,每一个线程执行执行不同,则 无法保证消息达到Broker的的前后顺序
3,生产端使用事务机制可以保证消息的顺序性
4,消费端采用单消费者保证消息消费的顺序性
三、RabbitMQ集群保证高可用
1,原理:
注意:
1)集群只会在单个节点而不是所有的节点上创建队列的进程并包含完整的队列消息,这样只有队列的宿主节点即所有者节点知道队列的所有信息,其他非所有者节点只知道队列的元数据和指向该队列存储在那个节点的指针。
2)节点有磁盘节点和内存节点,集群中建议需要保证有两个磁盘节点保证可靠性,其余可以设置为内存节点保证效率。
2,集群的负载均衡
负载均衡层的软件是HAProxy,为了保证负载均衡层的高可用,我们需要使用到Keepalived软件,使用vrrp协议产生虚拟ip实现动态的ip漂移。
keepalived是以VRRP协议为实现基础的,VRRP即虚拟路由冗余协议。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会定义向backup发送vrrp协议数据包, 当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
由于我们的虚拟IP是在Docker中产生的,而我们的应用程序是基于windows平台开发的,因此是无法直接使用docker容器中的虚拟ip,我们需要在宿主机上安装keepalived,让keepalived产生虚拟服务,后期我们访问HAProxy的时候,直接通过宿主机的虚拟服务去访问即可。
3,RabbitMQ的镜像集群。
如果集群中的一个节点失效了,队列能自动的切换到镜像中的另一个节点上保证服务的可用性。工作模式如下:
除发送消息(Basic.Publish)外的所有动作只会向master发送,然后master将命令的执行结果广播到各slave.如果消费者与slave建立订阅消息,slave会将请求转发,实际上也是消费的master的数据。