rabbitmq 学习与实践分享(3)

一.前言

以前rabbitmq学习与实践分享(2)中主要谈到了rabbitmq提供的一些手段和机制来从生产端,消费端以及broker端保证消息机制的可靠性。可是没有考虑到单点故障以及broker如何抗住高负载,来保证消息中间件的高可用性。本文主要结合本身的理解谈论这个问题。node

rabbitmq 提供高可用性的机制主要有如下2种手段:app

  • 集群
  • 镜像队列

二.rabbitmq 集群:

rabbitmq 的集群有如下几个特色:运维

  • rabbitmq 集群的全部节点都会备份元数据信息,可是不会备份消息。备份的元数据信息包括:
    • 1)队列的元数据:好比队列的名称,属性;
    • 2)交换器:好比交换器的名称,属性;
    • 3)绑定关系的元数据:交换器之间的绑定关系,以及交换器与队列之间的绑定关系;
      1. vhost 的元数据;

rabbitmq 集群中建立队列,只会在单个节点,而不是全部节点上建立队列的进程并包含队列的完整消息(元数据,状态,内容)。建立队列进程的节点称为宿主节点,该节点知道队列的全部信息,其余的节点仅仅知道队列的元数据信息以及包含指向这个宿主节点的指针。 因此若是这个宿主节点因某种缘由出现宕机时,该节点中的消息会丢失。固然后面介绍的镜像队列能够解决这种状况出现的消息丢失问题。学习

rabbitmq 集群的搭建:

rabbitmq集群的搭建过程偏运维,此处就不作介绍了,涉及到相关的命令以下:spa

具体命令的用法以及相关含义,后面章节再单独介绍。

rabbitmq集群节点的类型:

  • 内存节点:将全部队列,交换器,绑定关系,vhost的用户,权限等等元数据信息都存储在内存里。
  • 磁盘节点: 指上述元数据信息存储在磁盘里。 为了确保节点重启以后,元数据信息不会丢失,单节点的集群节点只能是磁盘节点,多节点的集群中必须有一个节点是磁盘节点。
    如图:上面disc 表示是磁盘节点;ram 表示是内存节点; 若是有新的队列,或者交换器建立的时候,须要先通知磁盘节点进行保存,若是一个集群中只有一个磁盘节点,而且不幸宕机了,那么该集群只能收发消息,不能进行任何新的变动操做(好比建立新的队列)了。

镜像队列

镜像队列的机制主要做用就是经过冗余队列中的消息,来避免集群中宿主队列宕机时致使的消息丢失问题。引入镜像队列机制,经过将队列镜像到其余的broker节点上,对一个宿主队列(master)配置多个slave节点,从而提高可用性。指针

针对镜像队列而言:全部的操做(除了消息发送)都是先应用到队列的主节点,而后经过主节点传播到镜像队列的从节点的,当主节点宕机时,最老的从节点会自动晋升成为新的主节点.

镜像队列的配置是经过policy 设置的:
  rabbitmqctl set_policy -p vhost [ --priority priority ] [--apply-to apply-to] name pattern {definition} 
复制代码

参数简要介绍:pattern 指要匹配的队列模式 definition 包含3个部分:code

  • ha-mode :指定镜像队列的模式,有如下几个取值:all 表示在全部的节点上进行镜像;exactly 表示在指定数量的节点上进行镜像,具体几个节点经过ha-params参数指定;nodes 指定节点名称列表。
  • ha-params:指定不一样的ha-params 用到的参数;
  • ha-sync-mode:镜像同步模式,分为automatic(自动)和手动(manual). 手动的操做能够经过rabbitmqctl sync_queue 命令完成。

小结

本文主要简要的介绍了一下rabbitmq 如何提高可用性来保证消息不丢失的。可是在实际生产环境,面对突发的流量的时候,rabbitmq 如何能扛住呢,有没有什么机制能够实现呢,好比流控? 这块内容在下一小节继续分享。cdn

相关文章
相关标签/搜索