Loading...
墨滴

lijunsong

2021/05/26  阅读:34  主题:默认主题

Apache Pulsar, RabbitMQ高可用对比

集群下各个节点组件的高可用

  • Pulsar: broker,bookkeeper,zk

zk主要存储broker和bookkeeper的元数据,以及Pulsar集群配置协调工作,bookkeeper做消息的存储,broker做消息的处理计算,存储和计算分离(区别于其他MQ主要的地方),这可为服务层和存储层提供了瞬时的节点扩展和无缝失效恢复功能。

  1. Broker无状态性质使得动态分配成为可能,因为无数据要复制,因此可以根据使用情况快速的扩展或收缩集群

当client 开始使用未分配给任何Broker的Topic时,将触发一个机制:根据负载条件选择最合适的Broker来获取这些Topic的所有权。

由于 Broker 是无状态的,当发生 Topic 的迁移时,Pulsar 只是将所有权从一个 Broker 转移到另一个 Broker,在这个过程中,不会有任何数据复制发生。

  1. BookKeeper集群包括Bookies:一组独立的存储服务器,元数据存储系统:用于服务发现和元数据管理

BookKeeper将数据存储至集群中的节点上,每个BookKeeper节点称为Bookie。

一个Topic由多个Ledger构成,一个Ledger由一个或多个Fragment组成,每个Fragment有多个条目Entry组成,每个Entry上包含的就是多条消息Message。 Fragment是BookKeeper集群中最小的分布单元,Ledger是最小的删除单元。 Topic是Pulsar中的概念。Ledger和Fragment是BookKeeper中的概念。 每个Pulsar Broker都需要跟踪每个Topic所包含的Ledgers和Fragments。这个元数据存储在Zookeeper中。

Fragments分布在Bookie集群中,跨多个Bookies带状分布。存储可以单独扩展。如果存储是瓶颈,那么只需要添加更多的Bookies,他们会自动承担负载,不需要Rebalance。 当Bookie不可用时,自动恢复模式将自动进行数据重新复制到其他的Bookies。

BookKeeper 通过 Quorum Vote 的方式来实现数据的一致性,跟 Master/Slave 模式不同,BookKeeper 中每个节点也是对等的,对一份数据会并发地同时写入指定数目的存储节点。对等的存储节点,保证了多个备份可以被并发访问;也保证了存储中即使只有一份数据可用,也可以对外提供服务。

  1. ZooKeeper 集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都会互相保持通信。

只要集群中存在超过一半的机器能够正常工作,那么整个集群就能够正常对外服务。 基于这个特性,如果想搭建一个能够允许 N 台机器 down 掉的集群,那么就要部署一个由 2*N+1 台服务器构成的 ZooKeeper 集群。因此,一个由 3 台机器构成的 ZooKeeper 集群,能够在挂掉 1 台机器后依然正常工作,而对于一个由 5 台服务器构成的 ZooKeeper 集群,能够对 2 台机器挂掉的情况进行容灾。

  • RabbitMQ: rabbitmq-server

RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。 AMQP:Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为 面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言 等条件的限制。 RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可 用性等方面表现不错

  • Exchange(将消息路由给队列 )

目前共四种类型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由键,此外 headers 交换器和direct 交换器完全一致,但性能差很多,目前几乎用不到了

  1. Direct:消息中的路由键(routing key)如果和 Binding 中的 binding key 一致,交换器就将消息发到对应的队列中。它是完全匹配、单播的模式
  1. Fanout:每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的

3. topic 交换器:topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配 0 个或多个单词,匹配不多不少一个单词

  • Virtual Host 虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域
  • Broker 表示消息队列服务器实体
  • Binding(消息队列和交换器之间的关联)
  • Queue 消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走
  • Connection 网络连接,比如一个 TCP 连接
  • Channel 信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的 TCP 连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接
  1. 普通集群模式中,每个RabbitMQ节点都保存队列相同的元数据,但只有一个节点保存队列实际的消息数据

  2. 镜像集群模式中,依赖“镜像队列”功能实现效果:每个RabbitMQ节点既保存队列相同的元数据,又保存队列实际的消息数据

  3. 仲裁队列(3.8版本加入)

lijunsong

2021/05/26  阅读:34  主题:默认主题

作者介绍

lijunsong