一.前言
之前rabbitmq学习与实践分享(2)中主要谈到了rabbitmq提供的一些手段和机制来从生产端,消费端以及broker端保证消息机制的可靠性。但是没有考虑到单点故障以及broker如何抗住高负载,来保证消息中间件的高可用性。本文主要结合自己的理解谈论这个问题。
rabbitmq 提供高可用性的机制主要有以下2种手段:
- 集群
- 镜像队列
二.rabbitmq 集群:
rabbitmq 的集群有以下几个特点:
- rabbitmq 集群的所有节点都会备份元数据信息,但是不会备份消息。备份的元数据信息包括:
- 1)队列的元数据:比如队列的名称,属性;
- 2)交换器:比如交换器的名称,属性;
- 3)绑定关系的元数据:交换器之间的绑定关系,以及交换器与队列之间的绑定关系;
-
- vhost 的元数据;
rabbitmq 集群中创建队列,只会在单个节点,而不是所有节点上创建队列的进程并包含队列的完整消息(元数据,状态,内容)。创建队列进程的节点称为宿主节点,该节点知道队列的所有信息,其他的节点仅仅知道队列的元数据信息以及包含指向这个宿主节点的指针。 所以如果这个宿主节点因某种原因出现宕机时,该节点中的消息会丢失。当然后面介绍的镜像队列可以解决这种情况出现的消息丢失问题。
rabbitmq 集群的搭建:
rabbitmq集群的搭建过程偏运维,此处就不做介绍了,涉及到相关的命令如下:
rabbitmq集群节点的类型:
- 内存节点:将所有队列,交换器,绑定关系,vhost的用户,权限等等元数据信息都存储在内存里。
- 磁盘节点: 指上述元数据信息存储在磁盘里。 为了确保节点重启之后,元数据信息不会丢失,单节点的集群节点只能是磁盘节点,多节点的集群中必须有一个节点是磁盘节点。
镜像队列
镜像队列的机制主要作用就是通过冗余队列中的消息,来避免集群中宿主队列宕机时导致的消息丢失问题。引入镜像队列机制,通过将队列镜像到其他的broker节点上,对一个宿主队列(master)配置多个slave节点,从而提升可用性。
针对镜像队列而言:所有的操作(除了消息发送)都是先应用到队列的主节点,然后通过主节点传播到镜像队列的从节点的,当主节点宕机时,最老的从节点会自动晋升成为新的主节点.
镜像队列的配置是通过policy 设置的:
rabbitmqctl set_policy -p vhost [ --priority priority ] [--apply-to apply-to] name pattern {definition}
复制代码
参数简要介绍:pattern 指要匹配的队列模式 definition 包含3个部分:
- ha-mode :指定镜像队列的模式,有以下几个取值:all 表示在所有的节点上进行镜像;exactly 表示在指定数量的节点上进行镜像,具体几个节点通过ha-params参数指定;nodes 指定节点名称列表。
- ha-params:指定不同的ha-params 用到的参数;
- ha-sync-mode:镜像同步模式,分为automatic(自动)和手动(manual). 手动的操作可以通过rabbitmqctl sync_queue 命令完成。
小结
本文主要简要的介绍了一下rabbitmq 如何提升可用性来保证消息不丢失的。但是在实际生产环境,面对突发的流量的时候,rabbitmq 如何能扛住呢,有没有什么机制可以实现呢,比如流控? 这块内容在下一小节继续分享。