面试题之Rabbitmq的集群镜像

RabbitMQ集群高可用

RabbitMq集群模式分为两种:普通集群;镜像集群模式

普通集群模式

多台机器上启动多个RabbitMQ实例,每个实例中的exchange和queue都包含meta、contents、state等信息,exchange在集群中的每个节点都保存一份数据,但是queue不一样,queue在集群中对于contents只存储一份,其他节点只存储meta信息
也就是说:

  1. 对于publish,客户端任意连接集群的一个节点,转发给创建queue的节点存储消息的所有信息
  2. 对于consumer,客户端任意连接集群中的一个节点,如果数据不在该节点中,则从存储该消息data的节点拉取。
    可见当存储有queue内容的节点失效后,只要等待该节点恢复后,queue中存在的消息才可以获取消费的到

所以这个普通集群比较尴尬了,这就没有什么所谓的高可用性可言了,这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个queue的读写操作。高可用方面就差一点了
面试题之Rabbitmq的集群镜像_第1张图片

镜像集群模式

镜像集群是RabbitMQ高可用的一种模式,相对于普通集群模式,你创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。
这样在单节点失效的情况下,整个集群仍旧可以提供服务。但是由于数据需要在多个节点复制,在增加可用性的同时,系统的吞吐量会有所下降。
在实现机制上,mirror queue内部实现了一套选举算法,有一个master和多个slave。

这样所有的操作都是对mastaer节点操作

  1. 对于publish,可以选择任意一个节点进行连接,rabbitmq内部若该节点不是master,则转发给master,master向其他slave节点发送该消息,后进行消息本地化处理,并组播复制消息到其他节点存储
  2. 对于consumer,可以选择任意一个节点进行连接,消费的请求会转发给master,为保证消息的可靠性,consumer需要进行ack确认,master收到ack后,才会删除消息,ack消息会同步(默认异步)到其他各个节点,进行slave节点删除消息
  3. 若master节点失效,则mirror queue会自动选举出一个节点(slave中消息队列最长者)作为master,作为消息消费的基准参考;在这种情况下可能存在ack消息未同步到所有节点的情况(默认异步)
  4. 若slave节点失效,mirror queue集群中其他节点的状态无需改变。
    面试题之Rabbitmq的集群镜像_第2张图片
    RabbitMQ的三种集群模式
    rabbitmq在高可用HA方面的方案总结

你可能感兴趣的:(MQ)